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

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

目录
相关文章
|
28天前
|
缓存 Rust 算法
从混沌到秩序:Python的依赖管理工具分析
Python 的依赖管理工具一直没有标准化,主要原因包括历史发展的随意性、社区的分散性、多样化的使用场景、向后兼容性的挑战、缺乏统一治理以及生态系统的快速变化。依赖管理工具用于处理项目中的依赖关系,确保不同环境下的依赖项一致性,避免软件故障和兼容性问题。常用的 Python 依赖管理工具如 pip、venv、pip-tools、Pipenv、Poetry 等各有优缺点,选择时需根据项目需求权衡。新工具如 uv 和 Pixi 在性能和功能上有所改进,值得考虑。
85 35
|
1天前
|
数据采集 JSON 测试技术
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
102 82
|
29天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
260 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
19天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
101 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
7天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
2天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
24 12
|
1天前
|
数据采集 存储 前端开发
用Python抓取亚马逊动态加载数据,一文读懂
用Python抓取亚马逊动态加载数据,一文读懂
|
3月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
116 0
|
3月前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
73 2
|
3月前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
84 2

热门文章

最新文章