在新版XQ支援自動交易可以直接取得財報資料後,策略終於可以不用分開寫在選股與交易兩個模組裡面了,這大幅提升了策略開發的速度與後續維護的方便性。不過,當把選股條件寫入自動交易時,會遇到不同頻率的資料、還有些資料是在盤後才更新,取錯期數,很有可能發生選股與交易回測時,進場都是一致的,但一到實單就出現落差,本篇文章就是要來測試不同寫法對於進場日的影響,並找出正確的寫法,讓選股與交易不管是回測還是實單,都能保持一致的進場時機。
1. 前言
許多在用XQ開發股票交易的人,應該都很困擾自動交易中心無法取得財報資料來撰寫策略,須要把策略拆開,先用選股中心協助做財報選股,再由自動交易交測抓取選股結果,執行後續的進出場邏輯,不知道怎麼做的,可以看這篇。
而這樣最大的問題就是,一個策略被分成了兩個部分,維護起來很麻煩,如果選股的程式碼、設定或參數被改動了,使用者是很難發現的,另外就是做自動交易策略開發時,回測的結果並不會列出所使用的選股條件與設定,如果沒有另外記錄下來,之後是無法找回原本的選股設定的。
這一個困擾人的問題,XQ最近終於解決了,讓指標、雷達、自動交易都可以取得財報的功能,對於想要開發自動交易策略的人,可以把所有條件都寫在一個策略內了,真的大大方便了策略的開發,但是,要把選股條件寫到自動交易內,還是有些地方要注意的,不然很有可能抓到不對的資料,甚是在回測時用了未來資料,這對開發策略,都是非常危險的,可能造成重大的金錢損失,真的是一定要注意。
選股資料有分日、月、季、年等頻率,大部分資料都是盤後資料,但日資料卻有可能是盤中資料,在取資料上的寫法有何差異,以下內容來告訴你。
2. 日頻率資料取前一期[1]就對了
以下表格整理了在日頻率資料下,要取那一期,自動交易的回測與實單才能得到一致的結果。
日頻率資料比較麻煩的地方在於,日資料有兩種,一種是盤中會出現的資料,如價格、成交量,而另一種是盤後才會更新的資料,如外資買賣超這類籌碼數據,不過還好在寫法上是一致的,只要是日資料,通通取上一期[1]資料就對了,如果取當期資料,回測結果就是錯的,而盤中進場要不是比選股早一日,要不就是策略會出錯。

下面詳細說明選股與自動交易的進場邏輯與不同寫法的測試結果,不一定需要看,有些初階內容、也有點枯燥,想多了解的人再去看看囉。
3. 選股中心的策略何時進場
選股中心主要是用收盤之後的資料來篩選隔天要進場的股票,所以最快的進場的時間點,會是隔天的開盤進場,不會因為隔天開盤的漲跌而做調整。
下面為選股中心的回測設定,有兩個進場方式,一個是當天的收盤價進場,那種會是比較特殊狀況才會用,比如當天收盤前就已知的事,如隔天要除息了,有的人就會在除息前一天收盤進場,如果我們用的是當天收盤後才會有的資料做進場判斷,選擇當天收盤價進場就等於是用未來值來做判斷,通常回測績效會非常好,但實際上可能績效是天差地別的,所以在設定上一定要非常小心的。
所以在使用選股中心回測時,進場就多是選擇隔天開盤價,就是隔天一開盤就進場

4. 在自動交易中心執行選股策略
由於選股中心沒有交易功能,想要做到自動交易,就需要透過自動交易模組來執行,執行的方式有兩種
4.1 透過自動交易的商品串選股策略
這件事在設定上比較麻煩,需要在自動交易中心另外寫進出場腳本,透過商品那加入選股策略,雖然這樣是可以執行的,但等於是把一個策略拆分成兩個部分,對於策略的維護管理都是非常不利的,在自動交易回測不同選股設定時,也很難追蹤紀錄。


4.2 將選股程式碼寫到交易腳本內
在XQ開放自動交易取得選股資料的功能後,原本的選股策略可以直接寫入交易腳本內,不用像4.1要分開兩個策略,大大改善了我們對策略開發、維護與管理上的方便性與效率,不過,在改寫成交易程式碼,就會需要特別注意,不然很有可能取得錯的資料,尤其是如發生取到未來值,又拿來交易,那可能會滿慘的。
後面的內容,將會採用這個方式,去測試不同日資料寫法,比較選股回測與自動交易回測的差異。
5. 日資料怎麼取回測才正確
日資料有分為盤中會更新的資料與盤後才會更新的資料,然後許資料又分取當期或是取前一期,因使,我們分成以下四種狀況去回測,並比較結果
5.1 有盤中資料、取前期[1]
這個策略的選股條件是
今天收盤後,選出今天成交量大於10000張的股票,明天開盤進場
但當改寫成自動交易腳本時,由於開盤才會執行,因此,我們在寫腳本時,應該要這樣想
今天開盤時,幫我取得昨天成交量大於10000張的股票,今天開盤立刻進場,
因此,在自動交易的腳本會寫成如下,
if position=0 and filled=0 then begin
if getfield("成交量", "D")[1] >= 10000 then setposition(1,market);
end;
為何交易程式碼用中括號1呢,因為我們要在今天開盤時取昨天成交量大於10000張股票的資料,所以要用[1]去取得昨天的資料,從下圖的選股跟交易回測的結果來看,進場日期與時間都是一樣的,表示這樣的寫法是正確的。


5.2 有盤中資料、取當期[0]
上面5.1在交易腳本的寫法,回測可以做到跟選股一樣的進場日且是開盤進場,那如果原本的腳本改成用中括號[0],會出現怎樣的狀況呢?
if position=0 and filled=0 then begin
if getfield("成交量", "D")[0] >= 10000 then setposition(1,market);
end;
下圖為回測結果,當交易腳本的日成交量取的期數為0的時候,有兩個地方可以觀察下,一個是進場日期,都會比原本選股的提前一個交易日,另一個就是交易腳本的進場時間,都是在盤中的某的時間點,而不是開在開的時候
這個結果其實滿容易理解的,當交易腳本的日成交量取的期數為0的時候,就是要取當天的成交量資料,而成交量資料在盤中會更新的,因此,在當天盤中累積的成交量超過10000張時,就會馬上進場了,不會等到隔天,因此,會比選股提前一天就在盤中進場。


5.3 盤後才有新資料、取當期[0]
5.2的狀況是盤中數據會更新,那如果用了中括號0,但是盤中不會有新數據,要等盤後才會更新,這樣又會如何呢? 這邊用外資買賣超來做測試。
if position=0 and filled=0 then begin
if getfield("外資買賣超", "D")[0] >= 5000 then setposition(1,market);
end;
從選股跟交易的回測比較可以看出來,交易回測的進場日跟5.2一樣,都提前了一個交易日,而且是在開盤就進場,但這樣是很有問題的,因為外資買賣超數據是盤後才會更新,卻被那來當成是當天的數據,並且在開盤就進場,等於是用了未來值來做回測。


5.4 盤後才有新資料、取前期[1]
由於5.3回測會取到未來值,因此這次改取前一期做回測,程式碼如下
if position=0 and filled=0 then begin
if getfield("外資買賣超", "D")[1] >= 5000 then setposition(1,market);
end;
這次自動交易的回測結果就跟選股回測一致了,因此,可以很確定的是回測盤後才會更新的資料時,跟盤中資料一樣,都是要取前一期的資料才行。
不過,這個結果,在實單上會不會又不一樣呢,5.3因為是回測,資料庫有數據,所以才會發生取到未來值,但在實際交易時,因為沒有資料,會不會反而正確呢?


6. 實際交易如何寫才對
上面的回測結果我們已經找出正確的寫法,讓選股與回測的進場日可以一致,但是在實際交易上,同樣的寫法會是正確的嗎? 盤中會更新的資料可以很確定不會有問題,我們比較擔心的是盤後更新的資料,回測的寫法在實際交易會不會有問題。
以下是我們把外資買賣超取當期在盤中的狀況,因為外資買賣超還沒有新的資料,因此,一開啟策略,策略就出現錯誤訊息了,因此,可以確定,盤後更新資料,在盤中使用時,也是要取上一期才行,實際策略,取前一期自動交易才能正常執行。


7. 總結
從上面的比較,可以整理出下方的表格,讀者只要記得,日頻率的選股條件,通通都取前一期就對了。

另一個簡單的想法就是,今天的資料跟昨天會不會一樣,如果會不一樣,那就是用前一期,如果是一樣的資料,那就用當期,不過,這個想法,在月、季或年資料是不是這樣呢?我們下一文章在解答啦。
發佈留言
很抱歉,必須登入網站才能發佈留言。