有網友提問應該用什麼樣的數據庫/數據結構/算法來計算某支股票的類似K線? 具體的問題描述是,假設給出某股某段行情K線(單位/日),從任何其餘股票歷史中匹配出與之最爲類似的某段歷史K線,並給出類似度值(單位/%),並以此排序,獲取最爲類似的N個結果。python
咱們能夠使用k線的距離以及股票日回報的相關性來衡量k線類似度,使用Tushare提供的滬深股票2008年到2017年的日線行情數據來作實驗。如何把Tushare數據導入到 DolphinDB database 能夠參考教程如何使用DolphinDB處理Tushare金融數據。算法
Tushare提供的滬深股票日線行情數據包含如下字段:sql
名稱 描述ts_code 股票代碼trade_date 交易日期open 開盤價high 最高價low 最低價close 收盤價pre_close 昨收價change 漲跌額pct_change 漲跌幅vol 成交量(手)amount 成交額(千元)
下面將以漫步者(股票代碼爲002351.SZ)爲例,介紹如何在歷史數據中,找出與漫步者2016年9月1日到2016年9月30日最爲類似的10段歷史k線。數據庫
首先,把漫步者2016年9月1日到2016年9月30日的日線行情數據加載到內存。數據結構
code="002351.SZ"//漫步者edifier=select * from loadTable("dfs://daily_line","hushen_daily_line") where ts_code=code,date(trade_date) between 2016.09.01:2016.09.30
把股票數據加載到內存中。ide
num=exec count(*) from edifier stock=select * from loadTable("dfs://daily_line","hushen_daily_line")
1.使用k線的距離衡量類似度函數
兩段k線之間的距離能夠用股票日回報的差的平方和來計算。距離越小表示k線的類似度越高。性能
def square_sum(x,y):sum2(x-y) corrTable1=select ts_code,move(date(trade_date),num-1)as beginDate,date(trade_date) as endDate,moving(square_sum{edifier.pct_change},pct_change,num) as distance from stock context by ts_code
上面代碼使用的moving是DolphinDB的模板函數,表示在大小爲num,邊界爲beginDate和endDate的滾動窗口中計算兩段k線之間的距離。square_sum{edifier.pct_change}是DolphinDB中的部分應用,用於固定函數的部分參數。spa
找出與漫步者2016年9月1日到2016年9月30日最爲類似的10段歷史k線。code
mostCorrelated1=select * from corrTable1 where isValid(distance),rank(distance,true) between 0:10 order by distancets_code beginDate endDate distance300073.SZ 2016.08.02 2016.08.29 67.024600995.SH 2017.07.06 2017.08.02 70.8713600549.SH 2010.12.17 2011.01.14 73.514600627.SH 2008.07.07 2008.08.07 73.59600367.SH 2010.12.17 2011.01.14 76.447600867.SH 2011.07.28 2011.08.24 76.5449002253.SZ 2010.05.21 2010.06.22 79.2845002382.SZ 2015.01.06 2015.02.02 79.5101300266.SZ 2014.07.07 2014.09.17 80.1772600706.SH 2017.06.05 2017.07.14 80.5079
定義一個函數getReturn,取出類似股票在beginDate和endDate之間的日回報。
def getReturn(t, row): exec pct_change/100 from t where ts_code= row.ts_code, date(trade_date) between row.beginDate : row.endDate
把每隻類似股票的日回報數據保存到同一個回報矩陣中,每列表示一隻股票在相應時間段中的日回報,並使用圖表展現。
retMatrix1 = each(getReturn{stock}, mostCorrelated1).rename!(mostCorrelated1.ts_code) plot(retMatrix1,,"使用最短k線距離找出類似歷史k線")
上面的代碼經過each模板函數取出最類似的10只股票的日回報,並以股票代碼來命名每一列。
使用最短k線距離計算出來的股票包含當升科技(30073.SZ)、文山電力(600995.SH)、廈門鎢業(600549.SH)、上電股份(600627.SH)、紅星發展(600367.SH)、通化東寶(600867.SH)、川大智勝(002253.SZ)、藍帆醫療(002382.SZ)、興源環境(300266.SZ)和曲江文旅(600706.SH)。
2.使用股票日回報相關性衡量類似度
股票日回報的相關性是衡量k線類似度很好的指標。
corrTable2=select ts_code,move(date(trade_date),num-1)as beginDate,date(trade_date) as endDate,moving(corr{edifier.pct_change},pct_change,num) as corr from stock context by ts_code
找出與漫步者2016年9月1日到2016年9月30日最爲類似的10段歷史k線。
mostCorrelated2=select * from corrTable2 where rank(corr,false) between 0:10 order by corr descts_code beginDate endDate corr600367.SH 2010.12.17 2011.01.14 0.8824600549.SH 2010.12.17 2011.01.14 0.8806300073.SZ 2016.08.02 2016.08.29 0.8749002294.SZ 2014.02.26 2014.03.25 0.8729600995.SH 2017.07.06 2017.08.02 0.8723600486.SH 2010.12.17 2011.01.14 0.8721002382.SZ 2015.01.06 2015.02.02 0.8718002253.SZ 2010.05.21 2010.06.22 0.8708000939.SZ 2008.03.21 2008.04.18 0.8706600627.SH 2008.07.07 2008.08.07 0.8692
一樣地,把類似股票的日回報數據保存到回報矩陣中。
retMatrix2 = each(getReturn{stock}, mostCorrelated2).rename!(mostCorrelated2.ts_code) plot(retMatrix,,"使用股票日回報相關性找出類似歷史k線")
使用股票日回報相關性計算出來的股票包含紅星發展(600367.SH)、廈門鎢業(600549.SH)、當升科技(300073.SZ)、信立泰(002294.SZ)、文山電力(600995.SH)、揚農化工(600486.SH)、藍帆醫療(002382.SZ)、川大智勝(002253.SZ)、凱迪生態(000939.SZ)和上電股份(600627.SH)。
3.性能分析
咱們使用的是滬深股票2008年到2017年的日線行情數據,共530萬的數據。使用第一種方法僅需7秒,使用第二種方法僅需3秒,性能極佳。