리소스 로딩... 로딩...

위험과 보상을 측정하는 마코비츠 이론 소개

저자:초목, 창작: 2023-11-10 15:44:53, 업데이트: 2024-11-08 09:06:34

img

지난 주 소개VaR 위험 관리포트폴리오의 위험은 각 자산의 위험과 같지 않으며, 그 가격 상관관계에 관한 것이다. 예를 들어 두 자산의 경우, 만약 그들의 긍정적 상관관계가 매우 강하다면, 즉 동화되는 경우, 더 많은 투자로 분산하면 위험을 줄이지 않으며, 부정적 상관관계가 강하다면, 분산 투자가 위험을 크게 줄일 수 있다. 자연스러운 문제는 포트폴리오를 투자할 때 특정 위험 수준에서 수익을 극대화하는 방법이다. 오늘 소개할 마코비츠 이론을 사용해야 한다.

하리 마코비츠가 1952년에 제안한 모던 포트폴리오 이론 (Modern Portfolio Theory, MPT) 은 다양한 위험 자산 포트폴리오를 선택함으로써 예상 수익을 극대화하면서 위험을 통제하기 위한 포트폴리오 선택의 수학적 프레임워크이다. 핵심 아이디어는 자산 간의 가격의 불완전한 동기화 변화 (즉, 자산 간의 불완전한 상관관계) 이 자산 편의의 다양화로 인해 전체적인 투자 위험을 줄일 수 있다는 것이다.

마코비츠 이론의 핵심 개념

  1. 기대 수익률: 투자자가 보유한 자산이나 투자 포트폴리오에 대해 기대할 수 있는 수익이며, 일반적으로 역사적 수익 데이터에 기초하여 예측된다.

    $E(R_p) = \sum_{i=1}^{n} w_i E(R_i) $

    여기서, $E ((R_p) $는 포트폴리오의 예상 수익률, $w_i$는 포트폴리오의 첫 번째 자산의 무게, $E ((R_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$의 간격차이며, 이 두 자산 사이의 가격 변화 관계를 측정한다.

  3. 협조의 차이두 가지 자산의 가격 변화의 상호 관계를 측정합니다.

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

    여기서, $\rho_{ij}$는 자산 $i$와 자산 $j$의 상관 계수이며, $\sigma_i$와 $\sigma_j$는 각각 자산 $i$와 자산 $j$의 표준 차입니다.

  4. 효과적인 경계: 위험-이익 좌표 시스템에서, 효과적인 경계는 주어진 위험 수준에서 최대 기대 수익을 제공할 수 있는 포트폴리오의 집합이다.

img

위 그림은 효과적인 경계선의 도표입니다. 각 점들은 다른 무게의 포트폴리오를 나타냅니다. 가로 좌표는 변동률, 즉 위험 수준, 그리고 가로 좌표는 수익률입니다. 분명히, 우리는 그림의 위쪽에 초점을 맞추고 있습니다. 이 쪽은 동일한 위험 수준에서 가장 높은 수익을 얻습니다.

양적 거래 및 포트폴리오 관리에서 이러한 원칙을 적용하기 위해서는 역사적 데이터에 대한 통계 분석을 수행하고, 각종 자산의 예상 수익, 표준 차원 및 동률 차원을 추정하기 위해 수학 모델을 사용해야 합니다. 그리고 최적화 기술을 사용하여 최적의 자산 재배치를 찾을 수 있습니다. 이 과정은 종종 복잡한 수학 연산과 많은 컴퓨터 처리를 포함합니다. 이것이 현대 금융 분야에서 양적 분석이 매우 중요하게 된 이유입니다. 다음과 같은 구체적인 파이썬 예제를 통해 최적화 방법을 설명합니다.

모방법을 사용하여 최적의 조합을 구하는 파이썬 코드 예제

마코비츠 최적 복합을 계산하는 것은 여러 단계의 과정이며, 데이터 준비, 모형 포트폴리오, 계산 지표 등 여러 가지 중요한 단계가 포함됩니다. 참고 자료:https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/

  1. 시장 데이터

    • 통과get_data함수, 선택된 디지털 화폐의 역사적 가격 데이터를 획득한다. 이것은 수익률과 위험을 계산하는 데 필요한 데이터이며, 이들은 포트폴리오를 구성하고 샤프 비율을 계산하는 데 사용됩니다.
  2. 수익률과 위험을 계산합니다.

    • 사용calculate_returns_risk함수는 각 디지털 화폐의 연간 수익률과 연간 위험을 계산합니다. 이것은 각 자산의 역사적 성능을 양적으로 측정하기 위해 최적의 조합에 사용되도록합니다.
  3. 마코비츠의 최적 조합을 계산합니다.

    • 사용calculate_optimal_portfolio함수, 여러 포트폴리오를 시뮬레이션한다. 각각의 시뮬레이션에서, 무작위로 자산 가중치를 생성하고, 그 가중치에 따라 포트폴리오의 예상 수익률과 위험을 계산한다.
    • 무작위적으로 다양한 무게의 조합을 생성함으로써 여러 가지 가능한 포트폴리오를 탐색하여 최적의 포트폴리오를 찾을 수 있다. 이것은 마코비츠 포트폴리오 합리주의의 핵심 사상 중 하나이다.

전체 과정의 목적은 주어진 위험 수준에서 가장 기대되는 수익을 얻을 수 있는 포트폴리오를 찾는 것이다. 여러 가지 가능한 포트폴리오를 시뮬레이션함으로써, 투자자는 다른 포트폴리오의 성능을 더 잘 이해하고, 자신의 투자 목표와 위험 부담에 가장 적합한 포트폴리오를 선택할 수 있다. 이 방법은 투자 결정을 최적화하고 투자를 더 효율적으로 하는 데 도움이 된다.

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 예상 위험 (Standard deviation): 0.1219 샤프 비율: 3.4403img


더 많은