COVID19对金融市场的影响
与10年前相比,当今市场的风险更大。社交媒体驱动的新闻,全球供应链的相互联系以及巨大的股票市场,使华尔街更容易受到攻击。——Principal Global Investors首席策略师Seema Shah
首先,来评估一下由于COVID19而对金融市场造成影响。我已经使用Python免费提供的API和代码来创建本文中的所有图表。所有这些代码都可以在GitHub上获得。
以下这段代码用于绘制SP500的每日百分比变化。
代码如下:
# Reading Data import pandas_datareader as pdr # Plotting import matplotlib.pyplot as plt plt.style.use('seaborn-darkgrid') # Data Manipulation import pandas as pd import numpy as np # get_data_yahoo(inst_ticker, start_date, end_date) data_sp = pdr.get_data_yahoo('^GSPC', '17-Nov-19') # Calculate the percentage change data_pc = data_sp.Close.pct_change() # Plot data_pc.plot(figsize=(10, 7), grid=True) plt.axvline('30-Jan-20') plt.show()
我使用了pandas_datareader的get_data_yahoo方法来获取S&P500的价格。
get_data_yahoo方法有两个参数,第一个是Yahoo Finance中S&P 500的“ ^ GPSC”,第二个是我要从中获取数据的日期。11月17日发现了第一例冠状病毒。因此,我使用了这个日期。
运行此代码时,我将获得包含六列的数据集,分别为开盘价,最高价,最低价,收盘价,成交量和调整后的收盘价。由于我们对每日百分比变化感兴趣,因此我将使用Python的pct_change()函数进行计算,并在对应列上调用它。例如,如果每日百分比变化从一百变为一百二十,那么此数据中的值将为0.02。
如果要在Python中绘制此列,只需传递该列的名称(在本例中为“ data_pc”)并调用函数plot,它将绘制数据列。这就是每日收益的图表。由于它看起来较小,因此我添加了一个网格并做了一些改进以增强其可读性。
每日百分比变化
除了S&P500,我还绘制了原油,黄金和TLT(美国市场20年期的美国国债)的图表。
# Read the timelines from the CSV file timelines = pd.read_csv('pandemics_timelines.csv').dropna() for col in timelines.columns[1:]: timelines[col] = pd.to_datetime(timelines[col]) # Read the data from yahoo fianance def get_data(tl): inst_list = ['^GSPC', 'CL=F','GC=F', 'TLT'] data = pd.DataFrame() for inst in inst_list: try: data[inst] = pdr.get_data_yahoo(inst, tl.first_case.iloc[0]-timedelta(days=30), tl.last_date.iloc[0]+timedelta(days=365))['Adj Close'] except Exception as e: print('No data available for ',inst, e) return data # Get data during covid19 pandemic covid_timelines = timelines.loc[timelines.pandemic_name=='covid19'] data= get_data(covid_timelines) # Plot daily percentage change def plot_daily_pc(data, tl): data_pc = data.pct_change().dropna() fig = plt.figure(figsize=(12, 8)) i = 0 for col in data_pc.columns: # Add the subplot sub = fig.add_subplot(2, 2, i+1) i = i+1 # Set title sub.set_title(col, fontsize=20) # Plot r = random.random() b = random.random() g = random.random() data_pc[col].plot(color=(r, g, b)) sub.set_ylabel('Returns') sub.grid(which="major", color='k', linestyle='-.', linewidth=0.2) sub.axvline(x=tl.first_case.iloc[0], color='RoyalBlue', linestyle='dashdot', linewidth=3) sub.axvline(x=tl.who_emergency.iloc[0], color='Red', linestyle='dashdot', linewidth=3) plt.tight_layout() plt.show() plot_daily_pc(data, covid_timelines)
我已经绘制了它们每个数据的每日百分比变化。更详细地说,蓝线是确定第一例病例的日期,红线是WHO宣布发生公共卫生紧急事件的日期。
我们可以看到S&P500的价格每天变化都几乎接近于零,而且我们可以看到,在WHO宣布紧急状态后的几天,波幅发生了急剧变化。每天的变化范围是5%到10%。此外,不仅S&P500,在原油,黄金和我们的TLT(也就是美国市场20年期国债)中也可以看到类似的变化特征。因此,我们可以轻松地得出结论,Corona正在使金融市场动荡不安。
查看这些图表的另一种方式是说有很多指标在下降,但也有很多指标在上升。那么,我如何评估市场的走势?
累计收益
为此,我绘制了四种情况的累积收益。开始日期是第一个病例被报道的前几天,最后一天是3月30日。
def plot_cumulative_returns(data,tl): data_cum_ret = (data.pct_change()+1).cumprod() data_cum_ret.plot(figsize=(10,7),grid=True) plt.legend(loc='best') plt.ylabel('Cumulative Returns') plt.axvline(x=tl.first_case.iloc[0],color='RoyalBlue',linestyle='dashdot',linewidth=3) plt.axvline(x=tl.who_emergency.iloc[0],color='Red',linestyle='dashdot',linewidth=3) plt.axvline(x=tl.pandemic_declaration.iloc[0],color='LightSeaGreen',linestyle='dashdot',linewidth=3) plt.axvspan(tl.last_date.iloc[0], tl.last_date.iloc[0]+timedelta(days=365),color='dodgerblue', alpha=0.2) plt.show() plot_cumulative_returns(data, covid_timelines
如您所见,红线是针对原油的,它似乎受到的影响最大。与最高层相比下降了近60%。表示S&P500的蓝线也显示出急剧下降的趋势。但是对黄金的影响不如S&P500和原油。
这是否意味着在这些不确定的时期,我们应该将黄金纳入投资组合中,作为合理的过渡?
看起来不错,但让我们不要这么快就得出结论。我们稍后会再讨论。最后的是美国国库券,该国库券急剧下降但很快就恢复了。
亏损
另一种方法是绘制下降图。简而言之,是衡量在任何特定时间段内从峰值下降的次数。现在看一下图表。
def calc_drawdown(data, tl): data_cum_ret = (data.pct_change()+1).cumprod() cum_rets = data_cum_ret.loc[tl.first_case.iloc[0]:tl.last_date.iloc[0]] # Calculate the running maximum running_max = np.maximum.accumulate(cum_rets.dropna()) # Ensure the value never drops below 1 running_max[running_max < 1] = 1 # Calculate the percentage drawdown drawdown = (cum_rets)/running_max - 1 return drawdown def plot_drawdown(drawdown, tl): fig = plt.figure(figsize=(12, 8)) i = 0 for col in drawdown.columns: # Add the subplot sub = fig.add_subplot(2, 2, i+1) i = i+1 # Set title sub.set_title(col, fontsize=20) # Plot drawdown[col].plot(color='r') sub.set_ylabel('Returns') sub.fill_between(drawdown.index, drawdown[col], color='red') sub.grid(which="major", color='k', linestyle='-.', linewidth=0.2) sub.axvline(x=tl.first_case.iloc[0], color='RoyalBlue', linestyle='dashdot', linewidth=3) sub.axvline(x=tl.who_emergency.iloc[0], color='red', linestyle='dashdot', linewidth=3) plt.tight_layout() plt.show() drawdown = calc_drawdown(data,covid_timelines) # Find the maximum drawdowns print(drawdown.min()*100) plot_drawdown(drawdown,covid_timelines)
例如,在S&P500图表中,2月前后出现了一个峰值,然后又下跌了近33%。每个亏损值如下:最大亏损
原油67.07%
SP500 33.92%
黄金11.80%
TLT 15.72%
SP500与原油,黄金和TLT的关系
亏损可以帮助我们了解资产类别可能下降多少,但它们仍然是不同的资产类别,对吗?我们如何比较它们,换句话说,它们之间是什么关系?
为了回答这个问题,我们将创建一个散点图。散点图可帮助我们了解不同数据之间的关系。
首先,我们将绘制不同数据的散点图。让我们看看它们的外观。
def plot_scatter(data, tl): data_pc = data.pct_change().dropna() temp = data_pc.loc[tl.who_emergency.iloc[0]:tl.last_date.iloc[0]] fig = plt.figure(figsize=(12, 8)) sub = fig.add_subplot(2, 2, 1) sub.scatter(temp['^GSPC'],temp['TLT'],color='red') sub.set_title('SP500 Returns Vs TLT Returns') sub.grid() sub = fig.add_subplot(2, 2, 2) sub.scatter(temp['^GSPC'],temp['GC=F'],color='blue') sub.set_title('SP500 Returns Vs Gold Returns') sub.grid() sub = fig.add_subplot(2, 2, 3) sub.scatter(temp['^GSPC'],temp['CL=F'],color='green') sub.set_title('SP500 Returns Vs Crude Oil Returns') sub.grid() # Correlation sum_corr = data_pc[data_pc.columns].corr() print('Correlation',sum_corr) plt.tight_layout() plt.show()
红色散点图是TLT与S&P500,它显示负相关。我们都知道,在危机时刻,经济放缓,而美联储和其他政府机构介入,费率下降。由于费率与价格之间存在反比关系,因此费率降低会导致价格上涨。因此,我们看到S&P500与TLT之间存在这种关系。但是,我们只有几个数据点,因此在这里得出结论是不明智的。
对于黄金,根据数据点在此图中的分布,我们认为与S&P500没有任何关系。对于原油和S&P500,似乎遥远的点呈负相关,而较近的点呈正相关。因此,我们目前不能真正得出任何结论。
这是在不同数据之间建立关系的一种方式。基于这些关系,我们可以创建一个在大流行时期对我们有用的投资组合。