使用Python可视化并分析数据 大型流行病如何影响金融市场(一)

简介: 使用Python可视化并分析数据 大型流行病如何影响金融市场(一)

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()


image.png

 我使用了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)

image.png

 我已经绘制了它们每个数据的每日百分比变化。更详细地说,蓝线是确定第一例病例的日期,红线是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

image.png



 如您所见,红线是针对原油的,它似乎受到的影响最大。与最高层相比下降了近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)

image.png  

例如,在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()


image.png

 红色散点图是TLT与S&P500,它显示负相关。我们都知道,在危机时刻,经济放缓,而美联储和其他政府机构介入,费率下降。由于费率与价格之间存在反比关系,因此费率降低会导致价格上涨。因此,我们看到S&P500与TLT之间存在这种关系。但是,我们只有几个数据点,因此在这里得出结论是不明智的。

 对于黄金,根据数据点在此图中的分布,我们认为与S&P500没有任何关系。对于原油和S&P500,似乎遥远的点呈负相关,而较近的点呈正相关。因此,我们目前不能真正得出任何结论。

 这是在不同数据之间建立关系的一种方式。基于这些关系,我们可以创建一个在大流行时期对我们有用的投资组合。

目录
相关文章
|
1天前
|
机器学习/深度学习 算法 vr&ar
PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列
PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列
12 4
|
1天前
|
机器学习/深度学习 算法 Python
数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
15 4
|
1天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
16 0
|
1天前
|
机器学习/深度学习 数据挖掘 网络架构
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
11 0
|
1天前
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,提供DataFrame数据结构。基本步骤包括导入库、创建DataFrame及进行数据筛选。示例代码展示了如何通过布尔索引、`query()`和`loc[]`方法筛选`Age`大于19的记录。
9 0
|
2天前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
21 1
|
2月前
|
存储 数据可视化 数据挖掘
Python在数据分析中的利器:Pandas库全面解析
【2月更文挑战第7天】 众所周知,Python作为一种简洁、易学且功能强大的编程语言,被广泛运用于数据科学和人工智能领域。而Pandas库作为Python中最受欢迎的数据处理库之一,在数据分析中扮演着举足轻重的角色。本文将全面解析Pandas库的基本功能、高级应用以及实际案例,带您深入了解这个在数据分析领域的利器。
51 1
|
5月前
|
数据采集 存储 数据挖掘
【Python】数据分析:pandas
【Python】数据分析:pandas
49 0
|
4月前
|
数据采集 SQL 数据挖掘
Python 的科学计算和数据分析: 什么是 NumPy 和 Pandas?它们各自的作用是什么?
Python 的科学计算和数据分析: 什么是 NumPy 和 Pandas?它们各自的作用是什么?
|
6月前
|
数据可视化 数据挖掘 数据处理
【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)
【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)
185 0

热门文章

最新文章