ランダムウォークデータ同士のペアとボラティリティ

各データとペアのボラティリティの関係

2つのランダムウォークデータのボラティリティとペアのボラティリティの関係を調べてみる。第1のランダムウォークデータをベースとし、平均は0、標準偏差は変動させる。第2のランダムウォークデータをクウォートとし、平均は0、標準偏差は1.0で固定とする。ベースの標準偏差(ボラティリティ)を変動させることによってペアのボラティリティがどうなるかを見る。

データは累積和で作成しているので対数として扱う。したがって、ペアは「ベース / クウォート」ではなくて、「ベース - クウォート」となる。

試しにシミュレーションしてみたところ、どうやら以下のような関係にあるように思われた。

ペアのボラティリティ = sqrt(ベースのボラティリティ^2 + クウォートのボラティリティ^2)

さて、この想定に基づき、実測値と予測値のグラフを作成した。

実測値の上にほぼ完全に予測値が重なってしまい、よく分からなくなってしまった。それくらい一致しているわけで、上の想定で合っていると考えていいだろう。つまり、ランダムウォークデータ同士のペアのボラティリティは(ベースのボラティリティの2乗 + クウォートのボラティリティの2乗)の平方根である。

サンプルプログラム

○以下のコマンドをSpyderの「IPython console」にコピー&ペーストして「Enter」キーを2回押す。

import matplotlib.pyplot as plt
import numpy as np

def create_randomwalk_data(mean, std, size):
    temp = np.random.normal(loc=mean, scale=std, size=size)
    data = np.cumsum(temp)
    return data

n = 1000000

base_volatility = np.empty(10)
base_quote_volatility = np.empty(10)
base_quote_volatility_pred = np.empty(10)
quote = create_randomwalk_data(0.0, 1.0, n)
for i in range(10):
    base_volatility[i] = 1 + i
    base = create_randomwalk_data(0.0, base_volatility[i], n)
    base_quote = base - quote
    diff = base_quote[1:] - base_quote[:-1]
    base_quote_volatility[i] = np.std(diff)
    base_quote_volatility_pred[i] = np.sqrt(base_volatility[i]**2 + 1**2)

plt.plot(base_volatility, base_quote_volatility, label='base_quote_volatility')
plt.plot(base_volatility, base_quote_volatility_pred,
         label='base_quote_volatility_pred')
plt.title('Base/Quote Volatility')
plt.xlabel('Base Volatility (Quote Volatility = 1.0)')
plt.ylabel('Base/Quote Volatility')
plt.xlim(1, 10)
plt.legend()
plt.tight_layout()
plt.savefig('base_quote_volatility.png', dpi=150)
plt.show()
(2017/02/07更新)