使用Python预测金融危机

从2020年2月20日的历史高位开始,到2020年3月9日,美国市场急剧下降,目前约为-16%。消息充斥着有关冠状病毒即将衰退的新闻,俄罗斯退出了欧佩克+协议,这打击了油价(每天-20%),明天(2020年3月10日),预计MICEX市场也将下降20%。我们在西方市场的股票报价。


全球衰退会等待着我们吗?在本文中,我们将尝试弄清楚如何使用Python提前看到衰退开始的信号。

为了回答这个问题,我们将尝试使用债券,股票和技术分析的收益率。我们将使用美国金融市场的历史数据作为世界上第一大股票市场。实际上,如果衰退开始于美国,那它将在世界范围内开始(就像2008年一样)。同样,对于我们来说,方便的是,有几十年的美国市场数据,这使我们可以分析一个重要的历史时期。

我们将从美联储网站yfinance库获取Yahoo Finance的历史数据。使用fredapi库的美国储备金,以及来自Quandl网站的通过pandas_datareader提供的各种财务信息请注意,对于Fed和Quandl,您需要注册才能获得API密钥(这是免费的)。

我们将在美国图表上直接在灰色区域标记所有美国的金融危机。

导入库
from fredapi import Fred
import pandas as pd
import os
import pandas_datareader.data as web
import pandas_datareader as pdr
%matplotlib inline
from matplotlib import pyplot as plt
from datetime import date
import yfinance
import numpy as np

api = 'YOUR API HERE'
os.environ["QUANDL_API_KEY"] = 'YOUR API HERE'
os.environ["TIINGO_API_KEY"] = 'YOUR API HERE'

fred = Fred(api_key=api)


我们使用Yahoo获取S&P500的历史数据,使用FRED获得债券收益率点差,以及使用FRED获得债券的累计收益率指数:

GSPC_h = yfinance.download("^GSPC", start="1962-01-01", end="2020-03-09") #SNP500
T10YFF = fred.get_series('T10YFF', observation_start='1962-01-01', observation_end='2020-03-09') #10YB-FFR
T10Y2Y = fred.get_series('T10Y2Y', observation_start='1976-06-01', observation_end='2020-03-09') #10YB-2YB
# ICE BofA US Corp 10-15yr Total Return Index Value
BAMLCC7A01015YTRIV = fred.get_series('BAMLCC7A01015YTRIV', observation_start='1962-01-01', observation_end='2020-03-09')

风险溢价


风险溢价是一个指标,它反映了投资者通过承担更大的风险将获得的额外获利能力。

金融市场就是这样运作的-投资回报率越高,风险越高。

为了计算风险溢价,有必要从风险资产的预期收益中减去无风险收益率。

对于美国市场,无风险收益率是美联储准备金率(与我们的关键利率类似)-FED。

股票和债券的风险溢价被认为是不同的。
对于债券:债券收益率(收益率)减去FED。
对于股票:利润/价格(E / P)指标减去FED,
其中利润是公司当年的利润,价格是计算指标时的股价。

要计算股票的获利能力,我们不会将支付的股利当作获利能力,而是将公司获得的利润视为收益,因为股利只是公司支付给股东的利润的一部分。实际上,通过购买股票成为公司的所有者,对我们来说,最终收入将恰好是在公司清算时将全部分配给股东的利润。

我们获得标准普尔500的E / P(SP500_EARNINGS_YIELD_MONTH),无风险利率(FED基金利率)和广泛市场公司债券收益率(Baa债券收益率):

# E/P
symbol = 'MULTPL/SP500_EARNINGS_YIELD_MONTH'
SP500_EARNINGS_YIELD_MONTH = web.DataReader(symbol, 'quandl', '1962-01-01', '2020-03-09')
# FED Funds Rate
FEDFUNDS = fred.get_series('FEDFUNDS', observation_start='1962-01-01', observation_end='2020-03-09')
# Baa Bonds Yield
BAA = fred.get_series('BAA', observation_start='1962-01-01', observation_end='2020-03-09')

我们将风险溢价计算为利润减去无风险利率:

#     
risk_premium = pd.concat([SP500_EARNINGS_YIELD_MONTH, FEDFUNDS],axis=1).fillna(method='bfill')
risk_premium['premium'] = risk_premium['Value'] - risk_premium[0]

#     
risk_premium_b = pd.concat([BAA, FEDFUNDS],axis=1).fillna(method='bfill')
risk_premium_b.columns = ['BAA', 'FEDFUNDS']
risk_premium_b['premium_b'] = risk_premium_b['BAA'] - risk_premium_b['FEDFUNDS']

让我们来看看发生了什么分别为股票和债券。

股票:

图形代码
fig, ax = plt.subplots(figsize=(17,6))

line1, = ax.plot(risk_premium['premium'],linewidth=1)
line1.set_label('risk_premium_stocks')

line2, = ax.plot(SP500_EARNINGS_YIELD_MONTH,linewidth=1)
line2.set_label('SP500_EARNINGS_YIELD_MONTH')
ax.legend(loc='upper left')

par1 = ax.twinx()
line3, = par1.plot(np.log(GSPC_h['Close']),linewidth=0.7, color='red')
line3.set_label('S&P500')
par1.legend(loc='upper left', bbox_to_anchor=(0, 0, 1, 0.88))

plt.xlim(left=date(1962, 1, 1), right=date(2020, 3, 9))
ax.axhline(linewidth=2, color='black', alpha=0.7)
ax.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1981, 7, 1), date(1982, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1980, 1, 1), date(1980, 7, 1), alpha=0.3, color='grey')
ax.axvspan(date(1973, 12, 1), date(1975, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1969, 12, 1), date(1970, 11, 1), alpha=0.3, color='grey')

ax.set_xlabel('')
ax.set_ylabel('  , %')
par1.set_ylabel('Log  S&P500')

plt.show()



对于债券:

图形代码
fig, ax = plt.subplots(figsize=(17,6))

line1, = ax.plot(risk_premium_b['premium_b'][date(1987, 12, 1):],linewidth=1, color='k')
line1.set_label('risk_premium_bonds')
ax.legend(loc='upper left', bbox_to_anchor=(0, 0, 1, 0.95))

par1 = ax.twinx()
line2, = par1.plot(np.log(BAMLCC7A01015YTRIV),linewidth=0.7, color='green')
line2.set_label('Log ICE BofA US Corp 10-15yr Total Return Index Value')
par1.legend(loc='upper left')
plt.xlim(left=date(1987, 12, 1), right=date(2020, 3, 9))

ax.axhline(y=1.5, linewidth=2, color='red', ls='--', alpha=0.7)

ax.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax.axhline(linewidth=2, color='black', alpha=0.7)

ax.set_xlabel('')
ax.set_ylabel('  , %')
par1.set_ylabel('Log  BofA')

plt.show()




如我们所见,危机前时期是股票的风险溢价为负而债券的风险溢价降低的区域。

同时,对于债券而言,降低风险溢价并不总是表示债券市场发生危机的信号(Bof指数仅在2008年才有所下降),但股票市场溢价的降低却几乎总是(除了1980年代初期危机发生后的时期,当时长期持有负溢价)导致股票价值下降。

负风险溢价对股票意味着什么?

当购买股票时,我们得到低于市场无风险利率的回报。同时,对股价波动和潜在损失的风险承担全部责任。这不是正常情况,投资者了解风险溢价不能为负,因此市场逐渐意识到股票的当前价值过高而开始销售。在广泛的投资者(普通人而非机构投资者)开始恐慌,出售其投资组合并加剧跌势之后,跌势加剧。因此,市场反应迅速而强烈。
值得注意的是,市场跌幅不会达到先前的风险溢价水平,而是会更加剧烈,这会大大增加风险溢价,并再次增强证券对投资者的吸引力。

此外,如果我们在一张图表上查看股票和债券的风险溢价,就会发现债券的风险溢价传统上高于股票,但是,在过去的五年中,它们已经同步,并且都逐渐趋向于零:

图形代码
fig, ax = plt.subplots(figsize=(17,6))

line1, = ax.plot(risk_premium['premium'],linewidth=1)
line1.set_label('risk_premium_stocks')

par1 = ax.twinx()
line3, = par1.plot(np.log(GSPC_h['Close']),linewidth=0.7, color='red')
line3.set_label('S&P500')
par1.legend(loc='upper left', bbox_to_anchor=(0, 0, 1, 0.88))

line2, = ax.plot(risk_premium_b['premium_b'],linewidth=1, color='k')
line2.set_label('risk_premium_bonds')
ax.legend(loc='upper left')
plt.xlim(left=date(1968, 1, 1), right=date(2020, 3, 9))

ax.axhline(linewidth=2, color='black', alpha=0.7)
ax.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1981, 7, 1), date(1982, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1980, 1, 1), date(1980, 7, 1), alpha=0.3, color='grey')
ax.axvspan(date(1973, 12, 1), date(1975, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1969, 12, 1), date(1970, 11, 1), alpha=0.3, color='grey')

ax.set_xlabel('')
ax.set_ylabel('  , %')
par1.set_ylabel('Log  S&P500')

plt.show()




截至2020年3月9日,尽管美国股市大幅下跌,但股票收益率仍远未达到负值区域,这发出了令人鼓舞的信号。

国债收益率差


危机前市场状况的另一种指标是长期和短期国债收益率之间的差异。

噪声最小且最实用的是10年期和2年期国债收益率之间的价差:

图形代码
fig, ax = plt.subplots(figsize=(17,6))
par1 = ax.twinx()
line, = ax.plot(pd.DataFrame(T10Y2Y),linewidth=0.4)
line.set_label('10YB-2YB')
ax.legend(loc='best', bbox_to_anchor=(0.5, 0., 0.5, 0.1))

line1, = par1.plot(np.log(GSPC_h['Close']),linewidth=0.7, color='red')
line1.set_label('S&P500')
par1.legend(loc='best', bbox_to_anchor=(0.5, 0., 0.5, 0.18))
plt.xlim(left=date(1976, 1, 1), right=date(2020, 3, 9))
plt.ylim(bottom=4)
ax.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1981, 7, 1), date(1982, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1980, 1, 1), date(1980, 7, 1), alpha=0.3, color='grey')
ax.axvspan(date(1973, 12, 1), date(1975, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1969, 10, 1), date(1970, 11, 1), alpha=0.3, color='grey')
ax.axhline(linewidth=2, color='black', alpha=0.7)
plt.scatter(date(2019, 9, 1), 6., color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(2007, 1, 1), 6., color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(2000, 1, 1), 5.9, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1998, 8, 1), 5.9, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1989, 4, 1), 5.8, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1981, 1, 1), 5.9, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1978, 11, 1), 5.9, color='orange', s=500, marker='o', alpha=0.5)

ax.set_xlabel('')
ax.set_ylabel('  , %')
par1.set_ylabel('Log  S&P500')

plt.show()




从历史角度来看,该指标是最真实的,并预测了最近的7次金融危机。

在这种情况下,债券收益率之间的价差反映了投资者的情绪-如果他们认为经济将很快恶化,便开始将资金从固定期限收益率的短期债券(期限为2年)转移到长期工具(期限为10年)最可靠的发行人是美国财政部。

购买长期债券会影响其收益,因为购买大量现金的债券会导致债券成本增加。当息票为固定价值时,债券主体的升值会导致其收益率下降。
对于在这种情况下出售的短期债券,情况恰恰相反-机构开始变得便宜,在固定的息票中,收益率开始增长。

但是,FRED在1976年之前没有提供有关该利差的更多信息,因此,出于说明目的,我们可以将10年期国债的收益率减去FED利率(而不是短期2年期国债)来了解自1962年以来发生的情况并涵盖了另外2次危机:

图形代码
fig, ax = plt.subplots(figsize=(17,6))
par1 = ax.twinx()
line, = ax.plot(pd.DataFrame(T10YFF),linewidth=0.4)
line.set_label('10-Year Treasury Constant Maturity Minus Federal Funds Rate')
ax.legend(loc='best', bbox_to_anchor=(0.5, 0., 0.5, 0.1))

line1, = par1.plot(np.log(GSPC_h['Close']),linewidth=0.7, color='red')
line1.set_label('S&P500')
par1.legend(loc='best', bbox_to_anchor=(0.5, 0., 0.5, 0.18))
plt.xlim(left=date(1962, 1, 1), right=date(2020, 3, 9))
plt.ylim(bottom=4)
ax.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1981, 7, 1), date(1982, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1980, 1, 1), date(1980, 7, 1), alpha=0.3, color='grey')
ax.axvspan(date(1973, 12, 1), date(1975, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1969, 12, 1), date(1970, 11, 1), alpha=0.3, color='grey')
ax.axhline(linewidth=2, color='black', alpha=0.7)
plt.scatter(date(2019, 9, 1), 6.7, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(2007, 1, 1), 6.7, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(2000, 11, 1), 6.7, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1998, 11, 1), 6.6, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1989, 6, 1), 6.4, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1973, 6, 1), 6.6, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1981, 3, 1), 6.3, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1979, 3, 1), 6.6, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1969, 3, 1), 6.6, color='orange', s=500, marker='o', alpha=0.5)
plt.scatter(date(1967, 1, 1), 6.6, color='orange', s=500, marker='o', alpha=0.5)

ax.set_xlabel('')
ax.set_ylabel('  , %')
par1.set_ylabel('Log  S&P500')

plt.show()




尽管这种利差普遍存在噪音(与10年至2年的利差比较),但通过减少利差至负值区域也实现了73和69的危机。

现在呢?
事情不是很顺利-该指标在2019年已经显示出负区域。
机构投资者期望在不久的将来,我们将面临严重的冲击,因此,它们将转向长期固定收益工具。

危机前还剩下多少?
从价差图可以看出,收益率倒挂预计将持续一到两年的危机。
鉴于这种反转发生在2019年底,并且由于对COVID-19病毒可能导致未来经济衰退的预期,美国市场已经开始下跌,这场危机正在临近。

截至2020年3月9日,美国10年期美国国债的收益率跌至0.318%-最低值!
似乎有大事在等着我们,而且已经开始了。

当前值T10YFF:-0.17
当前值T10Y2Y:0.25

过去的价格无法预测危机


以本期技术分析的无奈为例,我们采用RSI指标。
RSI-理论上的相对强度指数显示“超买”和“超卖”市场。
超买市场-这是价格必须下调的状态,即股市危机。

链接到Wiki,并附有指标的描述

我们可以使用Python计算该指标,为了进行计算,我们使用了周期-244个交易时段(1个日历年):

SP500_returns = GSPC_h['Close'].pct_change()
delta = GSPC_h['Close'].diff()
window_length = 500

# Make the positive gains (up) and negative gains (down) Series
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0

# Calculate the EWMA
roll_up1 = up.ewm(span=window_length).mean()
roll_down1 = down.abs().ewm(span=window_length).mean()

# Calculate the RSI based on EWMA
RS1 = roll_up1 / roll_down1
RSI1 = 100.0 - (100.0 / (1.0 + RS1))

图形代码
# Compare graphically
fig, ax = plt.subplots(figsize=(20,4))
plt.xlim(left=date(1968, 1, 1), right=date(2020, 3, 9))
line, = ax.plot(np.log(GSPC_h['Close']),linewidth=0.7, color='red')

line.set_label('SNP500')
ax.legend(loc='upper left')

fig1, ax1 = plt.subplots(figsize=(20,4))
plt.xlim(left=date(1968, 1, 1), right=date(2020, 3, 9))
line1, = ax1.plot(RSI1[80:],linewidth=1)

line1.set_label('RSI (1Y)')
ax1.legend(loc='upper left')

ax.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')
ax1.axhline(y=57, linewidth=2, color='black', alpha=0.7)
ax1.axhline(y=45, linewidth=2, color='black', alpha=0.7)

ax.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1981, 7, 1), date(1982, 11, 1), alpha=0.3, color='grey')
ax.axvspan(date(1980, 1, 1), date(1980, 7, 1), alpha=0.3, color='grey')
ax.axvspan(date(1973, 12, 1), date(1975, 2, 1), alpha=0.3, color='grey')
ax.axvspan(date(1969, 12, 1), date(1970, 11, 1), alpha=0.3, color='grey')

ax1.axvspan(date(1990, 8, 1), date(1991, 2, 1), alpha=0.3, color='grey')
ax1.axvspan(date(1981, 7, 1), date(1982, 11, 1), alpha=0.3, color='grey')
ax1.axvspan(date(1980, 1, 1), date(1980, 7, 1), alpha=0.3, color='grey')
ax1.axvspan(date(1973, 12, 1), date(1975, 2, 1), alpha=0.3, color='grey')
ax1.axvspan(date(1969, 12, 1), date(1970, 11, 1), alpha=0.3, color='grey')
ax1.axvspan(date(2007, 12, 1), date(2009, 6, 1), alpha=0.3, color='grey')
ax1.axvspan(date(2001, 3, 1), date(2001, 11, 1), alpha=0.3, color='grey')

ax1.set_xlabel('')
ax.set_xlabel('')
ax1.set_ylabel(' RSI')
ax.set_ylabel('Log  S&P500')

plt.show()




我们在RSI图表上看到了什么?

许多“超买”区域可能预示着过多的市场,现在该是下调的时候了。但是它继续上升(例如,自1995年以来很长一段时间,该指标显示为“超买”,但在2001年危机之前,它返回到其正常区域,并不表示“超买”,但以危机结束)。

换句话说,使用振荡器来预测危机是一项极富争议的工作。

在危机发生之前,市场保持平稳增长,没有像下跌那样呈现出很高的向上波动性,而是始终迅速而迅速。我们看到这恰好位于震荡指标的下边界附近,几乎总是在危机来临时,跌落谷接近时才准确地显示出它的交点。购买信号?

发现


目前,形势看起来令人震惊;有直接迹象表明可能出现衰退。除了已审查的指标外,还有工业生产指数(它导致经济(而非金融)危机的发生)。也可以深入研究宏观经济统计数据,并将国际收支,GDP等添加到分析中,但是,机构投资者已经为我们做到了这一点-他们的反应反映在长期和短期债券的收益率差中。如果您没有金融投资,则可以放松并观看节目。如果有的话-考虑一下可能对冲您的头寸,或者去缓存直到更好的时机。

All Articles