—— 本篇文章 by 薛定谔の喵
JQData可以怎么玩呢?统计还是一件蛮有意思的事(给我一行数据,我能撬动地球),我们总是喜欢开盘买入,这是为什么呢?开盘卖出是否是合理的呢?今天我们就利用聚宽提供的股票行情数据接口JQData,统计一下历史上日内走势的上涨下跌概率及幅度
工具 :JQdata ,python2 matplotlib: 2.0.2 pandas: 0.16.2
样本: 上证指数 2005年至2018年8月18日
中午休市前,下午收盘前(最后一分钟拉升概率为0.8),会有一个特别明显的盘尾拉升现象,而下午开盘时会有一个较大概率的跳空高开。
从日内的平均走势来看及概率统计,一天的最佳入场时间是早上开盘(统计表明低开的概率和幅度要高于上涨,每年的平均低开概率最高达到75%,而且低开的概率总是大于高开(07年牛市除外))
日内早盘的最佳的最佳出场时间点10:30;下午盘相对比较强势,可以在13:10入场或14:00出场(当然不可能仅靠这个去做交易,不过可以根据这个选择一下进出场的时间)。
最后只大致验证了一下开盘涨跌的情况,有兴趣的同学也可以试试其他几个时间点的概率和涨跌情况。
大家可以根据统计结果调整一下策略的买卖时间点,看看是否会产生意向不到的惊喜呢?
话不多说,直接上代码!
直接去克隆代码>>
# 登 录 (申请地址 : https://www.joinquant.com/default/index/sdk?f=home&m=banner)
from jqdatasdk import *
import pandas as pd
import matplotlib.pyplot as plt
# plt.rcParams['font.sans-serif']=['SimHei']
# mpl.rcParams['font.family']='SimHei' #用来正常显示中文 环境不同可能产生差异
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
auth('账号','密码')
# 数据获取
# fields_list = ['open', 'close', 'high', 'low', 'volume', 'money', 'avg', 'high_limit', 'low_limit', 'pre_close', 'paused', 'factor']
mdata = get_price('000001.XSHG',start_date='2005-01-01',end_date='2018-08-19',frequency='1m',fields=['close','pre_close'])
ddata = get_price('000001.XSHG',start_date='2005-01-01',end_date='2018-08-19',fields=['close','pre_close'])
# # 为了避免兼容或者其他如爆内存的问题,最好先将获取的数据保存到本地 dataframe建议保存为csv文件,panel建议保存为xls文件(to_excel)
# # mdata_.to_csv('000001m.CSV')
# # ddata_.to_csv('000001d.CSV')
# mdata = pd.read_csv('000001m.CSV',index_col=0)
# mdata.index = pd.to_datetime(mdata.index) #将索引转为datetime
# ddata = pd.read_csv('000001d.CSV',index_col=0)
# ddata.index = pd.to_datetime(ddata.index) #将索引转为datetime
# 数据计算
group_data = mdata.groupby(mdata.index.time).mean() #获取每个分钟的平均数据
pct_data = group_data.pct_change(-1,axis=1).close #获取上涨的平均幅度
p_data = (mdata.pct_change(-1,axis=1).close>0).groupby(mdata.index.time).mean() #获取上涨的平均概率
group_data.index = group_data.index.astype(str) #将time_index 转为 str_index 绘图时会需要
print ('下午收盘前5分钟平均上涨概率:%s'%round(p_data[-5:].mean(),2))
print ('下午收盘前最后一分钟上涨概率:%s'%round(p_data[-1],2))
print ('早盘休市前5分钟平均上涨概率:%s'%round(p_data[115:120].mean(),2))
print ('早盘最后一分钟上涨概率:%s'%round(p_data[119],2))
print ('下午开盘第一分钟上涨概率:%s'%round(p_data[120],2))
下午收盘前5分钟平均上涨概率:0.7
下午收盘前最后一分钟上涨概率:0.8
早盘休市前5分钟平均上涨概率:0.55
早盘最后一分钟上涨概率:0.66
下午开盘第一分钟上涨概率:0.63
print ('下午收盘前5分钟平均跌涨幅度:%s'%round(pct_data[-5:].mean(),6))
print ('下午收盘前最后一分钟跌涨幅度:%s'%round(pct_data[-1],6))
print ('早盘休市前5分钟平均跌涨幅度:%s'%round(pct_data[115:120].mean(),6))
print ('早盘最后一分钟跌涨幅度:%s'%round(pct_data[119],6))
print ('下午开盘第一分钟跌涨幅度:%s'%round(pct_data[120],6))
下午收盘前5分钟平均跌涨幅度:0.000161
下午收盘前最后一分钟跌涨幅度:0.000269
早盘休市前5分钟平均跌涨幅度:3.8e-05
早盘最后一分钟跌涨幅度:0.000124
下午开盘第一分钟跌涨幅度:0.000276
ax2 = (p_data-0.5).plot(kind='bar',figsize=(17,6),title = '平均每分钟跌涨概率及平均走势')
plt.axhline(0, c='k', linestyle="--")
group_data.close.plot(ax=ax2.twiny(),secondary_y=True,color='y')
# 从数据上看开盘第一分钟总是大跌,绘制在一起看起来不够美观,所以剔除9:31分的数据
ax1 = (pct_data)[1:].plot(kind='bar',figsize=(17,6),title='平均日内走势及跌涨幅度')
plt.axhline(0, c='k', linestyle="--")
group_data.close[1:].plot(kind='line',ax=ax1.twiny(),secondary_y=True,color='y')
pct_data = mdata.close.pct_change()
kp_data = pct_data[pct_data.index.time==datetime.time(9,31)]
pct = kp_data.groupby([kp_data.index.year])
ax1 = pct.mean().plot(kind='bar',figsize = (17,6),title='开盘第一分钟涨跌幅(相对于昨日收盘)')
ddata.close.plot(kind='line',ax=ax1.twiny(),secondary_y=True,color='y')
p = (kp_data>0).groupby([kp_data.index.year])
ax1 = (p.mean()-0.5).plot(kind='bar',figsize = (17,6),title='开盘第一分钟涨跌概率(相对于昨日收盘)')
ddata.close.plot(kind='line',ax=ax1.twiny(),secondary_y=True,color='y')