51360 0

[源码分享] 寻找相似的k线 [推广有奖]

  • 0关注
  • 2粉丝

等待验证会员

初中生

95%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
2.0022
学术水平
2 点
热心指数
2 点
信用等级
2 点
经验
312 点
帖子
11
精华
0
在线时间
12 小时
注册时间
2018-11-12
最后登录
2019-4-1

楼主
DolphinDB智臾科技 发表于 2018-12-3 16:34:40 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
假设给出某股某段行情K线(单位/日),从任何其他股票历史中匹配出与之最为相似的某段历史K线,并给出相似度值(单位/%),并以此排序,获取最为相似的N个结果。

我们可以使用k线的距离以及股票日回报的相关性来衡量k线相似度,使用Tushare提供的沪深股票2008年到2017年的日线行情数据来做实验。如何把Tushare数据导入到DolphinDB可以参考教程如何使用DolphinDB处理Tushare金融数据

Tushare提供的沪深股票日线行情数据包含以下字段:
名称 描述
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日的日线行情数据加载到内存。
  1. code="002351.SZ"//漫步者
  2. edifier=select * from loadTable("dfs://daily_line","hushen_daily_line") where ts_code=code,date(trade_date) between 2016.09.01:2016.09.30
复制代码
把股票数据加载到内存中。
  1. num=exec count(*) from edifier
  2. stock=select * from loadTable("dfs://daily_line","hushen_daily_line")
复制代码

1.使用k线的距离衡量相似度

两段k线之间的距离可以用股票日回报的差的平方和来计算。距离越小表示k线的相似度越高。
  1. def square_sum(x,y):sum2(x-y)
  2. 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中的部分应用,用于固定函数的部分参数。找出与漫步者2016年9月1日到2016年9月30日最为相似的10段历史k线。
  1. mostCorrelated1=select * from corrTable1 where isValid(distance),rank(distance,true) between 0:10 order by distance 1:10
  2. ts_code                beginDate        endDate                distance
  3. 300073.SZ        2016.08.02        2016.08.29        67.024
  4. 600995.SH        2017.07.06        2017.08.02        70.8713
  5. 600549.SH        2010.12.17        2011.01.14        73.514
  6. 600627.SH        2008.07.07        2008.08.07        73.59
  7. 600367.SH        2010.12.17        2011.01.14        76.447
  8. 600867.SH        2011.07.28        2011.08.24        76.5449
  9. 002253.SZ        2010.05.21        2010.06.22        79.2845
  10. 002382.SZ        2015.01.06        2015.02.02        79.5101
  11. 300266.SZ        2014.07.07        2014.09.17        80.1772
  12. 600706.SH        2017.06.05        2017.07.14        80.5079
复制代码
定义一个函数getReturn,取出相似股票在beginDate和endDate之间的日回报。
  1. def getReturn(t, row): exec pct_change/100 from t where ts_code= row.ts_code, date(trade_date) between row.beginDate : row.endDate
复制代码
把每只相似股票的日回报数据保存到同一个回报矩阵中,每列表示一只股票在相应时间段中的日回报,并使用图表展示。
  1. retMatrix1 = each(getReturn{stock}, mostCorrelated1).rename!(mostCorrelated1.ts_code)
  2. plot(retMatrix1,,"使用最短k线距离找出相似历史k线")
复制代码
上面的代码通过each模板函数取出最相似的10只股票的日回报,并以股票代码来命名每一列。 最短k线距离.png
使用最短k线距离计算出来的股票包含当升科技(30073.SZ)、文山电力(600995.SH)、厦门钨业(600549.SH)、上电股份(600627.SH)、红星发展(600367.SH)、通化东宝(600867.SH)、川大智胜(002253.SZ)、蓝帆医疗(002382.SZ)、兴源环境(300266.SZ)和曲江文旅(600706.SH)。

2.使用股票日回报相关性衡量相似度
股票日回报的相关性是衡量k线相似度很好的指标。
  1. 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线。
  1. mostCorrelated2=select * from corrTable2 where rank(corr,false) between 0:10 order by corr desc
  2. ts_code                beginDate        endDate                corr
  3. 600367.SH        2010.12.17        2011.01.14        0.8824
  4. 600549.SH        2010.12.17        2011.01.14        0.8806
  5. 300073.SZ        2016.08.02        2016.08.29        0.8749
  6. 002294.SZ        2014.02.26        2014.03.25        0.8729
  7. 600995.SH        2017.07.06        2017.08.02        0.8723
  8. 600486.SH        2010.12.17        2011.01.14        0.8721
  9. 002382.SZ        2015.01.06        2015.02.02        0.8718
  10. 002253.SZ        2010.05.21        2010.06.22        0.8708
  11. 000939.SZ        2008.03.21        2008.04.18        0.8706
  12. 600627.SH        2008.07.07        2008.08.07        0.8692
复制代码
同样地,把相似股票的日回报数据保存到回报矩阵中。
  1. retMatrix2 = each(getReturn{stock}, mostCorrelated2).rename!(mostCorrelated2.ts_code)
  2. plot(retMatrix,,"使用股票日回报相关性找出相似历史k线")
复制代码
相关性.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秒,性能极佳。

欢迎访问官网下载DolphinDB










二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


速度即价值

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-28 01:56