suzuzusu日記

(´・ω・`)

効率的フロンティアの解析解

現代ポートフォリオ理論の効率的フロンティアの解析解について調べたことをまとめました。

卵は一つのカゴに盛るな

ファイナンスの世界では、先人たちの経験をもとにした「卵は一つのカゴに盛るな」という格言があります。 これは一つのカゴに全ての卵を盛ると落としたときに全ての卵が割れてしまいますが、複数のカゴに分けて盛ると全ての卵が割れる事態を回避できることを示したものになります。 このようなリスクを最小化する分散投資が重要であることは昔から経験的に知られていました。

現代ポートフォリオ理論とは?

現代ポートフォリオ理論とは、リスクのある投資する場合のポートフォリオの配分をどのように合理的に決定すべきかを示した理論です。 この理論では、投資家は同じリターンが見込まれるのであればリスクを回避するという仮定をおいています。 これはポートフォリオの投資収益率の平均・分散にのみを考慮して、投資収益率の分散(リスク)を最小化することを意味します。 分散(リスク)を最小化するためには「卵は一つのカゴに盛るな」という先人の知恵を活かします。

卵を複数のカゴに分けるようにそれぞれのポートフォリオの配分を x_iとします。 それぞれ投資収益率の平均 E ・分散  \sigma^{2} は次のように示されます。 ポートフォリオ数は m ポートフォリオの共分散行列の要素を \sigma_{ij} とします

f:id:suzuzusu:20200415000146p:plain

この式からポートフォリオの配分 x_i を変えることによって、投資収益率の分散(リスク)をコントロールすることが可能であることが分かります。

効率的フロンティアの解析解

分散を最小化した場合の、リスク・リターン平面における曲線は最小分散フロンティアと呼ばれており、その中でリターンが高いものを効率的フロンティアと言います。 その解析解を求めます。 以下のように、等式制約がある最適化問題として定式化します。

f:id:suzuzusu:20200415000257p:plain

この問題は、ラグランジュの未定乗数法を使用することで解析解を求めることが可能となります。 ラグランジュ関数は以下のようになります。

f:id:suzuzusu:20200415000453p:plain

これをそれぞれ偏微分して、極値を求めます。

f:id:suzuzusu:20200415000811p:plain

f:id:suzuzusu:20200415000940p:plain

 (1a)  x に対して線形なので共分散行列の逆行列の要素 v_{ij} を使って以下のように書き換えることが可能です。

f:id:suzuzusu:20200415001119p:plain

 (2)  E_k をかけて k について合計すると以下のようになります。

f:id:suzuzusu:20200415001226p:plain

さらに、式 (2)  k について合計すると以下のようになります。

f:id:suzuzusu:20200415001234p:plain

それぞれ A, B, C を以下のように定義すると式  (1b), (1c), (3), (4) から  \gamma_1, \gamma_2 についての線形式が導出されます。

f:id:suzuzusu:20200415001402p:plain

f:id:suzuzusu:20200415001350p:plain

 D = BC - A^{2} とすると、 \gamma_1, \gamma_2 は以下のように解けます。

f:id:suzuzusu:20200415001323p:plain

次に式  (1a) x_i をかけて i について合計したものが次のようになります。

f:id:suzuzusu:20200415001436p:plain

式(6)が最小分散フロンティアです。 このようにして解析解を得ることができました。 次に、テストデータを使って効率的フロンティアをプロットしていきます。

実装

この ポートフォリオのデータセットを使用します。以下例

f:id:suzuzusu:20200408235815p:plain

以下は、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")

結果

f:id:suzuzusu:20200409000102p:plain

それぞれのポートフォリオが青い点、効率的フロンティア(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