《实战:基于技术分析的Python算法交易.docx》由会员分享,可在线阅读,更多相关《实战:基于技术分析的Python算法交易.docx(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实战:基于技术分析的Python算法交易译者|Tianyu出品|AI科技大本营ID:rgznai100本文是用Python做交易策略回测系列文章的第四篇。上个局部介绍了以下几个方面内容介绍了zipline回测框架并展示了怎样回测根本的策略导入自定义的数据并使用zipline评估交易策略的表现这篇文章的目的是介绍怎样基于技术分析TA,TechnicalAnalysis来创立交易策略。在此引用维基百科的解释技术分析是指“基于对市场的历史数据、成交价格、交易量的研究来预测价格走势的一套方法。在本文中我会介绍怎样使用流行的Python库TA-Lib和zipline回测框架来计算TA指标。我会创立5种策
2、略然后研究哪种策略在投资期限内表现最好。安装我用到的库有以下几个pyfolio0.9.2numpy1.14.6matplotlib3.0.0pandas0.22.0json2.0.9empyrical0.5.0zipline1.3.0辅助函数在构造策略之前我要先定义几个辅助函数此处我只介绍其中一个因为它是最重要的一个。这个函数用来设置回测的起始时间因为我祈望所有策略开场施行的时间保持一致设置为2016年度的第一天。不过有些基于技术指标的策略需要一定数量的历史数据也就是所谓的warm-up阶段。请一定记住一点没有任何交易决策会发生在回测期的起始时间之前。defget_start_date(tic
3、ker,start_date,days_prior):start_date_dtdatetime.strptime(start_date,%Y-%m-%d)prior_to_start_date_dtstart_date_dt-relativedelta(days2*days_prior)prior_to_start_dateprior_to_start_date_dt.strftime(%Y-%m-%d)yahoo_financialsYahooFinancials(ticker)dfyahoo_financials.get_historical_price_data(prior_to_st
4、art_date,start_date,daily)dfpd.DataFrame(dftickerprices)formatted_dateifdf.iloc-1start_date:days_prior1new_start_datedf.iloc-days_priorreturnnew_start_date策略本篇文章中我们要解决的问题如下投资者有10000元的本金投资时限为2016-2017投资者仅投资Tesla的股票假设不存在交易本钱即交易佣金为零不存在做空行为投资者只能出售他们拥有的股票当投资者购置股票时他们会花掉全部本金之所以选择这段时期是因为2018年度中后的Quandl数据集还没
5、有更新我们祈望代码可以尽可能简化。关于怎样将数据载入zipline的更多细节请参考到我之前的文章。买入以及持有的策略我们首先来看最根本的策略买入以及持有。详细的思路是我们买入一定的资产在整个投资期间不进展任何操作。因此在投资第一天我们使用全部本金尽可能多地购置Tesla的股票接下来什么事情都不做。这种简单的策略可以作为其他高级策略的基准假设某种复杂的策略相比于基准策略反而损失了更多的钱那么讲明这种策略毫无用途。%zipline-start2016-1-1-end2017-12-31-capital-base10000.0-obuy_and_hold.pkl#importsfromzipline
6、.apiimportorder_percent,symbol,recordfromzipline.financeimportcommission#parametersSELECTED_STOCKTSLAdefinitialize(context):context.assetsymbol(SELECTED_STOCK)context.has_orderedFalsecontext.set_commission(commission.PerShare(cost0.0,min_trade_cost0)defhandle_data(context,data):#tradinglogicifnotcon
7、text.has_ordered:order_percent(context.asset,1)context.has_orderedTruerecord(pricedata.current(context.asset,price)接下来我们载入有关该策略表现的DataFramebuy_and_hold_resultspd.read_pickle(buy_and_hold.pkl)这里可能会出现ending_cash为负的情况原因是我们想要买入的股份是当天收盘时计算的于是使用的是收盘价格。然而这笔交易是次日执行的价格可能会发生大幅变化。在zipline中交易不会因为金额缺乏而被拒但我们可以通过负
8、的余额将其终止。我们可以想些方法防止这种情况的发生例如手动计算第二天要买入的股份并考虑股价上涨等因素以防止这种情况发生。我们使用一个辅助函数将该策略的细节进展可视化投资组合的变化交易价格序列和每天的收益情况。我们还使用了另一个辅助函数来观察策略的表现该函数将用于最后一局部buy_and_hold_resultspd.read_pickle(buy_and_hold.pkl)为了简洁起见我们不会展示每种策略的全部步骤因为它们的执行方式都是一样的。简单的挪动平均策略我们采用的第二种策略基于简单的挪动平均数方法SMA,SimpleMovingAverage。该策略的逻辑可以归纳为以下几步当20天的S
9、MA价格上升时买入股份当20天的SMA价格下降时卖掉全部股份用前19天以及当天的数据计算挪动平均数次日执行交易决策这是我们第一次调用预设辅助函数的地方计算起始日期以使投资者能在2016年度的第一个交易日制定交易决策。get_start_date(TSLA,2016-01-04,19)#2021-12-04在下面的策略中我们使用修改后的日期作为起始日期%zipline-start2021-12-4-end2017-12-31-capital-base10000.0-osimple_moving_average.pkl#importsfromzipline.apiimportorder_perce
10、nt,record,symbol,order_targetfromzipline.financeimportcommission#parametersMA_PERIODS20SELECTED_STOCKTSLAdefinitialize(context):context.time0context.assetsymbol(SELECTED_STOCK)context.set_commission(commission.PerShare(cost0.0,min_trade_cost0)context.has_positionFalsedefhandle_data(context,data):con
11、text.time1record(timecontext.time)ifcontext.timeMA_PERIODS:returnprice_historydata.history(context.asset,fieldsprice,bar_countMA_PERIODS,frequency1d)maprice_history.mean()#crossupif(price_history-2ma)(price_history-1ma)(notcontext.has_position):order_percent(context.asset,1.0)context.has_positionTru
12、e#crossdownelif(price_history-2ma)(price_history-1ma)(context.has_position):order_target(context.asset,0)context.has_positionFalserecord(pricedata.current(context.asset,price),moving_averagema)注意data.current(context.asset,price)等同于price_history-1.下列图展示了该策略下列图展示了20天的挪动平均价格序列。我们还对每一次交易做了标注即在记号之后的第一个交易
13、日执行此笔交易。挪动平均穿插挪动平均穿插策略MovingAverageCrossover可以看作是上一种策略的拓展版用两个不同规格的挪动窗口来代替单个的窗口。100天的挪动平均数序列中要隔很久才会出现价格的突变而20天的挪动平均数序列发生突变的速度要快很多。该策略的逻辑如下当较快的挪动平均值穿越较慢的挪动平均值时我们买入股份当较慢的挪动平均值穿越较快的挪动平均值时我们卖出股份一定要记住一点在这种策略中许多不同长度窗口的组合构成了速度不同的挪动平均数。对于该策略我们需要另外载入100天的数据以便于准备warm-up阶段。%zipline-start2021-8-11-end2017-12-31-
14、capital-base10000.0-omoving_average_crossover.pkl#importsfromzipline.apiimportorder_percent,record,symbol,order_targetfromzipline.financeimportcommission#parametersSELECTED_STOCKTSLASLOW_MA_PERIODS100FAST_MA_PERIODS20definitialize(context):context.time0context.assetsymbol(SELECTED_STOCK)context.set_
15、commission(commission.PerShare(cost0.0,min_trade_cost0)context.has_positionFalsedefhandle_data(context,data):context.time1ifcontext.timeSLOW_MA_PERIODS:returnfast_madata.history(context.asset,price,bar_countFAST_MA_PERIODS,frequency1d).mean()slow_madata.history(context.asset,price,bar_countSLOW_MA_P
16、ERIODS,frequency1d).mean()#Tradinglogicif(fast_maslow_ma)(notcontext.has_position):order_percent(context.asset,1.0)context.has_positionTrueelif(fast_maslow_ma)(context.has_position):order_target(context.asset,0)context.has_positionFalserecord(pricedata.current(context.asset,price),fast_mafast_ma,slo
17、w_maslow_ma)接下来我们绘制了两个挪动平均价格序列。我们可以发现该策略产生的交易行为要比SMA策略少得多。挪动平均线收敛差异MACD的全称为MovingAverageConvergence/Divergence即挪动平均线收敛差异指标是一种常用于股价技术分析中的指标。MACD由三个时间序列构成MACD序列快速短期以及慢速长期的两个指数挪动平均值的差值信号序列MACD序列的EMA指数挪动平均值差异序列MACD序列与信号序列之间的差值MACD的参数包括计算三个挪动平均数的天数即MACD(a,b,c)参数a表示快速EMAb表示慢速EMAc表示MACD序列的EMA。最常见的参数配置为MACD
18、(12,26,9)也是本文所采用的配置。假设每周有6个工作日这三个参数分别对应2个星期、1个月、1.5个星期。必须记住一点由于MACD是基于挪动平均方法进展计算的因此它是一种滞后指标。这就解释了为什么MACD在股市上的作用很小它无法得出准确的价格趋势。该策略的根本思想如下当MACD线穿越信号线向上时买入股份当MACD线穿越信号线向下时卖出股份以及之前一样为了准备warm-up我们要保证有34个历史数据值来计算MACD%zipline-start2021-11-12-end2017-12-31-capital-base10000.0-omacd.pkl#imports-fromzipline.a
19、piimportorder_target,record,symbol,set_commission,order_percentimportmatplotlib.pyplotaspltimporttalibastafromzipline.financeimportcommission#parameters-SELECTED_STOCKTSLA#initializethestrategydefinitialize(context):context.time0context.assetsymbol(SELECTED_STOCK)context.set_commission(commission.Pe
20、rShare(cost0.0,min_trade_cost0)context.has_positionFalsedefhandle_data(context,data):context.time1ifcontext.time34:returnprice_historydata.history(context.asset,fieldsprice,bar_count34,frequency1d)macd,macdsignal,macdhistta.MACD(price_history,12,26,9)if(macdsignal-1macd-1)and(notcontext.has_position
21、):order_percent(context.asset,1.0)context.has_positionTrueif(macdsignal-1macd-1)and(context.has_position):order_target(context.asset,0)context.has_positionFalserecord(macdmacd-1,macdsignalmacdsignal-1,macdhistmacdhist-1,priceprice_history-1)接下来我们绘制了MACD线以及信号线穿插点代表买入/卖出的信号。另外你可以以试着用直方图的形式来展现MACD差异。相对
22、强弱指标RSIRSI的全称为RelativeStrengthIndex即相对强弱指标也是一种用于创立交易策略的技术指标。RSI被看作是一种动量振荡器它可以估测价格变化的速度以及幅度。RSI指标评估了股价的向上力量与向下力量的比率。假设向上的力量较大那么计算出来的指标上升假设向下的力量较大那么指标下降。RSI的结果为0到100之间的数字一般按14天进展计算。为生成交易信号通常要指定RSI的下限为30上限为70。也就是讲30以下在超卖区70以上为超买区。有时候可以能会设定一个比拟居中的值比方在涉及到做空的策略中。我们可以以选择更极端的阈值如20以及80。不过这要求具备专业知识或在回测时尝试。这种策
23、略的思想如下当RSI低于下限30时买入股份当RSI高于上限70时卖出股份%zipline-start2021-12-10-end2017-12-31-capital-base10000.0-orsi.pkl#imports-fromzipline.apiimportorder_target,record,symbol,set_commission,order_percentimportmatplotlib.pyplotaspltimporttalibastafromzipline.financeimportcommission#parameters-SELECTED_STOCKTSLAUPPE
24、R70LOWER30RSI_PERIOD14#initializethestrategydefinitialize(context):context.time0context.assetsymbol(SELECTED_STOCK)context.set_commission(commission.PerShare(cost0.0,min_trade_cost0)context.has_positionFalsedefhandle_data(context,data):context.time1ifcontext.timeRSI_PERIOD1:returnprice_historydata.h
25、istory(context.asset,fieldsprice,bar_countRSI_PERIOD1,frequency1d)rsita.RSI(price_history,timeperiodRSI_PERIOD)ifrsi-1LOWERandnotcontext.has_position:order_percent(context.asset,1.0)context.has_positionTrueifrsi-1UPPERandcontext.has_position:order_target(context.asset,0)context.has_positionFalsereco
26、rd(rsirsi-1,priceprice_history-1,timecontext.time)下列图绘制了RSI指标以及上、下限效果评估最后一步把所有的评估指标放入一个DataFrame中然后观察其结果。我们会发如今回测时基于简单挪动平均方法的策略在收益方面表现最好其夏普指数也最高即在特定风险下可获得的收益最高。基于MACD的策略排在第二位。只有这两种策略的表现超过了我们所设置的基准。perf_dfpd.DataFrame(BuyandHold:buy_and_hold_perf,SimpleMovingAverage:sma_perf,MovingAverageCrossover:ma
27、c_perf,MACD:macd_perf,RSI:rsi_perf)perf_df.transpose()结论本篇文章介绍了怎样利用zipline以及talib进展交易策略的回测使用的技术指标包括挪动平均数、MACD、RSI等等。但这只是一些根底还有相当多更加复杂的策略。另外我们必须记住一点一些在过去表现很好的策略不一定也适用于将来。*本文为AI科技大本营编译文章转载请微信联络1092722531精彩推荐2019中国大数据技术大会BDTC再度来袭豪华主席阵容及百位技术专家齐聚15场优选专题技术以及行业论坛超强干货技术剖析行业理论立体解读深化解析热门技术在行业中的理论落地。6.6折票限时特惠立减1400元学生票仅599元推荐浏览AI科技大本营