計算除權息日後幾日的日期錯誤問題

  •   303 
  • 最後發表   charlie1234  2022 一月 06
charlie1234 發文於   2021/12/25

小幫手好

我用下面的程式碼嘗試找出上上次除權息後5日的日期,大部分都能正確抓到,但發現有些日期就非常奇怪

像是廷鑫,除權息日20200916,除權息日後5日變成20210916

吉祥全更誇張,除權息日寫20010911,除權息日後5日變成20210902

且我另一個相同output寫法的選股腳本,發生有日期錯誤的問題,但在下面那個腳本,日期卻是正確的怪事

請小幫手協助

謝謝

settotalbar(600);

if date<>date[1] then ret=1;

outputfield(1,GetField("除息日期")[1],"除息日1"); 
outputfield(2,date[getbaroffset(GetField("除息日期")[1])-4],"除息五天後日期");

 

排序方式: 標準 | 最新
charlie1234 發文於   2021/12/25

再一個問題,用下面的程式碼,改用除"權息日",發現除了還是有上面的錯誤之外

部分最新的除權息日,竟然會早於上一個除權息日,真的很神奇

檢查了下,應該是除權息日不在同一天造成的

舉兩個例子

聯華,除息日為20210422, 除權日為20210924,

亞航,除息日為20211008, 除權日為20211130

兩檔股票的除權日都是晚於除息日

但不知為何 GetField("除權息日期")[0]是抓比較早發生的除息日,GetField("除權息日期")[1],卻是抓比較後發生的除權日

 

settotalbar(600);

if date<>date[1] then ret=1;

outputfield(1,GetField("除權息日期")[1],"上上次除息日"); 
outputfield(2,date[getbaroffset(GetField("除權息日期")[1])-4],"除息五天後日期");
outputfield(3,GetField("除權息日期")[0],"最近的除權息日");

if GetField("除權息日期")[0]<GetField("除權息日期")[1] then value1=1 else value1=0;

outputfield(4, value1,"[0]日期早於[1]");

 

XQ小幫手 發文於   2021/12/30

Hello charlie1234,

 

1.

小幫手測試過確實會發生您所說的情況,會請工程師協助確認問題原因。

 

2.

會發生這樣的狀況是因為這邊是用除權息日公佈的時間來作排序,而不是以實際除權息日來作排序。

此狀況目前相關人士已經有在追蹤。

XQ小幫手 發文於   2021/12/30

Hello charlie1234,

 

與工程師確認後,以2358.TW為例,發生此問題的原因為 GetField("除息日期")[1] 要到 2021/09/13 這一天才會有2筆除息日期可以使用。

換句話說,再往前的日期 GetField("除息日期")[1] 就會出錯,導致 getbaroffset 無法取得正確的相對位置。

您可以用其他的寫法達到相同的效果,舉例來說:

if date<>date[1] then ret=1;

outputfield(1,GetField("除息日期")[1],"除息日1");

 

value1 = GetField("除息日期")[1];

value2 = 0;

while date[value2] > value1 begin

    value2 += 1;

end;

 

outputfield(2,date[value2-4],"除息五天後日期");

charlie1234 發文於   2021/12/30

小幫手好

感謝您提供的寫法,可以正確顯示了,但還是覺得您的說明不是很合理,無法理解為何原本的寫法就不行

1. 我的回測設定基準日期是12月,大部分股票都除息完了,所以第二筆除息日期也都有了,不會有您說的GetField("除息日期")[1]出錯的問題,

2. 且在選股時,不就是看我是採用哪一天當基準點做選股,把現在最新有的值當[0],不是嗎? 怎會有一定要到某一天才會有兩筆 

3. 而且, 從第一張圖可以看出,[1]的日期都能正確抓到的,可證明第二筆除息日期沒有問題

4. 既然[1]的日期都能抓到了,表示您說的[0]的錯誤問題並無發生,沒有錯誤,所以getbaroffset就應該能用[1]的日期算出距現在幾根K棒了,不是嗎? 

5. 且大部分[1]發生在2020年的也都能抓到後5天的日子,那又是怎回事呢? 如果您上面的說法的對的,那應該大部分2020除息的股票都該出現這樣的錯誤才是,怎會有的對,有的錯呢?

6. 我用getbaroffset的寫法,是希望能正確的在N個交易日後出場,小幫手改寫的寫法,會因為有時會遇到周末、連假造成實際並沒有經過N個交易日就出場

7. 如果getbaroffset在使用時,需要注意到這些,那是否在函數說明也應該加註呢? 畢竟這跟一般人所想的是很不同的

再麻煩小幫手協助了解下,謝謝

XQ小幫手 發文於   2022/01/04

Hello charlie1234,

 

小幫手以2358.TW為例來解釋得更清楚些。

出錯的點在於 getbaroffset 最大只能取到 CurrentBar 的大小,而 CurrentBar的大小是由 TotalBar 和腳本正常執行的長度決定的。

您如果將2358.TW的除息日期畫出來的話,可以看到最早的資料是在 2020/08/14,此時是第一筆資訊,要到 2021/09/13 時才第一次有變動,這時才有第二筆資訊。

換句話說,2358.TW 要到 2021/09/13 時 getfield("除息日期")[1] 才能正常執行,再往前的話會因為 getfield("除息日期")[1] 取不到值而發生錯誤。

所以currentbar的起始點最長就只能到 2021/09/13,而 getbaroffset 最長也只能取到這天。

另一方面,如果您設的資料讀取筆數不足的話(例如10筆),取到的值也會是錯誤的。

 

date只會有交易日的資訊。

換句話說,跟週末和連假無關,如果您實際上嘗試將往前5日的 date print 或 plot 出來的話,會發現它會跳過週末跟連假。

拿小幫手寫的跟正常運作的 getbaroffset 比較,算出來的日期也是相同的。(參考附圖)

附加文件

charlie1234 發文於   2022/01/04

小幫手好

感謝說明,我去看了下除權息日,會發生錯誤的股票都是只有一次或兩次除息紀錄的,應該只要能排除這種的,getbaroffset就能正確找到日期,畢竟上面圖片有很多股票日期也沒發生錯誤

 

XQ小幫手 發文於   2022/01/06

Hello charlie1234,

 

您可以使用 GetFieldStartOffset 來取得最新一筆欄位與此欄位的第一筆資料間的欄位筆數。

舉例來說:

if GetFieldStartOffset("除息日期") >= 2 then ret = 1;

outputfield(1,GetField("除息日期")[1],"除息日1"); 

outputfield(2,date[getbaroffset(GetField("除息日期")[1])-4],"除息五天後日期");

不過須注意,若資料讀取筆數不足的話還是會發生計算錯誤的狀況。

ex. 1418 東華 前一筆是 1998/06/26

發表回覆
Close