Skip to content

Library for fitting the LPPLS model to data.

License

Notifications You must be signed in to change notification settings

snussik/lppls

 
 

Repository files navigation

PyPI 📦   PyTests Downloads

Log Periodic Power Law Singularity (LPPLS) Model

lppls is a Python module for fitting the LPPLS model to data.

Overview

The LPPLS model provides a flexible framework to detect bubbles and predict regime changes of a financial asset. A bubble is defined as a faster-than-exponential increase in asset price, that reflects positive feedback loop of higher return anticipations competing with negative feedback spirals of crash expectations. It models a bubble price as a power law with a finite-time singularity decorated by oscillations with a frequency increasing with time.

Here is the model:

LPPLS Model

where:

  • Expected Log Price Colon Equals expected log price at the date of the termination of the bubble
  • Critical Time Colon Equals critical time (date of termination of the bubble and transition in a new regime)
  • A Colon Equals expected log price at the peak when the end of the bubble is reached at Critical Time
  • B Colon Equals amplitude of the power law acceleration
  • C Colon Equals amplitude of the log-periodic oscillations
  • m Colon Equals degree of the super exponential growth
  • omega Colon Equals scaling ratio of the temporal hierarchy of oscillations
  • phi Colon Equals time scale of the oscillations

The model has three components representing a bubble. The first, LPPLS Term 1, handles the hyperbolic power law. For m < 1 when the price growth becomes unsustainable, and at Critical Time the growth rate becomes infinite. The second term, LPPLS Term 2, controls the amplitude of the oscillations. It drops to zero at the critical time Critical Time. The third term, LPPLS Term 3, models the frequency of the osciallations. They become infinite at Critical Time.

Important links

Installation

Dependencies

lppls requires:

  • Python (>= 3.7)
  • Matplotlib (>= 3.1.1)
  • Numba (>= 0.51.2)
  • NumPy (>= 1.17.0)
  • Pandas (>= 0.25.0)
  • SciPy (>= 1.3.0)
  • Pytest (>= 6.2.1)

User installation

pip install -U lppls

Example Use

from lppls import lppls, data_loader
import numpy as np
import pandas as pd
%matplotlib inline

# read example dataset into df 
data = data_loader.sp500()

# 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
# use log price
price = np.log(data['Adj Close'].values)

# create Mx2 matrix (expected format for LPPLS observations)
observations = np.array([time, price])

# set the max number for searches to perform before giving-up
# the literature suggests 25
MAX_SEARCHES = 25

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

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

# visualize the fit
lppls_model.plot_fit()

# should give a plot like the following...

LPPLS Fit to the S&P500 Dataset

# define custom filter condition
filter_conditions_config = [
  {'condition_1':[
      (0.0, 0.1), # tc_range
      (0,1), # m_range
      (4,25), # w_range
      2.5, # O_min
      0.5, # D_min
  ]},
]

# compute the confidence indicator
res = lppls_model.mp_compute_indicator(
    workers=4, 
    window_size=120, 
    smallest_window_size=30, 
    increment=5, 
    max_searches=25,
    filter_conditions_config=filter_conditions_config
)
res_df = res_to_df(res, 'condition_1')
lppls_model.plot_confidence_indicators(res_df, title='Short Term Indicator 120-30')

# should give a plot like the following...

LPPLS Confidnce Indicator

If you wish to store res as a pd.DataFrame, use res_to_df.

Example
res_df = lppls_model.res_to_df(res, condition_name='condition_1')
res_df.tail()
# gives the following...

Other Search Algorithms

Shu and Zhu (2019) proposed CMA-ES for identifying the best estimation of the three non-linear parameters (Critical Time, m, omega).

The CMA-ES rates among the most successful evolutionary algorithms for real-valued single-objective optimization and is typically applied to difficult nonlinear non-convex black-box optimization problems in continuous domain and search space dimensions between three and a hundred. Parallel computing is adopted to expedite the fitting process drastically.

This approach has been implemented in a subclass and can be used as follows... Thanks to @paulogonc for the code.

from lppls import lppls_cmaes
lppls_model = lppls_cmaes.LPPLSCMAES(observations=observations)
tc, m, w, a, b, c, c1, c2 = lppls_model.fit(max_iteration=2500, pop_size=4)

Performance Note: this works well for single fits but can take a long time for computing the confidence indicators. More work needs to be done to speed it up.

References

  • Filimonov, V. and Sornette, D. A Stable and Robust Calibration Scheme of the Log-Periodic Power Law Model. Physica A: Statistical Mechanics and its Applications. 2013
  • Shu, M. and Zhu, W. Real-time Prediction of Bitcoin Bubble Crashes. 2019.
  • Sornette, D. Why Stock Markets Crash: Critical Events in Complex Financial Systems. Princeton University Press. 2002.
  • Sornette, D. and Demos, G. and Zhang, Q. and Cauwels, P. and Filimonov, V. and Zhang, Q., Real-Time Prediction and Post-Mortem Analysis of the Shanghai 2015 Stock Market Bubble and Crash (August 6, 2015). Swiss Finance Institute Research Paper No. 15-31.

About

Library for fitting the LPPLS model to data.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 100.0%