每年股價高點、當年EPS,請問有這類函數嗎

  •   438 
  • 最後發表   Aaron168  2024 五月 23
Aaron168 發文於   2024/05/16

您好請問,xs語法中有辦法取出 ,每年的股價高點 / 當年實際認列eps  ,讓我算出 當年資金願意追逐的本益比嗎

 

例如,我想取出過去20年的,每年股價高點 / 當年認列eps 得出一個本益比,然後取出3個最高值 outputfield出來

謝謝

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/05/16

每年股價高點可以使用highY函數。highY(0)代表當年度最高價,highY(1)代表前一年度的最高價。要找出當年度的EPS,可以寫函數,例如epsY,讓epsY(1)代表前一年的EPS。

//函數腳本名稱:epsY

input: Nr(numeric);

epsY=GetField("EPS","Y")[Nr];

Aaron168 發文於   2024/05/17

教授您好,不好意思,這是可以直接打在選股腳本裡面的嗎,還在學習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);

 

Aaron168 發文於   2024/05/17

目前在用的這段選股程式碼

-----------選股程式碼------------



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, "每股淨值"); 

虎科大許教授 發文於   2024/05/17

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,"平均本益比");

  • 按讚來自於
  • orca9998
Aaron168 發文於   2024/05/18

教授您好不好意思,我想請問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, "平均本益比");

虎科大許教授 發文於   2024/05/19

XQ提供的資料沒有那麼多。以台積電而言,你只能查到這12年以來的EPS資料,更早的查不到。另外,我們已將epsY定義為函數,不能再將它宣告為變數。

  • 按讚來自於
  • orca9998
Aaron168 發文於   2024/05/19

好的明白,謝謝許教授,感謝您熱心解惑

XS小編 發文於   2024/05/23

Hello Aaron168,

 

小編補充,在選股腳本中可以使用 GetFieldStartOffset 來取得使用欄位目前有的資料長度。

 

感謝 虎科大許教授 的熱心回覆。

發表回覆
Close