自製函數請求協助

  •   382 
  • 最後發表   EO  2025 二月 26
EO 發文於   2025/02/21

在手動回測時,我需要找出特定日期所對應的財報,這個函數類似getbaroffset不過是找出多少期數前

的,但是在跑的時候Q1Q3都可以正常找出來,Q2Q4就不行了,不知道為什麼.自製函數如下

input:dateone(numericsimple);

var:DD1(0),DD2(0),DD3(0),counters(0);

 

DD1=(fracportion((floor(dateone/100))/100))*100;

DD2=floor((DD1-0.5)/3)+1;

DD3=floor(dateone/10000)*10000+DD2*3*100+1;

 

for counters = 0 to 100 

begin 

  if DD3 = GetFielddate("資產總額", "Q")[counters] 

  then break;

  counters =  counters+1;

end;

 

datetoquarter = counters;

 

另外更希望能簡化成像GetField("股價淨值比", "D")[20210105]就能找出財報上的數據

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/02/21

比較簡單的處理方式是撰寫函數,傳回某個日期距離現在有幾季或幾個月或幾天,再將此相對距離賦予GetField,以抓取財報資料。假設你的函數名稱是QMD_Diff,有兩個參數(頻率,日期),則

value1=QMD_Diff("Q",20210105);

value2=GetField("資產總額", "Q")[value1];

EO 發文於   2025/02/22

這也是一個很不錯的方法

虎科大許教授 發文於   2025/02/22

//比較好的做法是在呼叫QMD_Diff函數之前,先計算資料最新日期,QMD_Diff函數則多一個最新日期參數,以比較兩個日期差了幾季。

value1=getFieldDate(資產總額", "Q");

value2=QMD_Diff("Q",value1,20210105);

value3=GetField("資產總額", "Q")[value2];

EO 發文於   2025/02/22

目前寫出來像這樣 天數的話就用getbaroffset

input:period("Q",Stringsimple);

input:date1(numericsimple);

 

value1=GetFielddate("資產總額", "Q");

value2=DateValue(value1, "Y");

value3=DateValue(value1, "M");

value4=DateValue(value1, "D");

 

value5=DateValue(date1, "Y");

value6=DateValue(date1, "M");

value7=(floor((value6-0.5)/3)+1)*3;//算出月份是第幾季

value8=DateValue(date1, "D");

 

value10=GetFielddate("月營收", "M");

value11=DateValue(value10, "Y");

value12=DateValue(value10, "M");

 

switch (period)

begin

  case "Q":

    if date1>=value1 then QMD_diff=0 

    else QMD_diff=(value2-value5)*4+(value3-value7)/3;

  

  case "M":

    if date1>=value10 then QMD_diff=0

else QMD_diff=(value11-value5)*12+value12-value6;

  case "D":

    QMD_diff=getbaroffset(date1);

  

end;

 

 

虎科大許教授 發文於   2025/02/22

(1)資產總額不應該寫入函數,這個函數只需要傳回相對位置,可使用在任何getField的數據。

(2)getbaroffset若讀取的資料筆數不夠,計算的結果是錯誤的,應該另行處理。

(3)我的課程有初階、中階、高階三種課程。你的需求是高階的需求,也是我高階課程的範例,滿足這個需求需要撰寫四個函數。不是很容易。

XS小編 發文於   2025/02/26

Hello EO,

 

小編補充,除了用 DateValue 外,您也可以使用 Year / Month 函數搭配 getfielddate 函數,會比較容易找到需要像前幾期。

舉例來說,要計算 20181201 與 現在 差了幾季,可以用:

value1 = getfield("date", "q");

value2 = ((year(value1) - year(20181201)) * 4) + ((month(value1) - month(20181201)) / 3);

來計算,value2就是期數。

  • 按讚來自於
  • tseng2008
發表回覆
Close