乾貨丨如何使用時序數據庫尋找類似的歷史k線

有網友提問應該用什麼樣的數據庫/數據結構/算法來計算某支股票的類似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只股票的日回報,並以股票代碼來命名每一列。

v2-6452039758215fffa59ae4868736c126_720w.png

使用最短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線")

v2-18be56beaeb634a8cb2c636812e4062e_720w.png

使用股票日回報相關性計算出來的股票包含紅星發展(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秒,性能極佳。

相關文章
相關標籤/搜索