リスク
リターンが同じでもリスクが大きいとどうなるか?
リターンが同じ年利5%でも、リスクが大きいと確率密度関数は経年でこのように変化していく A:標準偏差5%
B:標準偏差20%
https://gyazo.com/5820fb493f941321399316a1449cd4b3
緑:$ 1.05^{10}
中央値はAもBも一緒になる
例えば10年目の中央値はいずれも約1.65(破線)
この時緑の線以下の分布を比べてみると、リスクの低いAグループの方が多くの人が緑(リスク0で年利5%)に近く、Bの場合元の価格か損失になっている人も多い
トップラインは圧倒的にリスクが高いBの方が高い
リスクが高い賭けをすると大勝ちする少数の人が出るが、理想的な年利5%に到達しない人も多い
https://gyazo.com/75c7bb0ed77ae2e7da6e2e1d48174ca2
正規分布での計算
理解のためのクイズ
Q. 年率リスク0.17のVTと現金のみでポートフォリオを組む。許容リスクが5%、17%、34%の人は、それぞれ資産のうち何%をVTとすれば良いか? 現金のリスクは0とみなせる。VTの保持率をα、許容リスクRとすると$ 0.17\alpha+0(1-\alpha)=\rm{R}を解いて
5%の場合 0.05/0.17=0.29
17%の場合 0.17/0.17=1(フル・インベスト)
34%の場合 0.34/0.17=2(資産が足りない)
もしVTではなくリスクが40%の個別株Aでリスクを取ろうとするとそれぞれ
0.05/0.4 = 0.125
0.17/0.4=0.425
0.34/0.4=0.85
の資産を入れることになる。17%リスクの投資信託よりも投入できる金額が小さくなることがわかる
--.icon
https://gyazo.com/5820fb493f941321399316a1449cd4b3
code:py
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm
# Parameters
mean_return = 0.05
risk_A = 0.05
risk_B = 0.20
years = 10
# Function to plot the investment with subtle color variation starting from a visible color
def plot_investment_varying_color_adjusted(risk, label_prefix, base_color):
colors = plt.cm.get_cmap(base_color, years + 1)
for year in range(1, years + 1):
# リスク(標準偏差)を計算。リスクは時間の平方根に比例すると仮定して年数の平方根を取る
s = risk * np.sqrt(year)
# 対数正規分布のスケールパラメータ
scale = np.exp(mean_return * year)
# 対数正規分布の0.1%点から99.9%点までの範囲で1000個の等間隔な値を生成。分布のほとんど全体をカバー
x = np.linspace(lognorm.ppf(0.001, s, scale=scale), lognorm.ppf(0.999, s, scale=scale), 1000)
# xの値に対応する確率密度関数(pdf)の値を計算。この値は、対数正規分布に基づいています
y = lognorm.pdf(x, s, scale=scale)
plt.plot(x, y, label=f'{label_prefix} Year {year}', color=colors(year))
plt.axvline(x=lognorm.median(s, scale=scale), color=colors(year), linestyle='--', linewidth=0.5)
# Set up the plot
plt.figure(figsize=14, 6) # Main plot
plt.subplot(1, 2, 1)
plot_investment_varying_color_adjusted(risk_A, 'A', 'Blues')
plot_investment_varying_color_adjusted(risk_B, 'B', 'Reds')
expected_return_line = 1.05 ** 10
plt.axvline(x=expected_return_line, color='green', linestyle='-', linewidth=1, label=f'Expected Return {expected_return_line:.2f}')
plt.xlabel('Return')
plt.ylabel('Probability Density')
plt.title('Investment Returns for A and B Over 10 Years')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize='small')
# Subplot focusing on 0 to 4
plt.subplot(1, 2, 2)
plot_investment_varying_color_adjusted(risk_A, 'A', 'Blues')
plot_investment_varying_color_adjusted(risk_B, 'B', 'Reds')
plt.axvline(x=expected_return_line, color='green', linestyle='-', linewidth=1)
plt.xlim(0, 4)
plt.xlabel('Return')
plt.title('Zoomed-in View (0 to 4)')
plt.tight_layout()
plt.show()
https://gyazo.com/75c7bb0ed77ae2e7da6e2e1d48174ca2
code:py
import numpy as np
import matplotlib.pyplot as plt
# Parameters
mean_return_A = 5
risk_A = 5
mean_return_B = 5
risk_B = 20
# Normal distribution function
def normal_distribution(x, mean, std_dev):
return (1 / (np.sqrt(2 * np.pi * std_dev ** 2))) * np.exp(-(x - mean) ** 2 / (2 * std_dev ** 2))
# Extended range for x values
x_extended = np.linspace(-100, 150, 1000)
# Define color map for A and B
colors_A = plt.cm.Blues(np.linspace(0.4, 1, 10))
colors_B = plt.cm.Reds(np.linspace(0.4, 1, 10))
# Plotting each year's distribution for both A and B with legends
plt.figure(figsize=(15, 8))
for year in range(1, 11):
# Adjust mean and standard deviation based on year
mean_A = mean_return_A * year
std_A = risk_A * np.sqrt(year)
mean_B = mean_return_B * year
std_B = risk_B * np.sqrt(year)
# Calculate the PDF for A and B for the given year
pdf_A_year = normal_distribution(x_extended, mean_A, std_A)
pdf_B_year = normal_distribution(x_extended, mean_B, std_B)
# Plotting with specific colors and legends
plt.plot(x_extended, pdf_A_year, color=colors_Ayear - 1, label=f"Investment A, Year {year}") plt.plot(x_extended, pdf_B_year, color=colors_Byear - 1, label=f"Investment B, Year {year}") plt.title("Probability Density of Returns for Investment A and B Over 10 Years")
plt.xlabel("Return (%)")
plt.ylabel("Probability Density")
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True)
plt.show()