
尋找相似K線是投資者用來研究“曆史是否總會重演”的常用方法,目前許多交易工具都已經提供搜尋相似K線功能。如下圖是一些産品的相似K線效果圖:
本文就将簡要介紹如何實作相似K線的計算,并讨論實作過程中的一些難點細節。
計算及實作相似K線的實作主要分為兩大部分,第一部分是相似度比對計算;第二部分是排名篩選。
相似度比對進行相似度比對時我們使用“皮爾遜相關系數”(Pearson product-moment correlation coefficient)來進行相關度驗證。詳細的“皮爾遜相關系數”的推導及演算可從網上找到相關資料。本文我們直接使用結論公式:
公式主要通過平均數和協方差的概念來計算相似度,實作較為容易。對于K線資料,輸入X,Y就是一組連續的價格資料,通過計算皮爾遜公式,我們會得到一個-1~1的相關系數,結果越接近1的資料,相似度越高。以下代碼是對上述公式的完整實作,程式設計使用JavaScript(讀者可以根據需要自行将其改寫為Python或C++):
我們可以試着用以下資料來計算相關系數:
輸出的結果為-1,目标資料呈完全負相關。
由此,我們就得到了對比相似度的方法。下一步我們将要從全市場曆史資料中找出相關度最高的相似K線資料。
周遊計算最簡單的實作方法就是全市場計算,蠻力周遊,将得到的所有結果進行排序,最終得到相似K線:
這種算法實作簡單,并且得到的結果一定是相似度最高的資料。但是這種算法需要将所有資料完整周遊計算,并且過程中需要儲存下每個資料的計算結果,最終排序後得到最相似的資料,從時間和空間角度來看性能較差。
周遊計算優化于是我們想到可以對排序進行優化:因為不會出現漏算的情況,我們在計算過程中隻儲存目前最高相似度資料的值,這樣就節省了排序數組的空間和最後排序的時間:
可以看到,運作時間幾乎得到了15%的性能提升。并且新的算法在空間上也更優。
雖然經過了優化,但是我們仍然無法避免大規模的資料運算,這種缺陷在進行全市場資料運算時将會暴露的更加凸顯。介于此,我們提出一種可行的優化算法:引入分治思想。對于本文中的特定案例,我們計算600570最新30天的資料,也就是說每次循環,皮爾遜公式将計算兩組長度為30的數組資料的相似度。為了降低計算量,我們從數組中選取幾個特征資料,例如選取數組頭、數組中、數組尾三個資料來計算相關度,替代每次都完整計算整個資料的相似度,在粗略計算後選取相似度排名前幾位,然後對這前幾位資料索引再進行完整計算:
對于這種算法,有一個性能公式可以參考(以下變量名和程式中相同):
cut∗compareCount+totalLength∗divide=totalLength∗compareCount
公式中,cut表示粗略計算後截取前多少名進行精确計算(本例中取值為100),compareCount表示整個對比資料的長度(本例中就是30),totalLength表示曆史資料的長度(本例中600571曆史資料長度為1404),divide表示特征資料個數(本例中用3個特征數代替30的完整資料)。對于這個公式,divide和cut是由開發人員主觀定義的。divide越大,粗略計算的成本也就越高,當cut=compareCount時,這個算法也就退化成第一種蠻力周遊算法;cut越大,最後的精确計算成本也越高,但是注意cut不能太小,因為粗略計算過程中實際上是個貪婪計算過程,可能會遺失全局最優解而得到局部最優解。另一點要說明的是,該算法計算過程中也必須儲存一個資料長度的相似度數組來進行最後的排序,是以空間消耗和第一種蠻力周遊算法一樣大(可以通過維護一個長度為cut的降序數組儲存相似度前幾位的資料,來進行小幅度的優化,大約提升15%的性能)。
相似K線對于投資的作用其實對于大部分曆史資料段,在任何一支上市5年以上的标的曆史資料上都可以找到相似度大于0.9的資料段。我們在許多産品上看到的排名前幾位的相似K線也僅僅隻是滄海一粟,對應的後期走勢也不可能代表所有資料情況,是以投資者使用相似K線進行行情研判時也應當保持謹慎。因為對于一段資料,我們可能查找出的一個相似曆史K線其後的價格為上升,而另一個相似K線其後的價格為下降,那投資者如何判斷呢?并且這種分化走勢是一定存在的。就算我們在某個标的上看到的相似K線顯示未來100%上漲,那可能隻是這個标的沒有把資料算全,或者我們還沒有遇到另一種可能性。相似K線隻能提供形态上的模拟近似,并不能完整的将目前标的和曆史資料的宏觀環境(供需基本面、經濟狀況)完全比對。投資者在使用相似K線做投資決策時仍需要注意“曆史表現并不代表未來表現”的風險。
— — — — — — E N D — — — — — —
往期文章:
Numpy處理tick級别資料技巧
真正賺錢的期權政策曲線是這樣的
多品種曆史波動率計算
如何實作全市場自動盯盤
AI是怎樣看懂研報的
真格量化政策debug秘籍
真格量化對接實盤交易
常見高頻交易政策簡介
如何用撤單函數改進套利成交
Deque提高處理隊列效率
政策程式設計選Python還是C++
如何用Python繼承機制節約代碼量
十大機器學習算法
如何調用政策附件資料
如何使用智能單
如何掃描全市場跨月價差
如何篩選政策最适合的品種
活用訂單類型規避頻繁撤單風險
真格量化回測撮合機制簡介
如何調用外部資料
如何處理回測與實盤差别
如何利用趨勢必然終結獲利
常見量化政策介紹
期權交易“七宗罪”
波動率交易介紹
推高波動率的因素
波動率的預測之道
趨勢交易面臨挑戰
如何建構知識圖譜
機器學習就是現代統計學
AI技術在金融行業的應用
如何避免模型過拟合
低延遲交易介紹
架構設計中的程式設計範式
交易所視角下的套利指令撮合
距離概念與特征識别
氣象風險與天氣衍生品
設計量化政策的七個“大坑”
雲計算在金融行業的應用
機器學習模型評估方法
真格量化制作期權HV-IV價差
另類資料介紹
TensorFlow中的Tensor是什麼?
機器學習的經驗之談
用yfinance調用雅虎财經資料
容器技術如何改進交易系統
Python調用C++
如何選擇資料庫代理
統計套利揭秘
一個Call攪動市場?讓我們溫習一下波動率政策
如何用真格量化設計持倉排名跟蹤政策
還不了解真格量化API設計?我們不妨參考一下CTP平台
了解同步、異步、阻塞與非阻塞
隐波相關系數和偏度——高維風險的守望者
Delta中性還不夠?——看看如何設計Gamma中性期權政策
Python的多線程和多程序——從一個爬蟲任務談起
線程與程序的差別
真格量化可通路:
https://quant.pobo.net.cn
真格量化微信公衆号,長按關注:
遇到了技術問題?歡迎加入真格量化Python技術交流QQ群 726895887