効率的フロンティアの解析解
現代ポートフォリオ理論の効率的フロンティアの解析解について調べたことをまとめました。
卵は一つのカゴに盛るな
ファイナンスの世界では、先人たちの経験をもとにした「卵は一つのカゴに盛るな」という格言があります。 これは一つのカゴに全ての卵を盛ると落としたときに全ての卵が割れてしまいますが、複数のカゴに分けて盛ると全ての卵が割れる事態を回避できることを示したものになります。 このようなリスクを最小化する分散投資が重要であることは昔から経験的に知られていました。
現代ポートフォリオ理論とは?
現代ポートフォリオ理論とは、リスクのある投資する場合のポートフォリオの配分をどのように合理的に決定すべきかを示した理論です。 この理論では、投資家は同じリターンが見込まれるのであればリスクを回避するという仮定をおいています。 これはポートフォリオの投資収益率の平均・分散にのみを考慮して、投資収益率の分散(リスク)を最小化することを意味します。 分散(リスク)を最小化するためには「卵は一つのカゴに盛るな」という先人の知恵を活かします。
卵を複数のカゴに分けるようにそれぞれのポートフォリオの配分をとします。 それぞれ投資収益率の平均・分散は次のように示されます。 ポートフォリオ数は、ポートフォリオの共分散行列の要素をとします
この式からポートフォリオの配分を変えることによって、投資収益率の分散(リスク)をコントロールすることが可能であることが分かります。
効率的フロンティアの解析解
分散を最小化した場合の、リスク・リターン平面における曲線は最小分散フロンティアと呼ばれており、その中でリターンが高いものを効率的フロンティアと言います。 その解析解を求めます。 以下のように、等式制約がある最適化問題として定式化します。
この問題は、ラグランジュの未定乗数法を使用することで解析解を求めることが可能となります。 ラグランジュ関数は以下のようになります。
式はに対して線形なので共分散行列の逆行列の要素を使って以下のように書き換えることが可能です。
式にをかけて について合計すると以下のようになります。
さらに、式を について合計すると以下のようになります。
それぞれ を以下のように定義すると式 から についての線形式が導出されます。
とすると、は以下のように解けます。
次に式 に をかけてについて合計したものが次のようになります。
式(6)が最小分散フロンティアです。 このようにして解析解を得ることができました。 次に、テストデータを使って効率的フロンティアをプロットしていきます。
実装
以下は、Juliaで実装したコードです。
using Plots using Statistics using DataFrames using CSV using LinearAlgebra open("./49_Industry_Portfolios.CSV", "r") do f global df csv = join(readlines(f)[2268:2361], '\n') df = CSV.read(IOBuffer(csv)) end # preprocessing inds = describe(df).min .> -99 # remove missing value inds[1] = 0 # remove year inds = inds .* range(1; stop=length(inds)) filter!(x -> x > 0, inds) df_sub = df[:, inds] mat = convert(Matrix, df_sub) E = mean(mat; dims=1) v = inv(cov(mat)) n = size(mat)[2] A = 0.0 for i in 1:n for j in 1:n A += v[i,j]E[j] end end B = 0.0 for i in 1:n for j in 1:n B += v[i,j]E[i]E[j] end end C = 0.0 for i in 1:n for j in 1:n C += v[i,j] end end D = B*C - A^2 function sigma(E) sqrt((C * E^2 - 2A * E + B)/D) end # portfolio scatter(sqrt.(diag(cov(mat))), E', label="portforio") # global minimum variance portfolio y = A/C x = sigma(y) scatter!([x], [y], label="global minimum variance portfolio") # effirencent frontier E_min = A/C E_max = max(E...) ys = range(E_min; stop=E_max, length=1000) xs = [sigma(y) for y in ys] plot!(xs, ys, label="efficient frontier") # minimum variance frontier E_min = 2 * A/C - max(E...) E_max= A/C ys = range(E_min; stop=E_max, length=1000) xs = [sigma(y) for y in ys] plot!(xs, ys, linestyle=:dash, xlabel="risk", ylabel="return", label="", title="Modern portfolio theory")
結果
それぞれのポートフォリオが青い点、効率的フロンティア(efficient frontier)は緑の線、分散が最も小さくなる点である最小分散フロンティア(global minimum variance portfolio)はオレンジ色で示されています。 既存のポートフォリオよりリスクが少なくなるような曲線が描かれていることが分かります。 このようにポートフォリオの配分によってリスクを最小化してより良い資産運用をすることが可能となります。
notebook
https://nbviewer.jupyter.org/github/suzusuzu/blog/blob/master/finance/EfficientFrontier.ipynb
参考
- Markowitz, Harry. “Portfolio Selection.” The Journal of Finance, vol. 7, no. 1, 1952, pp. 77–91., doi:10.2307/2975974. Accessed 14 2020.
- Merton, Robert C. "An analytic derivation of the efficient portfolio frontier." Journal of financial and quantitative analysis 7.4 (1972): 1851-1872.
- ウォール街のランダムウォーカー
- Kenneth R. French - Data Library