The bedrock of modern financial engineering is the random walk. Simulating a single random walk is easy, but what if you want to generate a correlated set of random walks? For example, suppose we want to simulate a simple spread between two correlated assets like two cash equity securities. This can be accomplished by using a mathematical construct called a copula:
Sklar’s Theorem states that any multivariate joint distribution can be written in terms of univariate marginal distribution functions and a copula which describes the dependence structure between the variables.
Copulas are popular in high-dimensional statistical applications as they allow one to easily model and estimate the distribution of random vectors by estimating marginals and copulae separately. There are many parametric copula families available, which usually have parameters that control the strength of dependence
Today we will focus on the Archimedean family of copulae, specfically the Gumbel copula. The basic idea behind the copula is that you can represent each marginal as a uniform random variable. In general, a copula (C) takes the following form:
Thus given two uniform random variables we can estimate the probability using the Copula function definition. Specifically, the Gumbel copula takes the bivariate form:
For example, suppose we want to simulate correlated random walks for YHOO and FB stocks. Note the Gumbel copula equation has one parameter, theta (u and v are the marginal uniform distributions of YHOO and FB). We can use the python library ambhas to estimate theta for our empirical relationship, which allows us to simulate correlated changes in each stock, as plotted in the figure below:
To start the simulation process, we have to download data for the stocks in question. We can do this by downloading intraday stock data from Google Finance (SEE PREVIOUS POST FOR CODE) and then estimate the copula from the empirical distributions:
import intraday # save google fin download code as intraday.py import pandas as pd import numpy as np import matplotlib.pyplot as plt from ambhas.copula import Copula base = "YHOO" hedge = "FB" interval = 60 window = 15 x = intraday.get_google_data(base, interval, window) y = intraday.get_google_data(hedge, interval, window) # merge data and convert to log differences combo = pd.merge(x[['c']], y[['c']], right_index = True, left_index = True) logs = np.log(combo) logs = logs.diff().dropna() gumbel = Copula(logs['c_x'], logs['c_y'], 'gumbel') # estimate the copula param x_sim,y_sim = gumbel.generate_xy(4800) # this does the simulation
Now x_sim and y_sim are simulated log changes in YHOO and FB, respectively. Thus we can use the exponential function in numpy to convert these changes back into realistic looking prices:
x_sum = x['c'].values[-1] * np.exp(x_sim.cumsum()) y_sum = y['c'].values[-1] * np.exp(y_sim.cumsum())
This uses the last price from the empirical data series as the starting price for each stock in our simulated random walks. Now we can plot the two and get a realistic looking graph:
The ambhas library has a number of dependencies you should make sure are installed before using the code above. These dependencies are described here. N. B.: we had to uninstall our current python statistics module and re-install using the instructions here. Otherwise you might get an error like “could not find cpdf in module” or some such. Making sure you have all dependencies installed should resolve this.
Categories: Quantitative Trading