Python中文社区(ID:python-china)本文将使用Python搭建一个简单的均线交叉交易策略进行回测,并使用标普500指数(S&P500)进行测试。简单的移动平均线交叉策略可能是使用技术指标的量化交易策略的最简单示例之一。在使用Python进行金融数据相关分析时,首先导入我们需要的模块(扫描本文底部二维码获取全部完整源码及JupyterNotebook文件包下载。):importpandasapdimportnumpyasnpfrompandas_datareaderimportdata我们会先使用pandas_datareader从雅虎财经下载标准普尔500指数从2000年第一个交易日到今天的价格数据,如下:sp500=data.DataReader('^GSPC','yahoo',start='1/1/2000')让我们快速检查一下数据的格式。sp500.head()让我们创建一个收盘价折线图,并查看标准普尔指数在此期间的表现。sp500['Close'].plot(grid=True,figsize=(8,5))我们要实施的趋势策略是基于两个简单移动平均线的交叉;2个月(42个交易日)和1年(252个交易日)移动平均线。我们的第一步是创建移动平均线并同时将它们附加到我们现有的sp500DataFrame中的新列表。sp500['42d']=np.round(sp500['Close'].rolling(window=42).mean(),2)sp500['252d']=np.round(sp500['Close'].rolling(window=252).mean(),2)上面的代码创建了列表并自动将它们添加到我们的DataFrame中。我们可以看到这样的图表(这里使用.tail调用,因为移动平均线直到第42天和第252天才真正有3个值,所以它只是在.head调用中显示为NaN):这里我们看到确实已经正确添加了移动平均线列表。现在让我们继续在同一张图表上绘制收盘价和移动平均线。sp500[['Close','42d','252d']].plot(grid=True,figsize=(8,5))我们的基础数据集现在已经很完整了,剩下要做的就是设计一个规则生成我们的交易信号。我们将有3个基本规则:1)买入信号(做多)-42天移动平均线首次高于252天趋势线X点。2)暂停交易——没有头寸。3)卖出讯号(空头)–42日均线首次低于252日趋势X点。创建这些信号的第一步是向DataFrame添加一个新列,这只是两个移动平均线之间的差异:sp500['42-252']=sp500['42d']-sp500['252d']步骤是通过添加我们称为Stance的另一列来形式化信号。我们还将信号阈值“X”设置为50(这是一个可以在某些时候优化的任意值)。X=50sp500['Stance']=np.where(sp500['42-252']>X,1,0)sp500['Stance']=np.where(sp500['42-252']<-X,-1,sp500['Stance'])sp500['Stance'].value_counts()最后一行代码生成如下结果:-12077118650251Name:Stance,dtype:int64表示在我们选择回测的时间段内,有2077个交易日42日均线低于252日均线50点以上,有1865个交易日42日均线高于252日均线50点以上平均的。绘图显示了“Stance”的视觉表示。我已将“ylim”(即y轴限制)设置为略高于1并略低于-1,因此我们实际上可以看到直线的水平部分。sp500['Stance'].plot(lw=1.5,ylim=[-1.1,1.1])在这个模型中,我们的投资者要么做多市场,要么做空市场,要么持平——这让我们能够处理市场回报.如果他做空,你可以简单地将当天的市场收益乘以-1,如果他做多则乘以1,如果持平则乘以0。因此,我们向DataFrame添加另一列以保存索引的每日每日回报,然后将该列乘以“Stance”列以获得策略回报:sp500['MarketReturns']=np.log(sp500['Close']/sp500['Close'].shift(1))sp500['Strategy']=sp500['MarketReturns']*sp500['Stance'].shift(1)注意我们如何将sp['Close']移动到列表向下移动,以便我们使用前一天收盘时的“立场”来计算第二天的回报。现在我们可以在同一张图表上绘制标准普尔500指数的回报与移动平均交叉策略的回报:sp500[['MarketReturns','Strategy']].cumsum().plot(grid=True,figsize=(8,5))我们可以看到,尽管该策略在市场低迷期间运作良好,但在市场反弹或刚好呈上升趋势时表现不佳。
