深入程式交易 : 先知的交易 談後見之明

投機客與金銀島

"深入程式交易" 的第三篇標題,
就像哈利波特的書名一樣, "先知" 一詞還帶有一點魔幻的成分

稱作 "先知的交易" 是指一個程式交易裡時常發生的錯誤設計: "後見之明"
常發生的現象為歷史記錄中, 存在的單子都獲利, 
但實作當中, 這些單子並不存在甚至早已虧損出場
也就是在現實根本無法操作的程式

這種錯誤的發生原因很多
許多程式交易的開發軟體, 並非是 "所見即所得" 的系統,
開發, 回測, 看盤, 下單甚至是報酬視窗, 可能是截然不同的界面或軟體
也就是除非程式設計者, 自身有很清楚的邏輯思路,
否則極有可能出現這種 "後見之明" 的錯誤設計
本篇便是針對此錯誤,進行舉例探討

*********************************************************
感謝板友讀者"武鬥雙雄"反應本篇原本所寫太過複雜
我將沒說清楚的部分, 補充在中間這一小段, 讓以下的例子更加明確一些
先談交易進出的邏輯設計, 必然根據各式各樣的指標
 以下使用的兩個例子都是用價格資料直接作為進出場判斷
理由是市場中最快反映到報酬的資訊就是價格本身, 其他的參數都是落後指標
因此價格變動本身就可做為交易信號,
鼎鼎大名的傑西李佛摩,便是直接用報價資料進行交易的

實際上任何指標都有類似現象,
不論用均線, 一般的技術指標, 甚至是非價格成交量的間接指標
在邏輯撰寫上都可能發生後見之明的問題

談回價格資料, 通常指的就是歷史K棒
此篇所寫便是若在邏輯裡納入停損或是不交易的機制,
則很容易發生後見之明的錯誤設計, 必須細心將之排除,
才能進一步達到高統計價值的程式
**********************************************************

以下做兩個常見的錯誤範例,
可讓這種 "後見之明" 的觀念逐漸清晰

市售的軟體全部內包, 只看信號結果,
使用者或許該合理懷疑裡面可能有此類問題
 之前我就有朋友使用台灣某大財經網站(非玩股網) 裡面承租的選股軟體
 結果竟發現昨天告訴他的買進信號, 今天卻自動被刪除消失!?

這是怎麼回事?
當年我並未開始開發交易程式,
直到我自行開發, 我大概能瞭解到這個 bug的可能原因
這問題, 通常出在程式並未處理全部可能的行情變動狀況

舉例來說

若條件設計為, 在日K裡, 開盤26.5,當價格突破關鍵價27.5 且並非漲停價
則市價買進 (成交27.5 或以上)
成交後就不該跌破 27.5, 所以停損就是 27.5, 若當日無法收盤突破 27.5 則不予買進
先看條件 "若當日無法收盤突破 27.5 則不予買進" 本身絕對就是一個先知交易
你怎麼知道行情不會在計算週期內先突破 27.5 再跌破  27.5做收呢 ?
因此在歷史回測裡, 收盤低於 27.5 根本沒有單子, 實際上已經停損一次了

在歷史回測裡, 因為關鍵價抓得準, 所以 27.5 的成本果真在日後行情噴出並大賺一筆
但實際發生相同情形時, 卻不見得能交易成功

因為價格可能先上後下再上, 也就是洗盤現象
你怎麼知道不會就在買進27.5後跌破 27.5 再拉上 27.5呢? 
在日K棒裡, 只有開高低收, 根本看不到期間如何變化的資訊
頂多只能用更小週期的 K棒, 例如分K 去看細微變化
而在歷史回測中, 此現象尤其發生在收過 27.5 的收盤價, 你還有這筆單
但其實他已經停損出場了

若出現上述情況, 是不是應該多算一次以上的虧損呢?

因此如果把上述的日K, 換成三日K, 週K
在K棒發展結束前, 你還是有當時的開高低收,
可能還看到這筆單, 但K棒結束時才用正式的開高低收將程式邏輯完成
那麼這筆單就消失了, 這也就會發生上述為什麼買進當天還看到買進信號,
但隔天此信號就不見了的窘境
而該財經網站並未把這樣的損失納入歷史記錄, 結果績效都超好
但實際用起來呢, 只會覺得被巴被騙而已吧?

這種後見之明的先知交易, 
在實作上根本做不到, 主因是歷史資料太粗略
程式開發者不見得設想到期間的變化, 
例如判定成交, 若是以價格介於最高價與最低價之間成交
很多人用這個方法確認交易成功, 
但在實戰中, 你下單時, 最高價突破關鍵價時買進
此時 K棒根本還沒結束, 你怎麼知道收盤不會跌破關鍵價呢?

在越長的持有時間裡,歷史回測這便是一種後見之明
但實戰狀況裡, 你我根本無法預測未來
停損的單子都已經消失了!! 留下的都是獲利的單子

解決方法有

1. 用嚴苛的條件去設計下單, 處理任何行情變動的可能性
或許回測績效不夠令人興奮, 但它可能是才是趨近真實的現象, 誠實面對它吧
其中特別小心用最高價與最低價成立交易條件的程式
若用越長時間週期的價格資料 (K棒) 回測
就越容易在K棒發展完成前下單,
那麼用較短時間週期的時間資料, 誤差相對會較小
 2. 用開盤價或收盤價並以市價決定成交的程式通常績效較差,
但相對卻較俱有統計價值, 實際執行也較能達到歷史績效
 






以上, 依慣例把重點寫成結論 : 大家會不會直接跳到底下看就好了呢 哈


"後見之明" 是程式設計常見的錯誤, 回測前有必要反覆檢查這類邏輯錯誤
1. 常見的後見之明發生狀況有二
      1) 歷史資料較粗略, 並未考慮行情變動的細微現象 
      2) 使用最高價與最低價之間成立價格成交, 卻忽略洗盤現象
2. 解決方法
      1) 嚴格設計程式, 考慮所有可能的虧損狀況
      2) 使用較短的K棒週期, 可縮減誤差, 或是使用開盤或收盤價決定成交
      3) 較差的績效, 若較為真實, 寧可用真實的程式

以上,  或許什麼地方想得不對, 也希望有前輩可以多多指教囉
 
對小弟我的文章有興趣者, 當然也可訂閱我的部落格, 刺激思考也不錯 哈
 
我誠摯希望可和各位前輩 (或高手) 可以讓我知道我的不足之處
 
謝謝 ^^"
 
祝操作順利!!

本文內容僅供參考,無任何買賣建議,投資人應謹慎評估,風險自負。

4 則留言

高手大大寫的好複雜,小弟看不懂,不知道是不是程度間的等級差....K棒考慮價格變動?
程式交易基本上就是領先程式,因為你要賺多,後面必然就是漲。
當訊號出現後,歷史紀錄就不能取消,小弟是這樣想的。

不太容易表達, 就代表我不是高手囉
簡單說, 應該是指當進出場邏輯直接與價格資料有關才有可能做到及時反應
其餘的指標都是落後指標, 則價格變動本身納入停損與不交易的價格
就很容易發生後見之明的設計, 這是我實際遇到的狀況,
寫出來是為了在新程式的條件設計中, 避免這項錯誤

您是高手.....大家都這樣認為
小弟因為都用買程式的所以實力不太夠。
看到您的解說大概了解。
意思就是減少誤判。
小弟程式方面(買的),使用五均線修正原程式(請人修改),修正條件式8*6*6=288種模式,修正理論應該跟你一樣,減低誤差值,由於修正條件式多,準確率可以因此提高,還有飆股系統(日線和30分線的均線K值),基本條件也有4種(不包含變形條件式),所以3套整合後超過
1000多條判讀程式未來的走向,以上程式都是別人寫的,倒是不知道你怎樣認為判讀式越多下,準確率是否會漸漸提高? 還是2者不相關。

Hi, 我無法也不敢貿然斷言越多判斷式是否就越準或越不準
準不準通常要交給歷史回測得知, 我這幾篇也剛好比較著重回測注意事項, 提到的兩個想法, 個別是 1. 越多的交易數據, 代表市場越常發生這種模式, 則較俱有統計價值
2. 回測前要注意程式邏輯內部是否就有後見之明這種謬誤, 以避免被誤導

精選文章

更多
每個月自動扣款的那些服務,有幾個你真的離不開?
指數大震盪!聯電、日月光強彈,資金避風港營建興富發&電信遠傳強攻,下周盤勢重點。
川普停火費半暴漲、台股跳空收漲1019點!下周升息、三巫日、富時全撞端午變盤?!
生技展行情啟動,這兩個月勝率飆八成,神隆、長佳智能轉機浮現!
人形機器人卡關三大瓶頸!上銀、直得回測季線,機器人電池-新普、中碳成資金避風港!
活動最後一天:把這兩個月的成績單交給你看