使用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,似乎遥远的点呈负相关,而较近的点呈正相关。因此,我们目前不能真正得出任何结论。

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

目录
相关文章
|
2天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
4天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
4天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
11 1
|
5天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
5天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
10天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
20 3
|
4天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
10 0
|
4天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。
|
10天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
34 0
|
4天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
14 2
下一篇
无影云桌面