可以度量金融泡沫的对数周期幂律

可以度量金融泡沫的对数周期幂律,香吗?

发现金融泡沫并预测到其何时破裂是很多从事金融行业的人的梦想。如今中国股市也成为了热门的话题,然而,资本狂欢之后是股灾,多少人因此从千万富翁炒股变成百万富翁,预测泡沫是所有人的梦想。我们的主角Sornette教授登场了。Didier Sornette是一位受过培训的统计物理学家和地球物理学家,目前在瑞士联邦理工学院苏黎世分校(Swiss Federal Institute of Technology in Zurich)任金融学教授,主讲创业风险。他似乎并没有因外界对这种综合学科研究方法的热情有所减弱而感到烦恼。相反,他还在做自己大部分职业生涯一直在做的事:不仅在主要物理期刊上发表文章,还在领先的金融期刊上发表文章。Sornette教授开始尝试着解答这个问题——不是通过传统的金融学方法,而是将物理学思想引入其中。作为2004年出版的《股市为什么会崩盘》(Why Stock Markets Crash)一书的作者,Sornette教授实质上是希望更深刻地理解泡沫的形成和发展。在对复杂体系的分析中,他独自——或者是和极少数几个人一起——引领着三个并行领域:纯物理学、应用经济学和计量经济学,以及市场从业人员。在《股市为什么会崩盘》一书中,Sornette教授全面分析了一个由其提出的预测市场泡沫的模型——对数周期幂律(LPPL)模型。该模型对之后许多次市场泡沫都进行了准确的预测,由于该模型由Johansen,Ledoit和Sornette共同提出并完善,因此也被称为JLS模型。我们来聊一聊它。

什么是对数周期幂率模型?
作为纯物理学家的Sornettee教授不甘于仅仅在物理学领域有所建树,他还看到了金光闪闪的华尔街,在那里,各类炼金术师在寻找各种允许少数人持续获利的方法。于是,Sornettee教授在金融领域的跨界之旅开始了。他脑洞大开,想将物理学模型延伸到金融学领域中,而他找到的第一把金光闪闪的钥匙叫做易辛模型——一种描述物质铁磁性的经典模型。简单地说,易辛模型认为单个原子的磁矩只可能有两种状态,+1(自旋向上)或者-1(自旋向下),原子以某种规则排列着,并存在着交互作用,使得相邻之间的原子的自旋互相影响。Sornette教授的眼睛仿佛一下子充满了光芒,他仿佛看到了美元纸币上的林肯在向他招手。受易辛模型启发,Sornette教授认为在金融市场中,投资者也只具有两种状态,即买或者卖。同时,投资者的交易行为取决于其他投资者的决策及外部因素的影响,这与易辛模型是多么的相似!

假想我们处于这样的一个市场中:资产没有派息、银行利率为零、市场极度厌恶风险,并且市场有着充足的流动性。显然,在这个市场中的金融资产没有任何价值,也就是其基础价值为零。在这样的框架内,市场中出现两类投资者,如上文所说,一类是理性投资者,一类是非理性的噪声投资者。后者具有羊群效应,使得金融资产价格偏离其基础价值,在没有足够的做空机制下,该结果导致理性投资者也不得不跟随噪声投资者的行为,通过享受泡沫来获得收益。最终当趋势达到某一临界值时,大量投资者没有足够的头寸维持该趋势,于是手中的卖单导致了市场的崩盘。那么这是一个怎样的趋势呢?Sornette教授考虑了自激励的正反馈过程的思想,而该过程会导致大量交易者的行为方式逐渐趋于一致。在经过一些推导之后,Sornette教授发现该趋势是按对数周期幂律(LPPL)增长,这里给出唯一的也是最重要的公式。

这是他的标准样式:其中蓝色线代表标普500走势,绿色线代表LPPL确信值
在这里插入图片描述
看起来确实在最高峰区域检测到了泡沫可能破裂。然而这个东西真的好用吗?是否是in sample testing 产生的这种神奇效果?

我的尝试

我取沪深300指数一端最显著的牛市区间 20050603 – 20071003来做试验。
其中20050603–20070301数据用来做训练,之后的数据做验证。同时为了更好地观察随着大顶越来越接近,模型提示的critical time是否会递减,从20071003开始按交易日颗粒度进行增量滚动训练、预测。

过程代码

from lppls import lppls, data_loader
import numpy as np
import pandas as pd
%matplotlib inline
import time
import datetime
import matplotlib.pyplot as plt
enddate=''.join(str(datetime.date.today()).split('-'))
import tushare as ts
pro = ts.pro_api('保密')

# read example dataset into df 
data = ts.pro_bar(ts_code='000300.SH', asset='I', start_date='20050603', end_date='20071003',adj='qfq').sort_values('trade_date')
# convert index col to evenly spaced numbers over a specified interval
time = np.linspace(0, len(data)-1, len(data))
# create list of observation data, in this case, 
# daily adjusted close prices of the S&P 500
price = [p for p in data['close']]
# create Mx2 matrix (expected format for LPPLS observations)
observations = np.array([time, price])

tested=pd.DataFrame()
count=0
for i in data[data.trade_date>'20070301'].trade_date.values:
    test_data=data[data.trade_date<=i]
    time = np.linspace(0, len(test_data)-1, len(test_data))
    # create list of observation data, in this case, 
    # daily adjusted close prices of the S&P 500
    price = [p for p in test_data['close']]
    # create Mx2 matrix (expected format for LPPLS observations)
    observations = np.array([time, price])
    
    # the literature suggests 25
    MAX_SEARCHES = 100

    # instantiate a new LPPLS model with the S&P 500 dataset
    lppls_model = lppls.LPPLS(use_ln=True, observations=observations)

    # fit the model to the data and get back the params
    tc, m, w, a, b, c = lppls_model.fit(observations, MAX_SEARCHES, minimizer='Nelder-Mead')

    # visualize the fit
    #lppls_model.plot_fit(observations, tc, m, w)
    count+=1
    print('calculating {}th data in {}datas'.format(count,len(data[data.trade_date>'20070301'].trade_date.values)))
    tested=tested.append(pd.DataFrame({'date':i,'critical_time':tc,'critical_time2':tc-len(time),'m':m,'w':w,'a':a,'b':b,'c':c},index=[i]))

有很多不收敛的情况
在这里插入图片描述

plt.figure(figsize=(15, 8))  
(tested['critical_time2']).plot()
(data.set_index('trade_date').loc['20070301':]['close']/10).plot()

上结果。橙色线为沪深300指数2007的走势,蓝色线为滚动计算的critical time(预示着当前时间离泡沫顶的天数)在这里插入图片描述
可以看出,有些时候在大跌前critical time会下降,但胜率不是很高。模型在2007年9月28日这个时间节点上认为泡沫顶会出现在从当前算起的106个交易日。
在这里插入图片描述
而我们已经知道结果了,实际上这个泡沫顶发生在2008年1月15日。也就是71个交易日后。计算结果滞后30天左右。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值