自動交易回測問題 - AddSpread計算還原K的價格異常

  •   241 
  • 最後發表   FrankLi  2021 十月 17
FrankLi 發文於   2021/10/11

今天在做自動交易回測時發現一個問題,

SetPosition = 0 多單想出場的時候,

掛低 負1個 tick , 甚至 負5個 tick 都無法順利賣出成交,

(用 market 可順利出場)

結果發現 Close 和 AddSpread(Close, -1) 算出的差距很大!!!

以 5474聰泰為例,2021/04/14 09:00 那根1分K:

   Close = 160.35

   AddSpread(Close, -1) = 180.00

Close計算負1Tick後,價格竟比 Close 高出不少!!!

不確定是單一案例,還是剛好5474聰泰的資料有錯,

再麻煩小幫手協助查詢了

 

-------------------------------------

以下是我的回測畫面、結果、程式碼:

使用選股腳本, 裡面放一隻5474聰泰

日K和還原K的結果比較:

交易腳本程式碼:

SetTotalBar(1);
SetBackBar(1);

var:
    NowDate(0), NowTime(0), NowDTStr(""),
    intrabarpersist MyEntryDate(0), intrabarpersist MyLeaveDate(0);

NowDate = date; //currentDate
NowTime = currentTime; //time
NowDTStr = Text(datetostring(NowDate)," ",timetoString(NowTime));

print(Text(NowDTStr,", Type:Init",", Price:",Close,
    ", position=", numtoStr(position,0), ", filled=", numtoStr(filled,0)) );


if position = 0 and filled = 0 then
begin

    if MyEntryDate = NowDate or MyLeaveDate = NowDate then return;

    if NowDate = 20210318 then
    begin
        MyEntryDate = NowDate;
        setposition(2, AddSpread(Close, 1));
        print(Text(NowDTStr,", Type:●進場",", Price:",Close,
            ", position=", numtoStr(position,0), ", filled=", numtoStr(filled,0)) );
    end;

end
else if filled > 0 then //有庫存
begin

    if NowDate = 20210414 then
    begin
        MyLeaveDate = NowDate;
        setposition(0, AddSpread(Close, -1)); 
        //setposition(0, market); //用market可順利成交
        print(Text(NowDTStr,", Type:●出場",", Price:",Close, 
            ", position=", numtoStr(position,0), ", filled=", numtoStr(filled,0)) );
        print(close, AddSpread(Close, -1));
    end;

end;


 

 

排序方式: 標準 | 最新
信風 發文於   2021/10/12

同問。

這兩天在回測時也出現類似的情況,使用還權值回測時,addspread抓到的價格並不正確,我猜想是使用addspread時,它抓到的是原始值,以致於交易動作錯誤。

例如以下述簡單程式為例,股價大於等於漲停下一檔時買進,隔日出。回測中環2323,

以2018/10/15日為例,當天若以原始值計算漲停參考價約6.27元,若以原始值來看當天漲幅只有-0.7%遠不及漲停價,但以還權值來看,高低價分別為7.73及7.57,因為若以下述程式回測還權價,會觸發買入條件,若以原始值回測,則不會有錯誤動作。

經反覆測試之後,我猜想應該是addspread這個函數抓到的是原始值的價格包含漲跌停價,提供給工程師參考一下,謝謝!!

{
漲停板下一檔買進,隔日出
}


if position = 0 and close >= addSpread(upLimit(closeD(1)),-1) then setposition(1);    //漲停下一檔買進
if filled <>0 then begin
    if date <> filledRecordDate(filledRecordCount) then begin   //隔日賣出
        setposition(0);
    end;
end;

  • 按讚來自於
  • YYFrankLi0813
XQ小幫手 發文於   2021/10/15

Hello FrankLi,

 

您遇到的情況應該為 AddSpread 碰到了 5747 的漲跌停價。

AddSpread 函數說明裡有註明,如果商品有漲跌停限制的話,計算後的數值不會超過漲跌停限制。

需注意的是,這邊的漲跌停限制是以原始值的漲跌停為限制。

您可以直接試著將跌停價Print出來就會得知該日的跌停價為180。

小幫手會轉告相關人士您所遇到的情況。

FrankLi 發文於   2021/10/17

了解, 那看來自動交易回測時, 

 AddSpread 函式 無法正確處理...還原過後的K棒,

不過這樣好像也合理, 實際交易時也不會用還原價在交易,

那我先改用日K回測好了, 謝謝

 

 

發表回覆
Close