【XQ回測說明】回測成交價搓合
選擇單元...
XS自動交易
單元目錄
單元目錄
上一篇我們提到了XQ回測中的報酬率算法在策略雷達、選股中心、自動交易上各產品的差異,而這篇我們主要會著重在「回測報告中」的進出場成交價是如何搓合的。
可以想像成,如果系統在這一分鐘內,依序收到了四個成交價,間隔是15秒,這四個價格分別是O,H,L,C,那麼在收到成交時,依照當時的狀態所組出來的K棒,就是上面這個表格內每一筆的樣態。 那麼接下來假設,腳本在編號1的這根K棒洗價時,呼叫了SetPosition(10,Close)的話,那麼系統會採用以下的方式來撮合這一筆委託:
如果是市價單的話,則產生成交,最大的可成交數量為當根Bar 1/4 的成交量。如果是限價單的話,則當委託價大於等於成交價的時候,以成交價產生成交,最大的可成交數量為當根Bar 1/4 的成交量。
如果是市價單的話,則產生成交,最大的可成交數量為當根Bar 1/4 的成交量。如果是限價單的話,會分成兩種情況:
用來撮合的資料改用模擬的K棒,而這個模擬K棒則由連續的兩個價格來組成。 以上面資料為範例,在如果是在編號1的K棒洗價完成後送出委託的話,那接下來用來撮合的模擬K棒資料依序如下:
如果是市價的話,則成交在開盤價。最大的可成交數量為當根Bar的成交量。如果是限價單,委託價大於等於開盤價的話,則成交在開盤價。最大的可成交數量為當根Bar的成交量。如果是限價單,委託價小於等於開盤價,但大於等於最低價的話,則成交在委託價。最大的可成交數量為當根Bar
現況
回測中的進出場成交價,對於回測績效有不小程度的影響,最主要的影響在於:「這筆交易,是會先到達停利條件,還是先停損條件」而決定這二者的先後順序,現階段採用了以下兩種作法,主要依執行頻率之下,是否有更細小的頻率來分類:- 有更細小的資料時,使用更精確的資料決定例如:執行的頻率是"日"頻率,而我們的歷史資料有最小"1分鐘K線"的資料,這時就用依據"1分K鐘"來確定股價變化的順序。
- 沒有更細小的資料時,使用K棒的相對關係決定例如:執行頻率是1分K,而這已經是我們提供最小的資料頻率時,我們會利用收盤價和高/低價之間的關係,決定這根K棒是O-H-L-C還是O-L-H-C,我們稱這個為模擬逐筆洗價。
改善
我們發現這個問題之後,也提供了一些改善的方式。在選股中心及策略雷達時,你可以選擇成交「當期收盤價」。在自動交易時,可以選擇「觸發即判斷成交」。啟用這些選項後,同樣的狀況,你的成交價會在H、而不是神奇的成交在最低價L。 (改版中針對目前線上環境的回測成交邏輯作調整 (10/25),以下文章會說明調整的內容)回測成交邏輯調整說明
修改1分鐘頻率逐筆洗價時的成交判斷
執行回測時如果挑選的回測頻率是1分K,同時勾選模擬逐筆洗價的話,目前系統的作法如下: 假設這一分K的時間是09:01,這一分K的資料是O、H、L、C 以及 V,而且在這一分鐘內,H比L先發生的話,那麼洗價順序如下:編號 | 時間 | Open | High | Low | Close | Volume |
1 | 09:01:00 | O | O | O | O | 1/4 V |
2 | 09:01:15 | O | H | O | H | 1/4 V |
3 | 09:01:30 | O | H | L | L | 1/4 V |
4 | 09:01:45 | O | H | L | C | 1/4 V |
- 委託的價格是O (也就是編號1這一根K棒洗價的Close),委託的數量是10
- 接下來依照市場價格,判斷是否會成交。判斷成交的邏輯如下(買進的情況)
如果是市價單的話,則產生成交,最大的可成交數量為當根Bar 1/4 的成交量。如果是限價單的話,則當委託價大於等於成交價的時候,以成交價產生成交,最大的可成交數量為當根Bar 1/4 的成交量。
- 所以這一筆委託會依序比對跟H (產生編號2這一筆K棒的價格),L (產生編號3這一筆K棒的價格),以及 C(產生編號4這一筆K棒的價格)的關係,直到完全成交,或是腳本內更改Position為止
如果是市價單的話,則產生成交,最大的可成交數量為當根Bar 1/4 的成交量。如果是限價單的話,會分成兩種情況:
- 委託價大於等於委託當下的價格的話,則成交在當下的價格。
- 若委託價小於委託當下的價格,但大於下次洗價之間的最低價的話,則成交在委託價。
用來撮合的資料改用模擬的K棒,而這個模擬K棒則由連續的兩個價格來組成。 以上面資料為範例,在如果是在編號1的K棒洗價完成後送出委託的話,那接下來用來撮合的模擬K棒資料依序如下:
撮合K編號 | Open | High | Low | Close | Volume |
1 | O | H | O | H | 1/4 V |
2 | H | H | L | L | 1/4 V |
3 | L | C | L | C | 1/4 V |
4 | O | O | O | O | 1/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時繼續判斷