您好請問,xs語法中有辦法取出 ,每年的股價高點 / 當年實際認列eps ,讓我算出 當年資金願意追逐的本益比嗎
例如,我想取出過去20年的,每年股價高點 / 當年認列eps 得出一個本益比,然後取出3個最高值 outputfield出來
謝謝
 
        
        您好請問,xs語法中有辦法取出 ,每年的股價高點 / 當年實際認列eps ,讓我算出 當年資金願意追逐的本益比嗎
例如,我想取出過去20年的,每年股價高點 / 當年認列eps 得出一個本益比,然後取出3個最高值 outputfield出來
謝謝
每年股價高點可以使用highY函數。highY(0)代表當年度最高價,highY(1)代表前一年度的最高價。要找出當年度的EPS,可以寫函數,例如epsY,讓epsY(1)代表前一年的EPS。
//函數腳本名稱:epsY
input: Nr(numeric);
epsY=GetField("EPS","Y")[Nr];
教授您好,不好意思,這是可以直接打在選股腳本裡面的嗎,還在學習XS,都是餵chatGPT、還有XQ文章裡面的寫出來的
選股程式碼內容看得懂,但gpt打的這串要如何鑲嵌在下面選股程式碼,或是有哪個文章可以比較好了解呢,謝謝您
(過去20年,每年股價高點/當年認列eps的股價高點本益比,取3個值,以及20年來的股價高點本益比平均值 )
// 函數腳本名稱:epsY
input: Nr(numeric);
epsY = GetField("EPS", "Y")[Nr];
// 主腳本
input: period(20);
// 定義變數來存儲過去 20 年的股價高點和本益比
var: yearlyHighs ;
var: yearlyPEs ;
// 計算過去 20 年的股價高點和本益比
for i = 0 to period - 1 begin
    yearlyHighs[i] = HighY(i); // 取得第 i 年的最高價
    var eps = epsY(i); // 取得第 i 年的 EPS
    if eps <> 0 then
        yearlyPEs[i] = yearlyHighs[i] / eps; // 計算本益比
    else
        yearlyPEs[i] = 0; // 若 EPS 為 0 或無資料,本益比設為 0
end;
// 找出最高的 3 個本益比
var: topPEs ;
var: tempPEs ;
array.copy(tempPEs, yearlyPEs);
for i = 0 to 2 begin
    topPEs[i] = array.max(tempPEs);
    tempPEs[array.index_of(tempPEs, topPEs[i])] = 0; // 將已經找到的最大值設為 0,以便找到下一個最大值
end;
// 計算 20 年的平均本益比
var: sumPE(0), countPE(0);
for i = 0 to period - 1 begin
    if yearlyPEs[i] <> 0 then begin
        sumPE = sumPE + yearlyPEs[i];
        countPE = countPE + 1;
    end;
end;
var: avgPE(0);
if countPE <> 0 then
    avgPE = sumPE / countPE;
// 輸出結果
print("過去 20 年每年的股價高點與本益比:");
for i = 0 to period - 1 begin
    print("第 ", period - i, " 年 - 最高價: ", yearlyHighs[i]:0:2, ", 本益比: ", yearlyPEs[i]:0:2);
end;
print("最高的 3 個本益比:");
for i = 0 to 2 begin
    print("第 ", i + 1, " 高本益比: ", topPEs[i]:0:2);
end;
print("過去 20 年的平均本益比: ", avgPE:0:2);
目前在用的這段選股程式碼
-----------選股程式碼------------
input:peraito(10,"預估本益比上限");
// 最近三期月營收加總除以3,得到平均值
value1 = summation(GetField("月營收", "M"), 3) / 3;    
value3 = GetField("本期稅後淨利","Q"); //單位百萬
value4 = GetField("營業利益率","Q");
value5 = GetField("最新股本"); //單位:億元
value8 =GetField("股東權益總額","Q") / (value5 *10); // 股價淨值(股東權益 / 流通在外股數)
condition1 = false;
condition2 = false;
if value5 <> 0 then
    value6 = (value1 * value4 * 12) / (value5 * 100) * 10; //單月營收推估的"本業EPS",(營收*營業利益率*12) / 流通在外股數
if value6 <> 0 then 
    value7 = close / value6;
if value7 < peraito and value7 > 0 and value3 > 50 then
    ret = 1;
outputfield(1, value7, 0, "推估本益比(PE)", order := -1); //收盤價 / 推估EPS
outputfield(2, value6, 2, "推估EPS"); //當月營收*營益利益率(資料)*12 / 最新股本
outputfield(3, value3, 2, "本期稅後淨利(百萬)"); 
outputfield(4, GetFieldDate("本期稅後淨利", "Q"), 0, "本期稅後淨利日期");
outputfield(5, value1, 2, "平均最新3個月營收(億)"); // 最近三個月的月營收平均值
outputfield(6, GetFieldDate("月營收", "M"), 0, "最新月營收月份");
outputfield(7, GetField("月營收年增率", "M"), 2, "月營收YOY%");
outputfield(8, value4, 2, "營業利益率(%)");
outputfield(9, GetFieldDate("營業利益率", "Q"), 0, "營業利益率日期");
outputfield(10, value5, 2, "最新股本(億)");
outputfield(11, GetFieldDate("最新股本", "D"), 0, "股本日期"); // 股本日期
outputfield(12, value8, 2, "每股淨值"); 
            setbarfreq("Y");
input: length(10,"年度");
settotalBar(length);
array: Arr[](0);
Array_SetMaxIndex(Arr, length);
if symbol="2330.TW" then
begin
if epsY(length-currentBar)>0
then Arr[length-currentBar]=HighY(length-currentBar)/epsY(length-currentBar)
else Arr[length-currentBar]=0;
if currentBar=length then ret=1;
end;
outputField1(highestarray(Arr,length),"最高價本益比");
outputField2(Array_Sum(Arr, 1, length)/length,"平均本益比");
教授您好不好意思,我想請問legnth值設定為10,讀取10年迴圈
那有辦法做到宣告,讓<length值的公司,依照個別成立年限讀取該最大值迴圈資料呢,謝謝您
setbarfreq("Y");
input: length(10, "年度"); // 設置年度的長度
settotalBar(length);// 設置總K棒數量
array: Arr[](0);// 宣告並初始化數組
Array_SetMaxIndex(Arr, length);// 設置數組的最大索引
var: epsY(0); // 宣告並設定 epsY 為年度 EPS 數據
epsY = GetField("EPS", "Y");
// 移除對單一股票的限制 if symbol="2330.TW" then
begin
// 檢查 EPS 是否大於零
if epsY[length - currentBar] > 0 then
// 計算本益比
Arr[length - currentBar] = HighY(length - currentBar) / epsY[length - currentBar]
else
Arr[length - currentBar] = 0;
// 檢查是否已經計算到指定的年度長度
if currentBar = length then
ret = 1;
end;
// 輸出計算結果
outputField1(highestarray(Arr, length), "最高價本益比");
outputField2(nthhighestarray(Arr, length, 2), "第二高價本益比");
outputField3(nthhighestarray(Arr, length, 3), "第三高價本益比");
outputField4(Array_Sum(Arr, 1, length) / length, "平均本益比");
好的明白,謝謝許教授,感謝您熱心解惑
8 評論