Python量化因子测算与绘图的代码怎么写(python,开发技术)

时间:2024-04-29 05:00:09 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

量化因子的测算通常都是模拟交易,计算各种指标,其中:

  • 测算需要用到的第三方库:numpy,pandas,talib

  • 绘图需要用到的第三方库:matplotlib,seaborn

其他库随策略的需要额外添加

因子测算框架

这里博主分享自己测算时常使用的流程,希望与大家共同进步!

测算时从因子到收益的整个流程如下:策略(因子组合) -> 买卖信号 -> 买点与卖点 -> 收益

因此我们在测算时,针对每一个个股:

1. 预处理股票数据

首先这里是常用的一个工具导入,包括测算用的库与绘图用的库(含图片中文显示空白解决方案)

#测算用importnumpyasnpimportpandasaspdfromcopyimportdeepcopyfromtqdmimporttqdmfromdatetimeimportdatetimeimporttalib#绘图用importmatplotlibasmplimportmatplotlib.pyplotaspltimportseabornassns%matplotlibinline#绘图现实中文sns.set()plt.rcParams["figure.figsize"]=(20,10)plt.rcParams['font.sans-serif']=['ArialUnicodeMS']#当前字体支持中文plt.rcParams['axes.unicode_minus']=False#解决保存图像是负号'-'显示为方块的问题#其他importwarningswarnings.filterwarnings("ignore")

然后是循环读取股票的代码:

importosdefreadfile(path,limit=None):files=os.listdir(path)file_list=[]forfileinfiles:#遍历文件夹ifnotos.path.isdir(file):file_list.append(path+'/'+file)iflimit:returnfile_list[:limit]returnfile_liststock_dict={}for_fileintqdm(readfile("../data/stock_data")):ifnot_file.endswith(".pkl"):continue#TODO这里可以添加筛选,是否需要将当前的股票添加到测算的股票池中file_df=pd.read_pickle(_file)file_df.set_index(["日期"],inplace=True)file_df.index.name=""file_df.index=pd.to_datetime(file_df.index)file_df.rename(columns={'开盘':'open',"收盘":"close","最高":"high","最低":"low","成交量":"volume"},inplace=True)stock_code=_file.split("/")[-1].replace(".pkl",'')#TODO这里可以添加日期,用来截取一部分数据stock_dict[stock_code]=file_df

上面一部分是处理股票数据,处理后的数据都会保存在 stock_dict 这个变量中,键是股票的代码,值是股票数据

2. 指标测算

测算指标时,我们以一只股票为例:

for_index,_stock_dfintqdm(stock_dict.items()):measure_df=deepcopy(_stock_df)

代码中的:

  • 这里的measure_df即要测算的dataframe数据

  • 使用deepcopy是防止测算的过程影响到原始数据

然后我们就可以循环这一个股票的每一行(代表每一天),测算的交易规则如下:

  • 买入规则:买入信号发出&当前没有持仓,则买入

  • 卖出规则:卖出信号发出&当前有持仓,则卖出

#开始测算trade_record_list=[]this_trade:dict=Nonefor_mea_i,_mea_seriesinmeasure_df.iterrows():#循环每一天if发出买入信号:ifthis_tradeisNone:#当前没有持仓,则买入this_trade={"buy_date":_mea_i,"close_record":[_mea_series['close']],}elif发出卖出信号:ifthis_tradeisnotNone:#要执行卖出this_trade['sell_date']=_mea_ithis_trade['close_record'].append(_mea_series['close'])trade_record_list.append(this_trade)this_trade=Noneelse:ifthis_tradeisnotNone:#当前有持仓this_trade['close_record'].append(_mea_series['close'])

上述代码中,我们将每一个完整的交易(买->持有->卖),都保存在了trade_record_list变量中,每一个完整的交易都会记录:

{'buy_date':Timestamp('2015-08-3100:00:00'),#买入时间'close_record':[41.1,42.0,40.15,40.65,36.6,32.97],#收盘价的记录'sell_date':Timestamp('2015-10-1200:00:00')}#卖出时间#TODO也可以添加自定义记录的指标}

3. 测算结果整理

直接使用 pd.DataFrame(trade_record_list),就可以看到总的交易结果:

Python量化因子测算与绘图的代码怎么写

整理的过程也相对简单且独立,就是循环这个交易,然后计算想要的指标,比如单次交易的年化收益可以使用:

trade_record_df=pd.DataFrame(trade_record_list)for_,_trade_seriesintrade_record_df.iterrows():trade_record_df.loc[_i,'年化收益率']=(_trade_series['close_record'][-1]-_trade_series['close_record'][0])/_trade_series['close_record'][0]/(_trade_series['sell_date']-_trade_series['buy_date']).days*365#年化收益#TODO这里根据自己想要的结果添加更多的测算指标

4. 结果绘图

绘图的代码通常比较固定,比如胜率图:

#清理绘图缓存plt.cla()plt.clf()#开始绘图plt.figure(figsize=(10,14),dpi=100)#使用seaborn绘制胜率图fig=sns.heatmap(pd.DataFrame(total_measure_record).T.round(2),annot=True,cmap="RdBu_r",center=0.5)plt.title("胜率图")scatter_fig=fig.get_figure()#保存到本地scatter_fig.savefig("胜率图")scatter_fig.show()#最后显示
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Python量化因子测算与绘图的代码怎么写的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:如何将ChatGPT接入微信实现智能回复功能下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18