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

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

目录
相关文章
|
21天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费模式分析的深度学习模型
使用Python实现智能食品消费模式分析的深度学习模型
113 70
|
23天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
23天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费习惯分析的深度学习模型
使用Python实现智能食品消费习惯分析的深度学习模型
125 68
|
19天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费市场分析的深度学习模型
使用Python实现智能食品消费市场分析的深度学习模型
96 36
|
13天前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
60 15
|
17天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费趋势分析的深度学习模型
使用Python实现智能食品消费趋势分析的深度学习模型
77 18
|
19天前
|
数据可视化 编译器 Python
Manim:数学可视化的强大工具 | python小知识
Manim(Manim Community Edition)是由3Blue1Brown的Grant Sanderson开发的数学动画引擎,专为数学和科学可视化设计。它结合了Python的灵活性与LaTeX的精确性,支持多领域的内容展示,能生成清晰、精确的数学动画,广泛应用于教育视频制作。安装简单,入门容易,适合教育工作者和编程爱好者使用。
80 7
|
21天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
26天前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
42 8
|
1月前
|
存储 数据可视化 数据挖掘
使用Python进行数据分析和可视化
本文将引导你理解如何使用Python进行数据分析和可视化。我们将从基础的数据结构开始,逐步深入到数据处理和分析的方法,最后通过实际的代码示例来展示如何创建直观的数据可视化。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。让我们一起探索数据的世界,发现隐藏在数字背后的故事!