想要讓回測績效貼近實單績效,你一定要知道如何做到收K進場即時出場,本文把不同的回測設定與程式碼撰寫方式做了比較,證明在逐筆回測中是可以做到收K後進場的,而且這樣的作法,自動交易也可以執行,不需要像過往把進場跟出場分開寫,更容易維護策略。
1. 前言
常常聽到有人說XQ回測績效跟實單有很大落差,回測常常都是買在最低點,賣在最高點這種不可能的價位,在不然就是不同的回測設定,績效落差很大,要選逐筆還是非逐筆,是否要勾選觸價成交,怎麼設定,相信是困擾了非常多人。

經過我們花費巨量時間的比對,想要讓回測跟實單績效接近,是可以做到的,只要搞懂回測設定對進出場時間跟價格的影響後,你的回測絕對可以跟實單績效較為接近,接下來的文章,將會分享如何設定、如何撰寫對的程式碼。
2. 交易方式在回測跟實單的差異
交易邏輯成立的判斷主要有兩種方式,一個是條件成立馬上進場,一個是等收K後再決定是否進場,分開說明入下
2.1 條件成立馬上進場
第一種方式是只要條件一成立就馬上執行,比如說開盤的第一分鐘,如果漲到了5%就馬上進場,這種進場的價格會接近漲5%的位置。
這個方式,在盤中執行是沒有問題的,但是回測時,往往因為數據不夠精細,沒有逐筆資料,而無法提供較為接近實單的成交價格,像XQ,最細的數據只到分K,只能用分K的開高低收去模擬可能成交的價格,而這樣的方式往往回測跟實單績效落差產生的地方。
2.2 收K後確認條件成立才進場
第二種方式是等收K之後,確認條件成立後再執行,比如說,開盤第一分鐘結束後,如果漲了5%就進場,這種進場方式,會等1分K結束後,有漲超過5%才進場,所以進場很有可能是在漲7%或8%的價格,通常會是第二根K棒的開盤價。
這種方式,因為是等收K後決定,通常就是下一根K棒的第一個tick出現時,計算上一根是否條件成立,有成立就會馬上進場,因此,第二種方式進場價格就會是收K後的下一根K棒的開盤價,而這種方式,原本回測數據不夠精細的問題就解決了,而且實單也很容易做到,因次,如果想要做到回測與實單較為接近,最好的方式就是收K後再進場或進場

3. 收K進出場的設定
想要做到收K進場跟出場,回測跟自動交易的設定都非常簡單,只要在回測設定頁面,取消勾選模擬逐筆洗價跟觸發即判斷成交就可以了。

在自動交易中心也是一樣,不要勾選逐筆洗價跟自動洗價即可

4. 收K後進出場是好主意嗎?
雖然上面提到,收K後進出場回測績效會跟實單較為接近,但是,這會是個好的交易方式嗎? 老師傅常說,停損要即時,尤其是做當沖放空策略,如果等到收K才出場,很有可能已經被鎖漲停出不掉,那就要另外支付高昂的借券費,曾經有人遇到連續跳空漲停好幾天,價差加上每天的借券費,一半的資金就沒了,所以,收K後進場,會符合大部分的需求,但是,在出場的方式上,就最好要能即時出場了。
如果要做到收K進場,即時出場,XQ又要如何做呢? 滿常聽到的一個方式就是把一個策略拆成三個,一個策略專門做回測,採非逐筆的方式,另外兩個策略是實單使用,一個負責收K進場(非逐筆),一個負責監控狀況即時出場(逐筆),這樣的方式,是不是感覺很複雜,其實,有更簡單的方式,只要一個策略就搞定回測與自動交易了。接下來就要跟大家揭密做法。

5. XQ如何做到收K進場,逐筆出場
想要在XQ的回測與自動交易上做到收K進場,逐筆出場,唯一的方式就是開啟逐筆,並且配合condition的使用
要做到收K後進場,逐筆+condition[1]就對了
在逐筆的情況下,只要用condition[1],就會跟非逐筆的效果一樣,等收K進場,但是XQ要怎麼知道收K了呢? 在逐筆的情況下,只要下一根K的第一個tick出現後,就是確定剛剛的K棒結束了,這個時候,用來計算是否符合條件的那根K棒就變成是上一根K棒了,此時要判斷條件是否成立,程式碼就要寫成condition[1],如果成立要進場,就是用現在這根新的K棒的第一個tick進場,自然就是開盤價了。
由於是採用逐筆設定,因此,回測跟自動交易時,都會是逐筆出場,但是,XQ的逐筆回測因為前面所說的精細度不夠,所以價格會與自動交易會點落差,不過,由於我們因為已經將進場都同步了,回測與自動交易的落差已經有是大幅縮減了。
上面的說明,可能有人還是看不是很懂,以下我們比較不同的回測設定,應該會更清楚。
6. 回測設定比較
以下提供一個簡單的當沖程式碼,當時間到9:03就進場做多,時間到下午1:20就出場,程式碼如下
input: mode(1,"逐筆或非逐筆",inputkind:=dict(["非逐筆",1],["逐筆",2]));
condition1 = time = 090300 ;
//非逐筆時,用condition1進場
if position= 0 and mode = 1 then begin
if condition1 then setposition(1);
end;
//逐筆時採用condition1[1]進場
if position= 0 and mode = 2 then begin
if condition1[1] then setposition(1);
end;
if position <> 0 and time >=132000 then setposition(0);
6.1 非逐筆 + condition1的回測結果
由於我們要做到非逐筆那樣的收K進場,所以需要先回測取得績效、次數、標的、進出場時間、價位等資訊,而且回測只有測一天,2024/4/13為星期天,好處是方便做比較
以下為非逐筆回測,淨利為-2.64%,交易次數為28次

交易的標的如下,我們策略是出現9:03後的下一根K進場,所以,進場時間幾乎都是9:04分,而且都是開盤價,讀者有興趣可以去查歷史K棒,看看是不是開盤價
另外,有些標的是9:05才進場,原因會在之後的文章做說明

6.2 逐筆 + condition1的回測結果
如果採用逐筆,而且還是用condition,回測又會是怎樣的結果呢?
交易次數一樣為28次,但是淨利縮減為-1.46%,差了約1.1%,其個差異其實算大的,因為只有回測一天,如果回測一兩年,這個淨利的差異很可能達到上百%。

而從交易紀錄可以看到,大部分的進場時間都為9:03(下圖右),而且是開盤價,這樣跟非逐筆收K後進場的價格就有落差了(下圖左),另外,跟非逐筆的回測發生的狀況一樣,不是所有標的都在9:03進場,為何會這樣,為了不要把問題複雜化,我們到後面再一次解開秘密,這邊只要記得逐筆+condition是不行的。

6.3 逐筆 + condition1[1]的回測結果
這次,在逐筆回測時,將condition1變成取前一根condition1[1],回測後的交易次數增加到31次,比原本非逐筆的多了3次,報酬率-4.11%,比原本的多虧了1.5%,又更大了。

比對交易數據,這次跟非逐筆的回測結果比較接近了,多是在9:04分的開盤價進場,不過如果仔細看下,有的進場時間是在9:05,而且跟非逐筆的不同,這到底發生了啥事呢? 一樣下一篇文章說明

7. 回測該如何出場
在出場的時候,如果遇到停損的狀況,是要馬上出場的,所以一定是逐筆 + condition,但是在停利出場或是時間到出場,是可以等到收K後出場,或是停損跟停利都是用逐筆出場,但是時間到出場則是等收K之後,這樣可以讓一些出場與實單結果貼近,讓績效的差異變得更小。
8. 自動交易設定
回測會了,那自動交易要如何設定呢? 上面程式碼的寫法在自動交易完全不用改動就可以執行,只要在自動交易的洗價設定那,做出如下圖的設定,你的回測與自動交易績效應該就能比較接近了。

9. 總結
本篇大概介紹了如何在逐筆的情況下,做到收K進場,即時出場,好像很簡單,但其實還有一些情況需要釐清,才不會在運用的時候出現問題,比如說程式碼加入選股條件是否要用condition[1]、盤中條件何時不該用condition[1],還有上面交易次數不一致的問題是如何發生的,要如何解決等等,這些問題都會在下一篇說明,搞清楚後,你的回測結果就更值得被信賴了。
以下是一小部份我做的統計表,紀錄每個時間點的成交量,橘色為進場的時間,如果你能了解這張圖,就能知道逐筆、跟非逐筆會在何時進場,又為何有時只有逐筆進場,有時只有非逐筆進場,自己研究研究,不然就等我下一篇文章囉

下一篇文章將會是VIP文,歡迎加入我們的VIP會員,只要綁訂我們的XQ推薦碼,並且加入月訂閱或是年訂閱,就可以免費成為我們的VIP,如果你已經綁定非@VIP999的推薦碼,也可以加入,請line我們詢問解決方式@aplustrading
發佈留言
很抱歉,必須登入網站才能發佈留言。