任意のボラティリティやリターンを持った仮想株のチャートを作れたらな、と思って、最近スプレッドシートをこねこねしてるんですけども。
ノリで始めただけなのに、これが結構面白かったので、今回はそんなお話。

まずはRAND関数でVOOに似た仮想株を生成してみよう!
例えば、VOO(S&P 500)は直近10年で、1日に最大±10%の変動をしてました。
じゃあRAND関数で-10~10%まで乱数を発生させればVOOに似せた仮想株ができるかも!?
……と思って作ってみたんですが。

表示させてみると、こんな感じ。

221020 仮想チャート_RAND関数

おおっ!
なんかそれっぽいのができた!

でもやっぱなんか違和感あるんですよね。
そもそも日々の変動率を、単純にRAND関数なんかで出しちゃってよいのか?

だって例えば、日々の変動率をRAND関数で出すと、2%動く確率も10%動く確率も同じになるでしょ。
でも現実のVOOは、1日で10%動くなんて、ここ10年で一度あるかないかって頻度。

実際に両者の1日の変動率をヒストグラムにして比べて見ると……

221020 ヒストグラム_VOO
221020 ヒストグラム_RAND関数

全然違ーう!!
RAND関数はアホの子なのかっ!?

………。
RAND関数は悪くないですね。私が使い所を間違ってるだけです。

さて、そんなRAND関数で作成した仮想株はご覧の通り、1日の変動率が均等に現れるんですね。
一方、現実のVOOはきれいな釣り鐘型ですね!(ガウス分布っていうの?)

この“釣鐘型”は感覚とも合致します。
0近傍が頻出し、極に向かうほど稀になるということですね。

3乗して確率に偏りを持たせたら……?
じゃあ、-10%から+10%の間で0付近が多く出るように乱数を作成するにはどうしたらいいだろう……?
例えば、-1から+1を乱数で発生させ、それを3乗したものに10を掛ければ、0付近の数値が多くでるのではなかろうか?

というわけで早速やってみた。
まずできたチャートはこんな感じ。

221020 仮想チャート_3次関数

うーん、まぁまぁ?
特に違和感はありませんが、じゃあ日々の変動率のヒストグラムはどうかというと。

221020 ヒストグラム_3次関数

おおっ! それっぽい!!
……のだけど、よく見ると“釣鐘型”じゃなくて、なんかやたらと中央だけ尖ってるんですよね……。

なんだろう……
愚かなぼくに対してヒストグラムが中指立ててるように見える……
お薬多めに飲んで凌ぐんじゃ!

三次関数のグラフ形状を考えればこうなるのは当然なんですけど、なんかもう少しこう、中央が丸みを帯びて欲しいですよね。
どうしたものか……といろいろ調べてたら。

ガウス分布を再現する関数がちゃんとあった
灯台下暗しというか、ただ私の考えが異常に足りなかっただけですが、ガウス分布に関する関数、普通にありました。

そりゃそうか。
そんな関数もあるでしょう。

しかし、私は統計学を学んだことがないので、割と意味が不明です。
最初、GAUSS関数を使えばなんとかなんのかな、と思ったけど、これは正規分布している集団が、標準偏差のN倍の範囲内に何%の確率で収まっているかを返す関数とかで(あってます?)、どうも私が求めているものではないっぽい!

で行き着いたのが、NORM.INV関数!
NORMとINVがそれぞれなんの略かもわかりませんし、なんだったら関数の意味もよく分かりません。
Microsoftによる説明にはこうあります。

指定した平均と標準偏差に対する正規分布の累積分布関数の逆関数の値を返します。

あーらら、日本語でおけ 笑。

全く意味が不明ですが、しかしなんかこのあたりから匂うんですよね。
正解への道筋の匂いが。

分からないなりに手探りでやってみましょう。
とりあえず、3つの引数にはそれぞれ「確率」「平均」「標準偏差」を入れればいいらしい。

「平均」は求める正規分布の中心である0を入れるとして(本来は1日当たりのリターンを入れるべき)、「標準偏差」は直近10年から算出した、VOOの1日の標準偏差である 0.0109 を入れときましょう。

問題は第一引数の「確率」ですね。
意味が分かりません。
とにかくどっかに乱数入れないと始まらないので、適当にここにRAND関数ぶちこんどきましょう。

あとは祈るだけ!

PCが爆発しませんように!
PCが爆発しませんように!

で、できたのがこれ。

221020 仮想チャート_NORM関数

……よく分からんけど、いい感じ……?
1日の変動率をヒストグラムで見ると……。

221020 ヒストグラム_NORM関数

おっ、ちょっと歪ですけどちゃんと釣鐘型になってますね!
(横軸の数値が意味不明なのには目を瞑ってください!)

でも、本物のVOOの形状と、なんか違いますね。
もう一度VOOの1日の変動率のヒストグラムを持ってくると、こんな感じ。

221020 ヒストグラム_VOO

うーん……、横軸のいじり方がイマイチわからなくて、単純に比較できませんね……。

でもVOOは直近10年で、下は-11.74%から上は9.54%まで変動してるんですよね。
それに引きかえ、ランダムに生成した仮想株価は、下は-3.75%から上は3.28%しか幅がありませんでした。
(ランダムに生成されるので、描画毎に違いますが、最大でも±4.2くらい)


やっぱり関数の使い方が違ったんですかね~?
それともお祈りが足りなかったんでしょうか?

しかし、まだ失敗と決まったわけではありません。
試しにこの生成した仮想株価の1日あたりの標準偏差(ボラティリティ)を測ってみると……
なんと1.09%!!

VOOの1日あたりの標準偏差と合致しますね!
どうやら正しく生成できていたようです。

現実は数式より奇なり?
しかし、そうなると、現実のVOOの外れ値が気になりますね。
数式によって導き出された仮想株の1日の最大変動率は、10年分書き出してみても、±4.2程度なんですけど、一方で現実のVOOは-11.74%から9.54%まで変動してます。

つまりこれは、日頃我々が、株をはじめとする様々な資産クラスに対してやれ「ボラティリティがいくらだ」とか「相関係数がいくらだ」とか言ってそれらを理解したつもりになっていたとしても、彼らはその“理解”を容易に超えてくるってことですよね。

さらに言えば、そうして理解した気になって、一時私も熱中してましたが、例えば効率的フロンティアなんかの難しい数式を解いてアセットを組んだとしても、あまり意味がないことを意味してるのかもしれません。
(だからといって、何も考えずに適当に銘柄を保有しろってわけでもありませんが!)

しかし、様々な思惑が交錯しながら形成される株価やその推移は、「数式」という、神さまかなにかが創ったシンプルなアルゴリズムの外にあるのかもしれません。
想定外の事が起こるという想定は、しておいた方がよいでしょう。

神すら予見できない我々の強欲! 恐るべし!

おわりに
探り探りやってたから、ちょっと長くなっちゃいましたね。
もっと簡潔に書くこともできましたが、こんな感じで日々(仕事をサボりながら)楽しく迷走してますよって、そんな話でした!

今回ほど、ちゃんと勉強しとけばよかったと後悔したことはありません……というのは嘘でちょいちょい後悔はしてますが、数学、特に統計学は生きる上で非常に大事なツールだと痛感しましたね。

だから、このあたりを修めている方々からすれば、愚か者が右往左往している姿を、神に似た視座から見られてさぞかし愉快だったことでしょう。
ムカつきますね!

その脳みそ、食わせろ!
オレ様 お前 丸カジリ!

今回できたもの
一応ここまででできたスプレッドシートを置いときます。
「仮想株生成マシーン(公開用)」
※編集する場合は、ファイルメニューからコピーをしてください

「ボラティリティ(年)」と「リターン(年)」を入力すると、10年分の“それっぽい”仮想株価が出力される仕組みです。

例によって、「薄いグレーのセル以外は触るな」というルール以外は特にありませんが、今回はRAND関数を使用しているため、どこかのセルを弄るたびに、ガンガン新しい株価が生まれていきますので注意ですね。

何の役に立つかは全くわかりませんが、遊んでいただければ、と!

今後の予定
ちなみにこれはまだ序章で、ここからさらに、作成した仮想株に対して、任意のボラティリティと相関を持った別の株を自動生成し、堅牢なポートフォリオを作るための実験をしたいと思ってます!

今さら堅牢なポートフォリオ作っても時すでに遅いけど! ★★

TECL万歳~~(玉砕中)