2012年1月30日 星期一

當 Stop 與 Market 同時間對打


程式交易小學堂─期貨投機事業的王道
起因於我自己的交易系統,上週三(年假中)我發現了如果今天(1/30)台指如果跳空開高的話,會觸發策略中的 Buy STOP 動作,但是也因為封關巧遇結算日,當天系統把空單的訊號做清倉,將於今日(結算日隔天)的開盤把原方向的空單建立回來,Sellshort MARKET。因為年假期間國際股市平均漲了約三個百分點,台指的年假後開盤跳空開高幾乎是確定的。因而,對我的交易系統來說就產生了在開盤的時候同時觸發 Buy STOP 與 Sellshort MARKET 了。

一個要做多,一個要放空,系統會怎麼排先後順序?自動下單的實務又會怎麼運作?這就是本篇文章的實驗與探討了。

在交易的動作條件上,我都會加入 MarketPosition 的條件去避免在同一根K棒既作多又放空的來回掃單可能性。這一次卻因為結算日的清倉動作,讓 MarketPosition=0 使得這個避免的機制失效,多空都有可能動作。這延伸出如果你的交易策略有空手的時候,其實都有這個風險存在,是否有可能在某一根K棒既符合作多也符合放空的條件且會觸發?如果有,你必須好好思考這個問題。

因為,下單機的動作是由策略程式訊號所驅動的,所以先從策略會產生的訊號開始思考。在程式中的交易命令 Stop(或是Limit)與 Market 間是否有優先權的順序?而因為程式碼的被電腦解讀是自上而下的依序運作,那麼交易命令的的先後排列是否有訊號發生的優先權影響?

實驗。指定在某一天的最後一根為條件,下一根開盤市價放空,也於下一根突破高點作多。這是為了故意要製造策略邏輯上的兩個交易動作的打架。程式碼的順序排列,先測試突破高點作多排在市價放空之前:
  Condition1= D=1120116 and T>=1340;
    if Condition1 then  Buy next bar High STOP;
    if Condition1 then  Sellshort next bar MARKET;
觀察回測交易明細的發生先後順序,市價放空會排在突破高點作多之前。
2

再來測試市價放空排在突破高點作多之前:
  Condition1= D=1120116 and T>=1340;
    if Condition1 then  Sellshort next bar MARKET;
    if Condition1 then  Buy next bar High STOP;
觀察回測交易明細的發生先後順序,市價放空依然排在突破高點作多之前。從這兩組程式碼順序安排比較可以得知,當條件成立時,動作發生的順序 MARKET 會先於 STOP(Limit),因此在這個 Buy STOP 與 Sellshort MARKET 於同一時間(開盤)動作時,最後留下的應該會是 STOP 的單子,此例中是買單被留下。
2

如果你使用 MultiCharts 或是 TradeStation 的內建下單功能的話,我想看完上面的測試後,你應該要好好想一想到底內建的下單的功能會是怎樣的運作?雖然對策略來說,開盤價一跳出來的時候,圖面上顯示的部位訊號會是留下 STOP(Limit)的單子,但回測的明細上畢竟是有過 MARKET 的動作,這表示兩個動作都應該會在內建的下單機中有過動作,而其下單的順序與口數的委託會是怎樣就牽涉到真實帳戶中的部位方向與數量是否正確了。

經過與友人的討論猜想後,如果是內建下單功能的作業,我想一旦真的發生這樣的打架訊號,屆時真實帳戶的部位會是錯的。為什麼?因為當 2012/01/16 這一天的最後一根時,Condition1 這個判斷條件已經滿足,MultiCharts 把 STOP 的觸價單放入下單機中去洗價等待丟單,此時它等待丟出的買單口數會是1口(0→ +1);而 MARKET 的下一根市價單則是等待下一根的開盤出現就送出委託到期貨商去,這個買單口數也會是...1口(0→ -1)。當 01/17 開盤價一出現,MARKET 買單送入期貨商委託,STOP 買單也因為觸價發生也送入期貨商去委託,假設在期貨商的 API 沒有發生同一時間兩筆委託單而發生失敗的著狀況,這會是買進1口與賣出1口,結果:自己成交自己,真實帳戶的淨部位...還是0,而策略上的部位卻是多單1口。如果內建的下單機有策略與帳戶間的同步校正功能的話,也許隨後會再遞出買進的委託,如果沒有同步化校正的話,真實帳戶裡就一直空手了。

那麼使用外部下單機(文字擋傳輸策略的部位訊號)的人呢?我自己就是這類的^^

我故意在外部下單機開了一個模擬帳戶,去觀察實際上這個情況發生的時候,送單記錄會是怎樣的?看看以下的兩張圖。
0

1

結論:如果你的交易策略有空手的時候,也許透過大家慣用的 MarketPosition<=0 或是 MarketPosition>=0 去做多單/空單進場的限制不見得能完整確保不會在同一根 K棒 有訊號打架的狀況,這會造成回測與真實交易狀況的不一致。如果使用 MultiCharts 的內建下單機還可能造成真實帳戶與策略部位的不一致(透過下單流程猜想未實驗)。如果使用把策略部位對外輸出到外部下單機去的,則是只有被留下(STOP)的訊號有動作,從下單口數來看也會讓真實部位與策略部位一致。

當然,最好的作法應該是把策略的動作邏輯設計到可以排除 作多/放空 不會在同時間打架,從策略本身就做到回測與真實交易一致。如果你的策略會有空手的時候,請特別小心這個同一時間 既作多又放空 的可能性。

熱門文章