这篇文章介绍一下实时行情的获取。对于一个中线策略,如果能够获取到实时行情然后尾盘买入,我觉得这个策略成功率盈利能力都会更高一些(比开盘买入好吧)。因此我花了点时间研究了下实时行情获取及计算实时特征。
首先可以利用easyquotation包获取实时行情,包的github地址:
https://github.com/shidenggui/easyquotationgithub.com安装方法:
- 利用pip安装:pip install easyquotation
- 源码安装:直接把github源码下下来,然后终端运行python setup.py install。我是源码安装的,然后windows安装可能会报错,需要把setup.py第一行的”utf8”改成”utf-8”,如下图。
实时行情获取:
实时行情是从新浪或腾讯接口获取的,腾讯的数据会全一些,推荐用腾讯接口。
quotation = easyquotation.use('tencent') # 新浪 ['sina'] 腾讯 ['tencent', 'qq']
tmp_dict = quotation.market_snapshot(prefix=True) # prefix 参数指定返回的行情字典中的股票代码 key 是否带 sz/sh 前缀
运行完上述代码,tmp_dict是一个字典(包含所有股票数据,延时应该1秒不到),数据格式如下图:
每天在14.50左右获取所有股票的数据,然后计算我们模型的特征。14.50的交易价格可以近似为当日收盘价,成交量的话可以乘以1.05当做当日成交量。其他一些特征可以自己考虑如何近似。
下面放一个计算20日收盘价均线的代码给大家参考:(整个代码可以不到1分钟就能提取完,如果特征太多的话会慢一些,可以把需要的历史数据提前保存在一起减少读取数据时间)
def handle_history(base_path, tmp_dict):
company_info = pd.read_csv(os.path.join(base_path, 'company_info.csv'), encoding='gbk')
company_info['is_ST'] = company_info['name'].apply(JudgeST)
col = ['trade_date', 'ts_code', 'open', 'high', 'low', 'close',
'change', 'pct_chg', 'vol', 'amount', 'turnover_rate', 'volume_ratio']
df_list = []
features = []
ts_codes = []
for tmp_name in tqdm(company_info['ts_code']):
file_path = os.path.join(base_path, 'OldData', tmp_name + '_NormalData.csv')
df = pd.read_csv(file_path)
df = df.sort_values('trade_date', ascending=True).reset_index(drop=True)
try:
if 'SH' in tmp_name:
stock_info = tmp_dict['sh' + tmp_name[:6]]
elif 'SZ' in tmp_name:
stock_info = tmp_dict['sz' + tmp_name[:6]]
else:
print(tmp_name)
except:
# 可能有一些停牌企业
continue
feature = get_feature(stock_info, df)
features.append(feature)
ts_codes.append(tmp_name)
# break
return features, ts_codes
def get_feature(stock_info, df):
"""
stock_info:字典形式输入
df:股票历史信息 dataframe
"""
feature = []
# 计算20日收盘价 ma
tmp_list = list(df.iloc[-19:]['close'])
tmp_list.append(stock_info['now'])
feature.append(np.mean(tmp_list))
return feature
以下是每日涨跌停数量的统计:(测了下,和tushare提供的数据差别有点大,暂时还没时间找到原因)
# 涨跌停统计
def count_limit(tmp_dict):
up = 0
down = 0
for tmp_keys in tqdm(tmp_dict.keys()):
stock_info = tmp_dict[tmp_keys]
if 'ST' in stock_info['name']:
if stock_info['now'] >= round(stock_info['close'] * 1.05, 2):
up += 1
elif stock_info['now'] <= round(stock_info['close'] * 0.95, 2):
down += 1
else:
if stock_info['now'] >= round(stock_info['close'] * 1.1, 2):
up += 1
elif stock_info['now'] <= round(stock_info['close'] * 0.9, 2):
down += 1
return up, down
完整代码github:
https://github.com/wbbhcb/stock_market/blob/master/get_realtime_feature.pygithub.com