資源の読み込みに... 荷物...

リスクと報酬の測定 ・マコヴィッツ理論の紹介

作者: リン・ハーン小草作成日:2023年11月10日 15:44:53 更新日:2023年11月13日 19:50:57

img

先週紹介したVaRのリスク管理投資ポートフォリオのリスクは,個々の資産のリスクに等しくなく,それらの価格関連性に関係している. 例えば,2つの資産を例に挙げると,それらのポジティブな関連性が非常に強い場合,つまり同等に落ちる場合,分散した多投資はリスクを軽減しない.負の関連性が強い場合,分散した投資はリスクを著しく減少させる.自然な問題は,ポートフォリオを投資するときに,あるリスクレベルで収益を最大化するにはどうすればよいかである.今日紹介するマコヴィッツ理論を使用します.

マコヴィッツ・モダン・ポートフォリオ・理論 (MPT) は,ハリー・マコヴィッツによって1952年に提唱された,投資ポートフォリオ選択の数学的な枠組みであり,リスクをコントロールしながら,異なるリスクの資産ポートフォリオを選択することによって期待される収益を最大化することを目的としている.核心思想は,資産間の価格の不完全同期変動 (すなわち,資産間の不完全関連性) が,資産配置の多様化によって全体的な投資リスクを低減させることができるということである.

マコヴィッツ理論の重要な概念

  1. 期待される収益率投資家は資産または投資ポートフォリオを保有する際に期待できる収益,通常は歴史的な収益データに基づいて予測する.

    $e (r) p = \sum_{i=1}^{n}w (i) E (r) i) $

    $E ((R_p) $はポートフォリオの期待回報であり, $w_i$はポートフォリオの第 $i$の資産の重みであり, $E ((R_i) $は第 $i$の資産の期待回報である.

  2. リスク (不安定性または標準差)投資収益の不確実性や投資の変動性を測定する.

    $\sigma_p = \sqrt{\sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_{ij}}$

    $\sigma_p$は,ポートフォリオの総リスクであり, $\sigma_{ij}$は,資産$i$と資産$j$の相関差であり,この2つの資産間の価格変動関係を測定する.

  3. 協調差価格変動の相互関係を測定する.

    $\sigma_{ij} = \rho_{ij} \sigma_i \sigma_j$

    $\rho_{ij}$は,資産 $i$と資産 $j$の相関系数であり, $\sigma_i$と $\sigma_j$は,それぞれ資産 $i$と資産 $j$の標準差である.

  4. 効果的な境界:リスク・リターンコーディネートシステムでは,有効境界は,与えられたリスクレベルで最も期待できるリターンを提供できるポートフォリオの集合である.

img

上の図は有効境界の図で,各点は異なる重度のポートフォリオを表し,横軸は波動率,つまりリスクレベル,横軸は収益率です.明らかに,私たちは図の上方に注目しています.この辺は同じリスクレベルで最も高い収益を得ています.

量化取引およびポートフォリオ管理において,これらの原則を適用するには,歴史的なデータの統計分析を行い,様々な資産の期待回報,標準差,共差を推定するために数学モデルを使用し,次に最適資産再配置を見つけるために最適化技術を使用する.このプロセスは,しばしば複雑な数学演算と大量のコンピュータ処理を伴う.これが,量化分析が現代金融界で非常に重要になった理由でもある.以下では,具体的なPython例で最適化する方法を示します.

模擬法で最適組合せを求めるPythonコードの例

マコヴィッツ最適組合せを計算するプロセスは,データ準備,アニメーションポートフォリオ,指標計算など,いくつかの重要なステップを伴う多段階的なプロセスである.https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/

  1. 市場データを入手する

    • 通過get_data関数,選択した暗号通貨の歴史的価格データを取得する. これは収益率とリスクを計算するために必要なデータで,ポートフォリオを構築し,シャープ比率を計算するために使用されます.
  2. 収益率とリスクを計算する

    • 使用するcalculate_returns_risk機能は,各デジタル通貨の年収率と年収リスク (標準差) を計算する.これは,それぞれの資産の歴史的なパフォーマンスを量化するために,最適な組み合わせで使用するために作られている.
  3. マコヴィッツの最適組合せを計算する

    • 使用するcalculate_optimal_portfolio関数,複数のポートフォリオをシミュレートする. 各シミュレートで,ランダムに資産重量を生成し,それらの重量に基づいてポートフォリオの期待される収益率とリスクを計算する.
    • 様々な重度の組み合わせをランダムに生成することで,複数の可能なポートフォリオを探索し,最適なポートフォリオを見つけることができる.これはマコヴィッツの投資ポートフォリオ合理主義の核心思想の1つです.

このプロセスの目的は,あるリスクレベルで最も期待できる利回りを得る投資ポートフォリオを見つけることです.複数の可能な組み合わせをシミュレートすることで,投資家は異なる配置のパフォーマンスをよりよく理解し,投資目標とリスク承受力に最も適した組み合わせを選択することができます.この方法は投資決定を最適化し,投資をより効率的にすることができます.

import numpy as np
import pandas as pd
import requests
import matplotlib.pyplot as plt

# 获取行情数据
def get_data(symbols):
    data = []
    for symbol in symbols:
        url = 'https://api.binance.com/api/v3/klines?symbol=%s&interval=%s&limit=1000'%(symbol,'1d')
        res = requests.get(url)
        data.append([float(line[4]) for line in res.json()])
    return data

def calculate_returns_risk(data):
    returns = []
    risks = []

    for d in data:
        daily_returns = np.diff(d) / d[:-1]
        annualized_return = np.mean(daily_returns) * 365
        annualized_volatility = np.std(daily_returns) * np.sqrt(365)

        returns.append(annualized_return)
        risks.append(annualized_volatility)

    return np.array(returns), np.array(risks)

# 计算马科维茨最优组合
def calculate_optimal_portfolio(returns, risks):
    n_assets = len(returns)
    num_portfolios = 3000

    results = np.zeros((4, num_portfolios), dtype=object) 


    for i in range(num_portfolios):
        weights = np.random.random(n_assets)
        weights /= np.sum(weights)

        portfolio_return = np.sum(returns * weights)
        portfolio_risk = np.sqrt(np.dot(weights.T, np.dot(np.cov(returns, rowvar=False), weights)))

        results[0, i] = portfolio_return
        results[1, i] = portfolio_risk
        results[2, i] = portfolio_return / portfolio_risk
        results[3, i] = list(weights) # 将权重转换为列表

    return results

symbols = ['BTCUSDT','ETHUSDT', 'BNBUSDT','LINKUSDT','BCHUSDT','LTCUSDT']
data = get_data(symbols)

returns, risks = calculate_returns_risk(data)
optimal_portfolios = calculate_optimal_portfolio(returns, risks)

max_sharpe_idx = np.argmax(optimal_portfolios[2])
optimal_return = optimal_portfolios[0, max_sharpe_idx]
optimal_risk = optimal_portfolios[1, max_sharpe_idx]
optimal_weights = optimal_portfolios[3, max_sharpe_idx]

# 输出结果
print("最优组合:")
for i in range(len(symbols)):
    print(f"{symbols[i]}权重: {optimal_weights[i]:.4f}")

print(f"预期收益率: {optimal_return:.4f}")
print(f"预期风险(标准差): {optimal_risk:.4f}")
print(f"夏普比率: {optimal_return / optimal_risk:.4f}")

# 可视化投资组合
plt.figure(figsize=(10, 5))
plt.scatter(optimal_portfolios[1], optimal_portfolios[0], c=optimal_portfolios[2], marker='o', s=3)
plt.title('portfolio')
plt.xlabel('std')
plt.ylabel('return')
plt.colorbar(label='sharp')
plt.show()

ビデオは,このビデオで, 最良の組み合わせ: BTCUSDTの重み: 0.0721 ETHUSDT 重量: 0.2704 BNBUSDTの重み: 0.3646 LINKUSDTの重み: 0.1892 BCHUSDTの重み: 0.0829 LTCUSDT 重量: 0.0209 予想収益率: 0.4195 予想リスク (標準差): 0.1219 シャープ率:3.4403img


もっと