在本文中,我们将衡量交易策略的性能。并将开发一个简单的动量交易策略,该策略将使用四种资产类别:债券、股票和房地产。这些资产类别的相关性较低,使其成为极好的风险平衡选择。动量交易策略该策略基于动量,因为交易者和投资者早就意识到动量的影响,这种影响可以在广泛的市场和时间范围内看到。所以我们称之为动量策略。趋势跟踪或时间序列动量(TSM)是在单一工具上使用这些策略的另一个名称。我们将创建一个基本的动量策略并在TCS上对其进行测试以查看其性能。TSM策略分析首先,我们将导入一些库importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportyfinanceasyfimportffn%matplotlibinline我们构建基本动量策略函数TSMStrategy。该函数将通过时间序列的对数回报、感兴趣的时间段以及是否允许做空的布尔变量返回预期性能。defTSMStrategy(returns,period=1,shorts=False):如果空头:position=returns.rolling(period).mean().map(lambdax:-1ifx<=0else1)else:position=returns.rolling(period).mean().map(lambdax:0ifx<=0else1)performance=position.shift(1)*returnsreturnperformanceticker='TCS'yftcs=yf.Ticker(ticker)数据=yftcs.history(start='2005-01-01',end='2021-12-31')返回=np.log(data['Close']/data['Close'].shift(1)).dropna()performance=TSMStrategy(returns,period=1,shorts=False).dropna()年=(performance.index.max()-performance.index.min()).days/365perf_cum=np.exp(performance.cumsum())tot=perf_cum[-1]-1ann=perf_cum[-1]**(1/years)-1vol=performance.std()*np.sqrt(252)rfr=0.02夏普=(ann-rfr)/volprint(f"1天TSM策略收益率:"+f"\n\t{tot*100:.2f}%总回报"+f"\n\t{ann*100:.2f}%年回报率"+f"\n\t{sharpe:.2f}夏普比率")tcs_ret=np.exp(returns.cumsum())b_tot=tcs_ret[-1]-1b_ann=tcs_ret[-1]**(1/年)-1b_vol=回报。std()*np.sqrt(252)b_sharpe=(b_ann-rfr)/b_volprint(f"基线买入并持有策略收益率:"+f"\n\t{b_tot*100:.2f}%totalreturns"+f"\n\t{b_ann*100:.2f}%annualreturns"+f"\n\t{b_sharpe:.2f}SharpeRatio")函数输出如下:1-dayTSMStrategyyields:-45.15%总回报率-7.10%年回报率-0.17夏普比率基准买入并持有策略收益率:-70.15%总回报率-13.78%年回报率-0.22夏普比率就合理的年化回报率而言,1天TSM策略优于买入并持有策略因为1天的回顾可能包含许多错误趋势,我们尝试不同的时间段以查看它们的比较。在这里,我们在3、5、15、30和90天的循环中运行模型。将matplotlib.gridspec导入为gridspecperiods=[3,5,15,30,90]fig=plt.figure(figsize=(12,10))gs=fig.add_gridspec(4,4)ax0=fig.add_subplot(gs[:2,:4])ax1=fig.add_subplot(gs[2:,:2])ax2=fig.add_subplot(gs[2:,2:])ax0.plot((np.exp(returns.cumsum())-1)*100,label=ticker,linestyle='-')perf_dict={'tot_ret':{'buy_and_hold':(np.exp(returns.sum())-1)}}perf_dict['ann_ret']={'buy_and_hold':b_ann}perf_dict['sharpe']={'buy_and_hold':b_sharpe}forpinperiods:log_perf=TSMStrategy(returns,period=p,shorts=False)perf=np.exp(log_perf.cumsum())perf_dict['tot_ret'][p]=(perf[-1]-1)ann=(perf[-1]**(1/years)-1)perf_dict['ann_ret'][p]=annvol=log_perf.std()*np.sqrt(252)perf_dict['sharpe'][p]=(ann-rfr)/volax0.plot((perf-1)*100,label=f'{p}-DayMean')ax0.set_ylabel('Returns(%)')ax0.set_xlabel('Date')ax0.set_title('CumulativeReturns')ax0.grid()ax0.legend()_=[ax1.bar(i,v*100)fori,vinenumerate(perf_dict['ann_ret'].values())]ax1.set_xticks([ifori,kinenumerate(perf_dict['ann_ret'])])ax1.set_xticklabels([f'{k}-DayMean'iftype(k)isintelsetickerforkinperf_dict['ann_ret'].keys()],rotation=45)ax1.grid()ax1.set_ylabel('回报率(%)')ax1.set_xlabel('策略')ax1.set_title('年度回报率')_=[ax2.bar(i,v)fori,vinenumerate(perf_dict['sharpe'].values())]ax2.set_xticks([ifori,kinenumerate(perf_dict['sharpe'])])ax2.set_xticklabels([f'{k}-DayMean'iftype(k)是perf_dict['sharpe'].keys()],rotation=45)ax2.grid()ax2.set_ylabel('SharpeRatio')ax2.set_xlabel('Strategy')ax2.set_title('夏普比率')plt.tight_layout()plt.show()查看图表上的结果,我们可以看到15天动量指标提供了最好的结果。然而,其他时间框架的结果好坏参半。这说明我们的策略是不靠谱的。因此,我们也可以通过在顶部附近设置止损或追踪止损来退出交易,而不是在15日柱线下跌或持平时退出交易。投资组合分析到目前为止,我们已经用Python创建了一个交易策略。下面我们将测量和绘制常见的投资组合特征,以供我们进行观察分析。投资组合分析首先,我们将导入一些重要的库并观察数据的表现。将pandas_datareader.data导入为网络股票=['SPY','GLD','TLT','HYG']data=web.DataReader(stocks,data_source='yahoo',start='01/01/2019')['AdjClose']data.sort_index(ascending=True,inplace=True)perf=data.calc_stats()perf.plot()对数回报对数回报用于计算指数增长率。我们计算该时期的自然增长指数,而不是计算每个子时期的价格变化百分比。首先创建一个df,其中包含数据中每个股票价格的对数回报,然后我们为每个对数回报创建一个直方图。returns=data.to_log_returns().dropna()print(returns.head())SymbolsSPYGLDTLTHYG日期2019-01-03-0.0241520.0090250.0113150.0004942019-01-040.032947-0.008119-0.01164644-021904-0219070.0078540.003453-0.0029530.0096632019-01-080.009351-0.002712-0.0026310.0064702019-090.0046630.006398-0.001193所有四个资产类别的正态分布直方图如下所示具有正态分布的样本具有算术平均值和高于和低于平均值的均等分布(正态分布也称为高斯分布是对称的)。如果回报呈正态分布,预计99%以上的回报将落在均值的三个标准差范围内。这些钟形正态分布特征使分析师和投资者能够更好地对股票的预期回报和风险进行统计推断。具有钟形曲线的股票通常是波动性低且可预测的蓝筹股。最大回撤率DRAWDOWNDDRAWDOWN是指跌至相对谷底的数值。这是投资者需要考虑的重要风险因素。让我们画一个递减策略的可视化表示。ffn.to_drawdown_series(data).plot(figsize=(15,10))2020年上半年四项资产均出现下跌,其中SPY跌幅最大,达0.5%。然后,在2020年上半年,所有资产立即收回。这表明资产回报率很高。这些资产在2020年7月左右达到顶峰。按照这一趋势,一旦复苏达到顶峰,所有资产类别都出现小幅下跌。根据结果??,TLT将在2022年下半年经历0.5%的最大跌幅,然后在2023年初恢复。MARKOWITZ均值-方差优化1952年,马科维茨(MARKOWITZ)提出了均值-方差投资组合理论,也被称为现代投资组合理论。投资者可以使用这些概念来构建基于给定风险水平最大化预期回报的投资组合。基于马科维茨方法,我们可以生成“最优投资组合”。returns.calc_mean_var_weights().as_format('.2%')#ResultSPY46.60%GLD53.40%TLT0.00%HYG0.00%dtype:objectCorrelation统计相关性是一种用来衡量证券关系相互关系的统计方法。最好使用热图来查看此信息。热图使我们能够看到证券之间的相关性。returns.plot_corr_heatmap()最好在您的投资组合中具有较少相关的资产。除了SPY和HYG,所有四个资产类别的相关性都很低,这对我们的投资组合不利:因为如果你拥有高度相关的不同资产组,即使你分散了它们之间的风险,从投资组合的构建点来看看来,好处将微乎其微。总结使用所有为资产配置分析和绘制图表的数据,可以建立一个显着改变基础投资风险状况的投资组合。还有很多我没有提到,但是可以帮助我们确定交易策略价值的起点。我们会在后续的文章中加入更多的技术性能指标。
