ビットコインの情報サイトの運営者ブログ

サイトには掲載していない仮想通貨に関する時事的な情報や個人的な感想など。中級者以上向け。

ビットコイン価格を計量分析して各種価格データとの相関関係を考察してみた

最近の話題といえばやはりビットコインの価格でしょう。価格予想でも書ければ面白いのですが、トレーダーでも投資家でもない私としては皆目見当がつかないので、中々探しても見つからないビットコインの価格データの計量分析を自分でやってみることにしました。
なお、どうしても専門用語を多く使ってしまっていますが、すべて説明していると1記事では収まらないのでかなり省略しています。またあくまで素人が趣味・独学の範囲で行っているものですので分析の誤り等にはご容赦ください。

使用するデータ

今回使用するデータとして、BTCJPY、BTCUSD、BTCCNY、USDJPY、EURUSD、USDCNY、TOPIX(日本株)、S&P 500(アメリカ株)、SSEC(中国株)、金、原油の11種を選びました。
為替、株、商品市場のそれぞれ代表的なものです。日経平均やNYダウでもいいのですが、より市場全体を代表する指標ということでTOPIXやS&P500を選んでいます。
期間としては、短期間での1000%以上の大暴騰からのMt.Gox事件&中国規制のダブルパンチで暴落した2013年末から2014年にかけての価格の急変動の影響を避けるために、2015年から2016年末までの二年間を対象としています。また、ビットコイン以外は休日の取引が行われていなかったりして365日分のデータが存在せず、曜日の価格変動への影響等もあると考えられ、補正が面倒なので日次ではなく週次データを用いています。

BTCと他指標との相関を調べる

計量分析では、まず単体(BTC価格レート自体)の分析を行うのも基本の一つですが、それもやっているととんでもなく長くなってしまうので、今回はとりあえず他指標との相関を見てみます。
今回はRという統計分析用のフリーソフトを使用しました。補助的にエクセルも使用しています。
まずはこんな感じで変数xに予めデータを用意しておきます。

> head(x)
  BTCJPY   BTCUSD   BTCCNY USDJPY EURUSD  USDCNY   TOPIX  S.P500     SSEC   GOLD   OIL
1  32650 272.9486 1680.950 119.62 1.1931 6.13712 1401.09 2020.58 3350.519 1204.0 50.04
2  31612 267.0873 1657.472 118.36 1.1831 6.11451 1380.58 2028.26 3229.316 1232.8 46.07
3  25151 213.9783 1305.910 117.54 1.1604 6.12366 1372.41 2019.42 3116.351 1276.9 48.69
4  32207 271.9491 1676.265 118.43 1.1238 6.15241 1402.08 2057.09 3383.182 1279.4 45.15
5  27937 237.5409 1485.608 117.61 1.1336 6.16393 1408.75 2020.85 3128.300 1276.2 49.57
6  26115 220.1743 1368.693 118.61 1.1321 6.14044 1424.92 2046.74 3095.124 1240.8 52.86

つづいてこれらのデータから相関係数を算出します。
f:id:jpbitcoin:20170111000603p:plain
量が多いので見づらいかもしれませんが、上(左)から三つはすべてBTC価格です。一般的に相関係数は0.7以上あれば強い相関があるとされます。BTC価格同士でほぼ1という非常に強い相関があるのは当然として、他に相関が高いのはUSDJPY(-0.66~-0.76)やUSDCNY(0.91~0.92)でしょうか。では、USDJPYとUSDCNYとの関係について見ていきましょう。・・・とはなりません。
実は時系列データの相関をみるとき、見せかけの相関といって実際は全く何の関係もないデータであっても相関を示す確率が高いためです。つまり相関係数に何の意味もない可能性があります。

安易に相関係数が計算されているのはいろんなサイトでよく見ますがちょっと寄り道して検証してみましょう。
まずはランダムな週次データ(2年間計104個)を適当に5つ生成し、BTCUSDとの相関係数を見てみます。

> random1=cumsum(rnorm(104))
> random2=cumsum(rnorm(104))
> random3=cumsum(rnorm(104))
> random4=cumsum(rnorm(104))
> random5=cumsum(rnorm(104))
> BTCUSDvrandoms=data.frame(BTCUSD,random1,random2,random3,random4,random5)
> chart.Correlation(BTCUSDvrandoms)

f:id:jpbitcoin:20170111002445p:plain
なんと2番目のランダムデータと5番目のランダムデータは0.8台という非常に強い相関を示してしまいました。ランダムに生成したデータであっても5個中2個も強い相関を示してしまうとは信頼性が低いと言えるのではないでしょうか。

> plot(BTCUSD,type="l")
> par(new=T)
> plot(random2,type="l",col="blue")
> par(new=T)
> plot(random5,type="l",col="red")

f:id:jpbitcoin:20170111003759p:plain
試しに相関が高かったデータをプロットしてみるとなんとなくトレンドが似ている、あるいは逆なことが分かります(黒がBTCUSD、青が二番目のランダムデータ、赤が五番目のランダムデータ)。そもそもビットコインに関わらず価格データというのは大体右上がりか右下がりのトレンドを形成するチャートになっており、トレンドが似ているというだけで相関係数が高くなってしまうので、安易に相関係数を計算して参考にしてしまうのは良くないのです。
(ただし、同じBTC価格で見れば非常に相関が高かったように、参考にならない場面が全くないわけではありません。)

さらなるデータとして、相関係数の経時変化を見てみましょう。先ほど計算した相関係数の期間は2015年から2016年の二年間の合計ですが、今回は1年間の相関係数の推移を計算しました。
f:id:jpbitcoin:20170111004609p:plain
なんだか常に相関が高いUSDCNYは置いといて、時期によって全く異なることがわかります。例えば、原油(OIL)を見ると2016年5月頃は-0.8と非常に負の相関が強かったものの、半年後には+0.8と完全に逆転しており最低でも相関係数の変化を見ないと誤った結論を出してしまうことになります。(そもそも原油がビットコインと相関があるとは考えづらいのにもかかわらず、かなり高い相関を示すのがおかしいといえます。)

これを見ると、最近言われているようにCNYの価格との相関はありそうな気がしてきますが、この相関はここ二年で顕著に見られるだけで2013年までさかのぼると全く相関はなくなります。(もちろん相関というのは動的に変化するものなので、実際に過去相関がなかったのに最近になって相関が出てきたということかもしれません。)
f:id:jpbitcoin:20170111005418p:plain

では普通に計算したのがダメならどうしたらよいのかというと、一つ前のデータとの差分=変化率の相関を見れば良いのです。変化率を見るというのは、要するに価格Aが上がったとき(下がったとき)、価格Bに対してどのような影響があるか、ということです。どちらも同時に上がったり下がったりすることが多いほど相関が高いということになります。
ということで、差分の相関係数を見てみましょう。単純に引き算をすると価格水準によって差が出てしまう(例えば60000円のものが60円下がるのと100円のものが60円下がるのでは全く異なります)ので変化率、それも対数変化率で見ていくことにします。

> x.diff=diff(log(x))
> head(x.diff)
       BTCJPY      BTCUSD      BTCCNY       USDJPY       EURUSD        USDCNY        TOPIX       S.P500
1 -0.03230806 -0.02170793 -0.01406574 -0.010589224 -0.008416850 -0.0036909416 -0.014746804  0.003793710
2 -0.22863914 -0.22170096 -0.23839325 -0.006952126 -0.019373339  0.0014953219 -0.005935382 -0.004367924
3  0.24728616  0.23974031  0.24966799  0.007543368 -0.032048974  0.0046839180  0.021388530  0.018482042
4 -0.14223185 -0.13527510 -0.12074379 -0.006948003  0.008682610  0.0018706862  0.004745938 -0.017774202
5 -0.06744211 -0.07592031 -0.08196783  0.008466734 -0.001324094 -0.0038181603  0.011412885  0.012730075
6  0.05776665  0.05902720  0.06128803 -0.001265449  0.002646438 -0.0009564148  0.023930277  0.024254700
         SSEC         GOLD          OIL
1 -0.03684495  0.023638658 -0.082660707
2 -0.03560753  0.035147260  0.055311691
3  0.08215386  0.001955953 -0.075483390
4 -0.07832691 -0.002504306  0.093395532
5 -0.01066176 -0.028130580  0.064261097
6  0.04028698 -0.011591748 -0.001514578
> chart.Correlation(x.diff)

f:id:jpbitcoin:20170111012042p:plain
先ほどとはうって変わって全般的に相関が低くなり、ビットコインに関してはどの価格データとも相関がないという結果になりました。このように差分をとると、ランダムなデータが間違って高い相関を示す確率は非常に低いと言えることがわかります。

f:id:jpbitcoin:20170111012414p:plain
相関係数の経時変化を見てもすべての期間で最大0.3程度となりました。この結果は昨年にArk Investという米投資会社とCoinbaseが共同で出した、ビットコインは他のアセットとの相関が低い新しいタイプのアセットであるというレポートの結果と一致します。同レポートでは相関係数の数字も出ていますが、2011年からスタートして年間の相関係数の変化を計算しており、その中で見られた最大のビットコインとの相関係数は0.4程度にしかすぎなかったと書かれています。レポート内の相関係数は、生の価格レートではなく変化率から計算したものであることが推察されます。
実は、今回計量分析を行ったのも、前はそうでもなかったのにも関わらず最近元との相関がやたら言われている気がしており、本当にそうなのか?と疑問に思ったからでした。

ちなみに変化率の相関係数は生レートの相関係数よりも有益であることは他の価格指標を基準とした相関係数を計算してみると分かります。
f:id:jpbitcoin:20170111013917p:plain
TOPIXとの相関係数の経時変化を描いたチャートです。年間を通して、USDJPYとの非常に強い相関、S&P500との強い相関が観測されます。逆にGOLDとは弱めの相関があります。生レートの相関係数のように一年のうちに強い相関から強い逆相関に急激に変化する、といったようなことはありません。

本題に戻ってBTCUSDとUSDCNYの相関について、変化率のデータ自体を見て本当に相関がないのか確認してみましょう。

> x.diff$BTCUSD
  [1] -0.0217079278 -0.2217009632  0.2397403084 -0.1352750973 -0.0759203138  0.0590272048  0.0191789425
  [8]  0.1307930610  0.0613321766  0.0064267778 -0.0878949159 -0.0744937854  0.0305853439 -0.1303853572
 [15]  0.0040293707  0.0185152604  0.0439621352  0.0128381051 -0.0378727912  0.0196556411 -0.0615620035
 [22]  0.0236167858  0.0371941606  0.0390911110  0.0386232018  0.0457467746  0.0800878875 -0.0438057372
 [29]  0.0501438768 -0.0427517371 -0.0614557093 -0.0260314596 -0.2060472383  0.0951879356  0.0425685630
 [36] -0.0415982374 -0.0159137877  0.0546857725  0.0051857679  0.0205629608  0.0738773015  0.0789321261
 [43]  0.2278482541  0.0559811599 -0.1363851382 -0.0254515935  0.1535508002  0.0490747714  0.1143886400
 [50] -0.0137887847 -0.0384110100  0.0286135591  0.0337765899 -0.1502190957  0.0124121531 -0.0509749929
 [57] -0.0003960401  0.0737019548  0.0922070629 -0.0033475131 -0.0556317589  0.0050937648 -0.0088758910
 [64]  0.0271732981 -0.0079319130  0.0084852706  0.0142342470  0.0750853932 -0.0396888775  0.0374832513
 [71] -0.0176657587 -0.0215715096  0.1825191031  0.0947747409  0.1865563039  0.0311555590 -0.1004198603
 [78]  0.0346758581 -0.0490126703  0.0371532372 -0.0277862343 -0.0756965750 -0.0279676809 -0.0404606826
 [85]  0.0304380949 -0.0213840424  0.0571549292  0.0004619185  0.0036548214 -0.0028222574  0.0090637540
 [92]  0.0082699535  0.0310905044  0.0178618802  0.0728084565  0.0094906647  0.0033695108  0.0420283080
 [99] -0.0067690100  0.0255839577  0.0355946805  0.0156182666  0.1329975266
> x.diff$USDCNY
  [1] -3.690942e-03  1.495322e-03  4.683918e-03  1.870686e-03 -3.818160e-03 -9.564148e-04  1.566934e-03
  [8]  1.832573e-03 -7.735964e-04 -1.365004e-03 -4.294240e-03 -1.125553e-03 -2.809589e-03  2.275817e-03
 [15] -1.927879e-03 -5.794176e-04 -2.085412e-04 -1.112407e-03 -7.713594e-04  1.354829e-03  8.228527e-04
 [22]  5.038887e-04  7.004266e-04 -2.424876e-03  8.494579e-04 -9.854175e-06 -8.540691e-05 -5.799745e-04
 [29]  0.000000e+00  1.872184e-02  1.612980e-06  2.939416e-02  1.317919e-03 -4.076767e-03 -1.725989e-03
 [36]  3.051730e-04  1.619870e-04 -1.572574e-05 -2.022818e-03 -5.235788e-03  5.848575e-03 -1.084054e-03
 [43] -2.411819e-03  3.494298e-03  3.224726e-03  1.167204e-03  1.601118e-03  1.559486e-03  8.105391e-03
 [50]  4.768318e-03 -5.602539e-04  6.920155e-03  5.550032e-03  2.060793e-03  5.871500e-04  1.271989e-03
 [57] -2.026525e-03 -8.003209e-03  9.169375e-04  4.404283e-03 -5.523735e-03 -2.796431e-03 -2.048502e-03
 [64]  2.417711e-03 -4.167649e-03 -2.331832e-03  2.432220e-03  3.519553e-03 -6.092662e-03  7.538207e-03
 [71]  3.160607e-03  3.291127e-03  4.998510e-03 -2.028679e-03  2.119827e-03 -3.355169e-03  1.253969e-02
 [78]  1.714436e-03  5.454570e-03 -1.614113e-04 -9.136606e-04 -7.545982e-03  4.540421e-03 -3.387949e-03
 [85]  1.916338e-03  3.686953e-03 -7.336642e-05  2.081070e-04  4.714493e-04 -2.716499e-03  3.135307e-04
 [92]  4.098348e-03  6.089475e-03  5.147574e-03  4.577916e-04  1.264483e-03  9.297873e-03  6.923999e-03
 [99]  7.004990e-04  1.237545e-02 -1.148856e-02  7.541433e-03 -1.586967e-03

104週(2年)分のデータについて、同じ方向に値動きした回数を数えてみます(エクセルで)。すると2年間で同じ動きをした回数は52回、違う動きをした回数は50回と全く参考にならない結果になりました(差分をとっているので全データは103個、そのうち一個は変化率ゼロなので除外)。ちなみに最近1年だと同じ動きが33回で違う動きが19回、最近6か月だと同じ動きが18回で違う動きが8回となりました。だんだんと相関が強くなっているような気もしますがそれでも70%程度の一致率ですし、サンプルが少ないとどうしてもばらつきが大きくなるので、データ自体をみただけでも短期的(週単位)な参考指標になるほど相関が強いかと言われれば微妙な感じです。
相関係数の大きさも見ると値動きの大きさにもあまり相関はないと思われます。

ここで一点注意しておきたいのが、一方の要素が他方の要素に遅れて影響を及ぼす場合、相関係数も低く表れてしまうという問題です。週次データなので、1日程度の影響のラグは吸収されるかもしれませんが、もしかしたら週単位で影響の遅れがあるかもしれません。ということでUSDCNYと一週先、二週先、・・・のBTCUSDとの相関係数を見てみます。

> BTCUSD.diff=x.diff$BTCUSD
> BTCUSD.lag=embed(BTCUSD.diff,5)
> BTCUSD.lag=as.data.frame(BTCUSD.lag)
> BTCUSD.lag=transform(BTCUSD.lag,USDCNY.lag=head(x.diff$USDCNY,n=99))
> head(BTCUSD.lag)
            V1          V2          V3          V4          V5    USDCNY.lag
1 -0.075920314 -0.13527510  0.23974031 -0.22170096 -0.02170793 -0.0036909416
2  0.059027205 -0.07592031 -0.13527510  0.23974031 -0.22170096  0.0014953219
3  0.019178942  0.05902720 -0.07592031 -0.13527510  0.23974031  0.0046839180
4  0.130793061  0.01917894  0.05902720 -0.07592031 -0.13527510  0.0018706862
5  0.061332177  0.13079306  0.01917894  0.05902720 -0.07592031 -0.0038181603
6  0.006426778  0.06133218  0.13079306  0.01917894  0.05902720 -0.0009564148

f:id:jpbitcoin:20170111030036p:plain
少し見づらいですが、V5がラグ無しのBTCUSDの変化率、V4が一週先のBTCUSDの変化率、V3が二週先のBTCUSDの・・・となります。図を見れば分かる通りいずれも相関があるとは言えません。
ということで相関分析を行った結果、少なくとも短期的なビットコインと各種指標(ドル元含む)との相関はなさそうであると言えそうです。

ビットコインと人民元との相関を改めて検証

f:id:jpbitcoin:20170111030740p:plain
でも、本当にビットコインと人民元は関係がないのでしょうか。BTCの取引量の大半は中国取引所であることも考慮して価格チャートを見ると、相関がないとはどうしても思えない気がしてきます。(本当は最初に全価格指標との生データの価格チャートを見たほうが良いんですが、スペースの都合上省略。)
ということで時系列データの計量分析を行う時の基本的な流れに沿って改めて検証してみます。なお、記事の長さの都合上、専門用語の説明はかなり省略するのでここから先は訳が分からないかもしれませんが、お許しください。
ちなみにここでは、BTCUSD_{今週}=aBTCUSD_{先週}+bUSDCNY_{先週}+ctとなるような定数abcを見つけることを目標とします。

1.単位根過程か検証

単位根過程というのは、元のデータは非定常過程だが差分をとると定常過程になるデータ系列のことです。定常過程とかって何?と思うでしょうが、ざっくり言えば、定常過程というのは時間依存しないデータ系列であり、非定常過程というのは時間依存するトレンドを含むデータ系列のことです。
定常過程の例を見ると分かりやすいでしょう。例えば、先ほどのBTCUSDの変化率は定常過程だと考えられます。

> plot(BTCUSD.diff,type="l")

f:id:jpbitcoin:20170111032540p:plain
このように、平均が一定(この場合は0)でトレンド成分などが一切ありません。逆に差分をとるということはトレンドを取り除いて相関を考えるという意味があります。経済データを含む時系列データは、多くの場合単位根過程であることが知られており、単位根過程は見せかけの相関が生じてしまうという特徴があります。
単位根過程を調べる方法は、単位根検定と呼ばれますが、ここではBTCUSDに対し二種類の単位根検定を実施してみましょう(計量分析の検定では方法によって結果が異なることがしばしばあります。)。

> pp.test(BTCUSD)

        Phillips-Perron Unit Root Test

data:  BTCUSD
Dickey-Fuller Z(alpha) = -9.3483, Truncation lag parameter = 4, p-value = 0.5742 #p値=0.5742>0.05から単位根過程
alternative hypothesis: stationary

> adf.test(BTCUSD)

        Augmented Dickey-Fuller Test

data:  BTCUSD
Dickey-Fuller = -1.4735, Lag order = 4, p-value = 0.795 #p値=0.795>0.05から単位根過程
alternative hypothesis: stationary

ということで単位根過程であると判断できそうです。
差分をとったデータ系列に対して単位根検定を実施してみると

> pp.test(BTCUSD.diff)

        Phillips-Perron Unit Root Test

data:  BTCUSD.diff
Dickey-Fuller Z(alpha) = -102.35, Truncation lag parameter = 4, p-value = 0.01 #p値=0.01以下より単位根過程でない
alternative hypothesis: stationary

 警告メッセージ: 
 pp.test(BTCUSD.diff):  p-value smaller than printed p-value
> adf.test(BTCUSD.diff)

        Augmented Dickey-Fuller Test

data:  BTCUSD.diff
Dickey-Fuller = -4.5249, Lag order = 4, p-value = 0.01 #p値=0.01以下より単位根過程でない
alternative hypothesis: stationary

 警告メッセージ: 
 adf.test(BTCUSD.diff):  p-value smaller than printed p-value

ということで変化率は単位根過程ではない=定常過程であることがわかります。
USDCNYのデータについても同様であることを確認しました。

2.共和分の関係があるかどうか検証

共和分とはお互いに平衡関係にあるようなことを指します。共和分の関係にあるとは、長期的に見ればお互いに乖離することなく共通の線形(直線的な)トレンドを描くような関係を指します。共和分の関係にあっても相関係数が低いこともありますし、逆に相関係数が高くても共和分の関係にないこともあります。2003年にノーベル経済学賞を受賞した概念でもあります。共和分の関係は単位根過程同士でしか成立し得ないので、まず単位根過程かどうか確認する必要があります(先ほど確認済み)。
いろいろとすっとばして三種類の共和分検定を実施してみましょう。

> BTCUSDvsUSDCNY=data.frame(BTCUSD, USDCNY)
> head(BTCUSDvsUSDCNY)
    BTCUSD  USDCNY
1 272.9486 6.13712
2 267.0873 6.11451
3 213.9783 6.12366
4 271.9491 6.15241
5 237.5409 6.16393
6 220.1743 6.14044
> egcm(BTCUSDvsUSDCNY)
USDCNY[i] =   0.0013 BTCUSD[i] +   5.8882 + R[i], R[i] =   0.9324 R[i-1] + eps[i], eps ~ N(0,  0.0504^2)
             (0.0001)             (0.0361)                (0.0481)

R[104] = -0.1086 (t = -1.055)

WARNING: BTCUSD and USDCNY do not appear to be cointegrated.
> po.test(BTCUSDvsUSDCNY)

        Phillips-Ouliaris Cointegration Test

data:  BTCUSDvsUSDCNY
Phillips-Ouliaris demeaned = -13.185, Truncation lag parameter = 1, p-value = 0.15 #p値=0.15以上により共和分の関係とはいえない

 警告メッセージ: 
 po.test(BTCUSDvsUSDCNY):  p-value greater than printed p-value
> summary(ca.jo(BTCUSDvsUSDCNY,type="eigen",spec="longrun"))

###################### 
# Johansen-Procedure # 
###################### 

Test type: maximal eigenvalue statistic (lambda max) , with linear trend 

Eigenvalues (lambda):
[1] 0.07518300 0.02950148

Values of teststatistic and critical values of test:

         test 10pct  5pct  1pct
r <= 1 | 3.05  6.50  8.18 11.65 #検定量=test=3.05<5%有意水準=8.18より共和分の関係とはいえない
r = 0  | 7.97 12.91 14.90 19.19 #以下すべて同じ

Eigenvectors, normalised to first column:
(These are the cointegration relations)

          BTCUSD.l2 USDCNY.l2
BTCUSD.l2    1.0000    1.0000
USDCNY.l2 -716.8156  329.0447

Weights W:
(This is the loading matrix)

             BTCUSD.l2    USDCNY.l2
BTCUSD.d -7.747367e-02 1.561291e-02
USDCNY.d  9.441207e-05 1.528301e-05

> summary(ca.jo(BTCUSDvsUSDCNY,type="trace",spec="longrun"))

###################### 
# Johansen-Procedure # 
###################### 

Test type: trace statistic , with linear trend 

Eigenvalues (lambda):
[1] 0.07518300 0.02950148

Values of teststatistic and critical values of test:

          test 10pct  5pct  1pct
r <= 1 |  3.05  6.50  8.18 11.65
r = 0  | 11.03 15.66 17.95 23.52

Eigenvectors, normalised to first column:
(These are the cointegration relations)

          BTCUSD.l2 USDCNY.l2
BTCUSD.l2    1.0000    1.0000
USDCNY.l2 -716.8156  329.0447

Weights W:
(This is the loading matrix)

             BTCUSD.l2    USDCNY.l2
BTCUSD.d -7.747367e-02 1.561291e-02
USDCNY.d  9.441207e-05 1.528301e-05

ということで、三種類の検定いずれからもBTCUSDとUSDCNYは共和分の関係にあるとはいえないという結果がでました。

> plot(egcm(BTCUSDvsUSDCNY))

f:id:jpbitcoin:20170111041420p:plain
ちなみに共和分の定義は、「ax_{t}+by_{t}が定常過程となるようなabが存在するとき、x_{t}y_{t}は共和分の関係がある」というものです。上グラフだと真ん中のグラフが定常過程だと共和分ということです。価格の生データよりは定常っぽいですが前半の時期はマイナスが続いていて中盤の時期はプラスで推移して・・・というように微妙にトレンドが出てしまっているので共和分ではないと判定されたのでしょう。

3.VARモデルで推定

次にいよいよBTCUSDとUSDCNYとの関係性をみたり、そこから将来の価格を予測するために、それぞれの価格の関係を考慮した統計モデルを推定します(共和分の関係にあると微妙に方法が変わってきます。)。
まずは価格レートの生データを用います。

> VARselect(BTCUSDvsUSDCNY,lag.max=4,type="trend")
$selection
AIC(n)  HQ(n)  SC(n) FPE(n) 
     1      1      1      1 

$criteria
                 1          2          3          4
AIC(n) -0.01262116 0.02692263 0.04435528 0.07313165
HQ(n)   0.05064040 0.13235855 0.19196558 0.26291632
SC(n)   0.14368905 0.28743965 0.40907911 0.54206229
FPE(n)  0.98749372 1.02745980 1.04583328 1.07692354

> var.raw=VAR(BTCUSDvsUSDCNY,p=1,type="trend")
> summary(var.raw)

VAR Estimation Results:
========================= 
Endogenous variables: BTCUSD, USDCNY 
Deterministic variables: trend 
Sample size: 103 
Log Likelihood: -286.919 
Roots of the characteristic polynomial:
0.9998 0.9236
Call:
VAR(y = BTCUSDvsUSDCNY, p = 1, type = "trend")


Estimation results for equation BTCUSD: 
======================================= 
BTCUSD = BTCUSD.l1 + USDCNY.l1 + trend 

          Estimate Std. Error t value Pr(>|t|)    
BTCUSD.l1  0.92402    0.04442  20.801   <2e-16 ***
USDCNY.l1  0.96255    1.38048   0.697   0.4873    
trend      0.59325    0.25356   2.340   0.0213 *  
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 29.48 on 100 degrees of freedom
Multiple R-Squared: 0.996,      Adjusted R-squared: 0.9958 
F-statistic:  8224 on 3 and 100 DF,  p-value: < 2.2e-16 


Estimation results for equation USDCNY: 
======================================= 
USDCNY = BTCUSD.l1 + USDCNY.l1 + trend 

            Estimate Std. Error t value Pr(>|t|)    
BTCUSD.l1  3.173e-05  4.998e-05   0.635    0.527    
USDCNY.l1  9.994e-01  1.553e-03 643.411   <2e-16 ***
trend     -3.306e-05  2.853e-04  -0.116    0.908    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.03318 on 100 degrees of freedom
Multiple R-Squared:     1,      Adjusted R-squared:     1 
F-statistic: 1.293e+06 on 3 and 100 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
          BTCUSD    USDCNY
BTCUSD 869.29252 -0.033521
USDCNY  -0.03352  0.001101

Correlation matrix of residuals:
         BTCUSD   USDCNY
BTCUSD  1.00000 -0.03427
USDCNY -0.03427  1.00000

> plot(var.raw)

f:id:jpbitcoin:20170111050653p:plain
ということでBTCUSD_{今週}=0.92402BTCUSD_{先週}+0.96255USDCNY_{先週}+0.59325tと求められました。
ちなみに一応予測データもプロットすることができます。

> plot(var.raw,n.ahead=26,ci=0.95)

f:id:jpbitcoin:20170111050808p:plain
半年後までやってみましたが、上値が1200ドル弱、下値が800ドル強というところでしょうか。しかし、この手の予測データは特に長期になるほど役に立たなくなっていくので、参考にはしないでください。

4.関係性を推定する

いよいよ最後に本題です。VARモデルから関係性を推定する方法は主に三つありますが、今回はそのうちの二つ、Granger因果とインパルス応答を見てみたいと思います。
まずは、先ほどは参考のため生レートのVARモデルを作りましたが、ここでは差分(変化率)のVARモデルを作ります。

> VARselect(BTCUSDvsUSDCNY.diff,lag.max=4,type="trend")
$selection
AIC(n)  HQ(n)  SC(n) FPE(n) 
     1      1      1      1 

$criteria
                   1             2             3             4
AIC(n) -1.590263e+01 -1.588421e+01 -1.582387e+01 -1.579569e+01
HQ(n)  -1.583899e+01 -1.577815e+01 -1.567539e+01 -1.560479e+01
SC(n)  -1.574535e+01 -1.562207e+01 -1.545688e+01 -1.532385e+01
FPE(n)  1.240490e-07  1.263720e-07  1.342719e-07  1.381831e-07
> var.diff=VAR(BTCUSDvsUSDCNY.diff,p=1,type="trend")
Granger因果

Granger因果とは因果関係を表すものですが、①理論などの仮定に基づかず純粋にデータのみから判断できる②因果の方向のみで関係の強さは分からない、といった特徴があります。Granger因果は単位根過程には適用できません。

> causality(var.diff,cause="x.diff.BTCUSD")
$Granger

        Granger causality H0: x.diff.BTCUSD do not Granger-cause
        x.diff.USDCNY

data:  VAR object var.diff
F-Test = 0.0052849, df1 = 1, df2 = 198, p-value = 0.9421


$Instant

        H0: No instantaneous causality between: x.diff.BTCUSD and
        x.diff.USDCNY

data:  VAR object var.diff
Chi-squared = 0.29621, df = 1, p-value = 0.5863


> causality(var.diff,cause="x.diff.USDCNY")
$Granger

        Granger causality H0: x.diff.USDCNY do not Granger-cause
        x.diff.BTCUSD

data:  VAR object var.diff
F-Test = 3.4514, df1 = 1, df2 = 198, p-value = 0.06468 #(1-0.06468)*100=93.53%


$Instant

        H0: No instantaneous causality between: x.diff.USDCNY and
        x.diff.BTCUSD

data:  VAR object var.diff
Chi-squared = 0.29621, df = 1, p-value = 0.5863

検定を実施するとUSDCNY→BTCUSD方向に93.53%信頼水準(6.47%有意水準)で影響を与えている、という結果がでました。つまり、やはり元のレートが何らかの形でBTCのレートに影響を与えているということは言えそうです。

インパルス応答

インパルス応答はGranger因果とは異なり、関係性の強さも推定できるものです。また、単位根過程(非定常過程)の場合でも使えると言われています。

plot(irf(var.raw,n.ahead=26,ci=0.95))

f:id:jpbitcoin:20170111152551p:plain
f:id:jpbitcoin:20170111152537p:plain
水準レベルでBTCUSDに正の方向に価格ショックを与えてもUSDCNYには全く影響なし、USDCNYに正の方向にショックを与えると影響が出ているように見えますが、5%有意水準の赤点線がマイナスのところまでかかっているので、ほぼ誤差範囲であまり影響なしといえるかもしれません。

plot(irf(var.diff,n.ahead=26,ci=0.95))

f:id:jpbitcoin:20170111153802p:plain
f:id:jpbitcoin:20170111153811p:plain
ちなみに差分に対して見てみても同様にほぼ影響なしとなります(むしろ負の方向と逆に影響)。

まとめ

ということで、計量分析をやってみたら相関があまり見られなかったということになりました。もちろん分析は万能ではありませんし限界もあるので、直ちに関係性が否定されるものではありませんが、言われているほどはっきりした相関ではないのかなという印象です。
このようにあまり相関がみられなかった原因として以下のような仮説が考えられます。

①ドル元レート自体が信用できない

元レートは完全な変動相場制ではなく政府によってかなり管理・制限を受けている相場です。そのため必ずしも人民元価格の下落=中国国内の資産流出の関係にはなっていない可能性があります。

②他の外部要因からの影響が大きい、影響の受け方が複雑

今回は主要な価格指標のみについて考察しましたが、もっと他に大きな影響を与えているものがあったり、あるいは単純に人民元→ビットコインのような流れがあるのではなく、複数の中間通貨・商品等を経て複雑なルートでビットコインへ資産が移動している可能性があります。

③内部要因による影響が大きい

そもそも内部要因による価格への影響が外部要因より大きいという可能性です。ビットコインに関するファンダメンタルズは、供給量であったりトランザクション数であったり他の従来の通貨よりデータが入手しやすいので、内部要因について定量分析してみても面白いかもしれません。

④仕手による影響が大きい

ビットコインはまだまだ市場が小さく仕手による価格操縦の影響が大きい可能性が考えられます。

おまけ

既にお気づきの方もいるかもしれませんが、今回後半で推定したVARモデルというのは最も一般的なモデルではありますが、1期間前のデータのみから現在のデータを説明するモデルであり、同時期に及ぼす影響というのは考慮されていません。そのため、インパルス応答を見てもlag=0のところは当然影響0となります。ということで念のため、SVARという同時点での影響も考慮できるモデルでも試してみましたが同じようにほとんど影響なしという結果が得られました。

> a=diag(2)
> a[1,2]=NA
> svar.raw=SVAR(var.raw,estmethod="direct",Amat=a,hessian=TRUE,method="BFGS")
> plot(irf(svar.raw))

f:id:jpbitcoin:20170111154544p:plain
f:id:jpbitcoin:20170111154559p:plain

> svar.diff=SVAR(var.diff,estmethod="direct",Amat=a,hessian=TRUE,method="BFGS")
> plot(irf(svar.diff))

f:id:jpbitcoin:20170111155015p:plain
f:id:jpbitcoin:20170111161530p:plain