免費下載
訂閱模組
搜尋

【XQ回測說明】回測成交價搓合


選擇單元...
上一篇我們提到了XQ回測中的報酬率算法在策略雷達、選股中心、自動交易上各產品的差異,

而這篇我們主要會著重在「回測報告中」的進出場成交價是如何搓合的

 

現況

回測中的進出場成交價,對於回測績效有不小程度的影響,最主要的影響在於:「這筆交易,是會先到達停利條件,還是先停損條件」而決定這二者的先後順序,現階段採用了以下兩種作法,主要依執行頻率之下,是否有更細小的頻率來分類:

  1.  有更細小的資料時,使用更精確的資料決定例如:執行的頻率是"日"頻率,而我們的歷史資料有最小"1分鐘K線"的資料,這時就用依據"1分K鐘"來確定股價變化的順序。
  2.  沒有更細小的資料時,使用K棒的相對關係決定例如:執行頻率是1分K,而這已經是我們提供最小的資料頻率時,我們會利用收盤價和高/低價之間的關係,決定這根K棒是O-H-L-C還是O-L-H-C,我們稱這個為模擬逐筆洗價

然而這個模擬逐筆洗價的做法,可能會導致在回測時會出現一些不合理的交易,例如:買進時的成交價,可能買在當日的最低價。為什麼會發生這種情況呢?

前面提到,在模擬逐筆洗價時,我們會將一根K棒拆解成O,H,L,C四筆tick,也就是分四次洗價。這裡為了方便說明,我們以O-H-L-C(開盤-最高-最低-收盤)的洗價狀況來模擬:若你有注意到就會發現,當我們在H(最高價)洗價,並送出委託,之後就會成交在這根K棒的最低價L。

 

改善

我們發現這個問題之後,也提供了一些改善的方式。在選股中心及策略雷達時,你可以選擇成交「當期收盤價」

在自動交易時,可以選擇觸發即判斷成交」。啟用這些選項後,同樣的狀況,你的成交價會在H、而不是神奇的成交在最低價L。

 

(改版中針對目前線上環境的回測成交邏輯作調整 (10/25),以下文章會說明調整的內容)

回測成交邏輯調整說明

修改1分鐘頻率逐筆洗價時的成交判斷

執行回測時如果挑選的回測頻率是1分K,同時勾選模擬逐筆洗價的話,目前系統的作法如下:

 

假設這一分K的時間是09:01,這一分K的資料是OHLC 以及 V,而且在這一分鐘內,H比L先發生的話,那麼洗價順序如下:

編號時間OpenHighLowCloseVolume
109:01:00OOOO1/4 V
209:01:15OHOH1/4 V
309:01:30OHLL1/4 V
409:01:45OHLC1/4 V

 

可以想像成,如果系統在這一分鐘內,依序收到了四個成交價,間隔是15秒,這四個價格分別是O,H,L,C,那麼在收到成交時,依照當時的狀態所組出來的K棒,就是上面這個表格內每一筆的樣態。

 

那麼接下來假設,腳本在編號1的這根K棒洗價時,呼叫了SetPosition(10,Close)的話,那麼系統會採用以下的方式來撮合這一筆委託:

  • 委託的價格是O (也就是編號1這一根K棒洗價的Close),委託的數量是10
  • 接下來依照市場價格,判斷是否會成交。判斷成交的邏輯如下(買進的情況)


如果是市價單的話,則產生成交,最大的可成交數量為當根Bar 1/4 的成交量。

如果是限價單的話,則當委託價大於等於成交價的時候,以成交價產生成交,最大的可成交數量為當根Bar 1/4 的成交量。


  • 所以這一筆委託會依序比對跟H (產生編號2這一筆K棒的價格),L (產生編號3這一筆K棒的價格),以及 C(產生編號4這一筆K棒的價格)的關係,直到完全成交,或是腳本內更改Position為止

 

這樣子的撮合方式雖然簡單,可是由於一分K只取樣O,H,L,C四個價格,當分K內價格變化比較大的時候,常常會出現買進時成交價格低於委託價格的情形,導致回測報告的績效過於樂觀

 

為了修正這個問題,在這次調整 (10/25) 時,我們修改委託撮合的邏輯如下:


如果是市價單的話,則產生成交,最大的可成交數量為當根Bar 1/4 的成交量。

如果是限價單的話,會分成兩種情況:

  1. 委託價大於等於委託當下的價格的話,則成交在當下的價格。
  2. 若委託價小於委託當下的價格,但大於下次洗價之間的最低價的話,則成交在委託價。

最大的可成交數量為當根Bar 1/4 的成交量。


用來撮合的資料改用模擬的K棒,而這個模擬K棒則由連續的兩個價格來組成。

 

以上面資料為範例,在如果是在編號1的K棒洗價完成後送出委託的話,那接下來用來撮合的模擬K棒資料依序如下:

撮合K編號OpenHighLowCloseVolume
1OHOH1/4 V
2HHLL1/4 V
3LCLC1/4 V
4OOOO1/4 V

  • 雖然K棒只取樣四個價格,可是如果實際市場的成交資料很密的話,那我們可以假設送出委託當時,市場最新的成交價應該是O,然後慢慢的拉高變成H,所以就用O/H/O/H這樣子的模擬K棒來撮合
  • 上表內第四筆資料(紅字)代表的是下一分鐘的1/4根K棒

 

修改委託送出後判斷是否成交的時間點

目前的回測作法,會依照K棒的洗價設定(多久跑一根K棒)來決定委託送出後什麼時候要判斷成交. 

 

舉例而言,如果K棒是5分K,沒有勾選模擬逐筆洗價,那又假設090000這跟Bar洗價,此時腳本呼叫了SetPosition(10,Close),那麼系統會採用以下邏輯來判斷這一筆委託是否成交:

  • 這一筆委託是要買進10張,委託價格是090000這一筆5分K的Close,
  • 因為是5分K,所以系統會在洗090500這一根5分K時判斷這一筆委託是否成交,請注意因為XS的K棒是標示這個K棒區段的開始時間,所以090500的5分K涵蓋的資料範圍是09:05:00 ~ 09:09:59秒,
  • 判斷成交的邏輯如下(買進的情況下):


如果是市價的話,則成交在開盤價。最大的可成交數量為當根Bar的成交量。

如果是限價單,委託價大於等於開盤價的話,則成交在開盤價。最大的可成交數量為當根Bar的成交量。

如果是限價單,委託價小於等於開盤價,但大於等於最低價的話,則成交在委託價。最大的可成交數量為當根Bar


  • 依照上面的邏輯,系統會拿090000這根Bar的Close (假設為100),跟090500這一根5分K的價位來比對,如果委託價100 >= K棒的開盤價的話,那我們認定會成交在K棒的開盤價,如果委託價100 >= K棒的最低價的話,那就成交在100元,如果委託鑑100 < K棒的最低價的話,表示委託價格太低了,所以不會成交
  • 成交的數量,依照委託數量(10張)跟這根K棒的成交量來判斷,最多只會成交當根K棒的成交量
  • 如果還有未成交數量的話,則會等到洗091000這一根5分K時繼續判斷

 

可是,我們思考如果在實際市場上,我在09:05:00秒時,送出了一筆買進10張的委託的話,那會發生什麼事情呢 ?

交易所應該會在收到任何一筆賣出的委託單時,就會試著來跟我的這一張委託單撮合。 (為了簡化起見,我們不考慮先前就已經掛出的賣單委託,也不考慮撮合排隊的邏輯)

 

如果是依照目前回測撮合的邏輯,這一整筆委託,必須遞延到09:10:00時才會判斷是否成交,而且只會產生一個成交價,可是實際交易時,只要有符合的賣出價格的話,我的委託可能就會成交,而且可能會產生多筆成交。

所以系統就調整成在腳本送出委託之後,馬上使用商品之後的成交資料來判斷這一筆委託是否成交,與腳本的洗價設定無關。

 

目前回測系統所提供的商品成交資料,就是上面提及1分K的四筆小K棒。

所以修改後的回測成交判定會變成使用者如果是跑5分K,在090000洗價時送出委託,接下來第一次可能成交時間會是09:05:00,接下來是09:05:15,09:05:30等,用來撮合的K棒資料與1分K模擬逐筆洗價的資料是一致的。

 

總結

我們都希望回測時得到的結果,可以跟把時間倒回到那一天時一模一樣。這一次的這兩個調整,主要是撮合邏輯的調整,希望可以讓回測的結果更加真實

感謝大家對XS的支持,我們會繼續朝這個方向努力。

 

若您有任何的想法或是建議,歡迎可以mail到我們客服信箱:XQservice@XQ.com.tw