通过前面的文章,已经掌握了基本的策略回测流程,这样我们就可以通过回测找到表现优异的策略。下面的问题是,我们想按照某个策略去买入卖出股票,怎么去寻找当前满足这个策略买入卖出条件的股票呢?
我们之前的例子都是通过技术指标来判断买入卖出条件的,然而在我们下载的股票数据中,只有open(开盘价)、high(最高价)、low(最低价)、close(收盘价)、volume(成交量)5类数值,因此,我们所需做的工作就是,根据这5个数据计算出其他指标数据,得到股票的衍生数据,这样就能为后续根据指标数据判断当前是否满足买入和卖出条件做好数据准备。
这里为了快速实现技术指标的计算,我们选择了TopQ极宽魔改版talib金融函数库topq_talib,它是极宽团队基于talib使用pandas进行的二次封装库,输入参数一般为pandas.dataframe+若干数值参数,输出为pandas.dataframe,非常方便使用。topq_talib提供了33组指标的实现,也可以根据需要自行修改添加指标。
基于均值的计算方法,我们尝试添加了计算成交量均值的方法:
def vol_MA_n(df, n,ksgn='volume'):
'''
成交量均线
【输入】
df, pd.dataframe格式数据源
n,时间长度
ksgn,列名,一般是:volume成交量
【输出】
df, pd.dataframe格式数据源,
增加了一栏:vol_ma_{n},成交量均线数据
'''
xnam='vol_ma_{n}'.format(n=n)
ds2=pd.Series(df[ksgn], name =xnam,index=df.index);
ds3 = ds2.rolling(center=False,window=n).mean()
df = df.join(ds3)
return df
我们通过计算添加共26个新指标,添加前的数据如下图所示:
添加指标后的数据为:
可以看到指标已经成功添加到股票数据中。最后我们会将衍生后的数据保存在csv文件中,便于后续股票筛选。
还需要注意的是,为了开发速度,指标计算当前没有和backtrader中的指标计算方法完全一致,因此可能造成实际操作与backtrader的回测稍有差别。后续可以根据backtrader的指标实现,进一步优化我们的程序。
衍生数据代码:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import datetime # 用于datetime对象操作
import os.path # 用于管理路径
import sys # 用于在argvTo[0]中找到脚本名称
import pandas as pd
# 引入topq_talib
script_path = os.path.dirname(os.path.abspath(sys.argv[0]))
talib_path = os.path.join(script_path, '../TQDat/TQDown2020v1/topqt/')
sys.path.append(talib_path)
import topq_talib as tt
# 读入股票代码
stk_code_file = '../TQDat/TQDown2020v1/data/stock_code_update.csv'
stk_pools = pd.read_csv(stk_code_file, encoding = 'gbk')
# 对每个股票添加衍生数据
for stk_code in stk_pools['code']:
stk_code = '%06d' % stk_code
# 读入数据
input_file = '../TQDat/day/stk/' + stk_code + '.csv'
df = pd.read_csv(input_file, index_col = 0)
df = df.sort_index(ascending = True)
# MA
ma_list = [5, 10, 20, 30, 60, 120, 240]
for i in ma_list:
df = tt.MA_n(df, i)
# vol_MA
vol_ma_list = [5, 10, 20, 30, 60, 120, 240]
for i in vol_ma_list:
df = tt.vol_MA_n(df, i)
#BBANDS
df = tt.BBANDS_UpLow(df, 20)
#MACD
df = tt.MACD020(df, 12, 26)
#KDJ
df = tt.KDJ(df, 9, 3)
#RSI
df = tt.RSI(df, 14)
# 写出文件
output_file = './tmp/' + stk_code +'.csv'
df.to_csv(output_file)
博客内容只用于交流学习,不构成投资建议,盈亏自负!
个人博客:http://coderx.com.cn/(优先更新)
项目最新代码:https://gitee.com/sl/quant_from_scratch
欢迎大家转发、留言。有微信群用于学习交流,感兴趣的读者请扫码加微信!
如果认为博客对您有帮助,可以扫码进行捐赠,感谢!
微信二维码 | 微信捐赠二维码 |
---|---|