지난 주 소개VaR 위험 관리포트폴리오의 위험은 각 자산의 위험과 같지 않으며, 그 가격 상관관계에 관한 것이다. 예를 들어 두 자산의 경우, 만약 그들의 긍정적 상관관계가 매우 강하다면, 즉 동화되는 경우, 더 많은 투자로 분산하면 위험을 줄이지 않으며, 부정적 상관관계가 강하다면, 분산 투자가 위험을 크게 줄일 수 있다. 자연스러운 문제는 포트폴리오를 투자할 때 특정 위험 수준에서 수익을 극대화하는 방법이다. 오늘 소개할 마코비츠 이론을 사용해야 한다.
하리 마코비츠가 1952년에 제안한 모던 포트폴리오 이론 (Modern Portfolio Theory, MPT) 은 다양한 위험 자산 포트폴리오를 선택함으로써 예상 수익을 극대화하면서 위험을 통제하기 위한 포트폴리오 선택의 수학적 프레임워크이다. 핵심 아이디어는 자산 간의 가격의 불완전한 동기화 변화 (즉, 자산 간의 불완전한 상관관계) 이 자산 편의의 다양화로 인해 전체적인 투자 위험을 줄일 수 있다는 것이다.
기대 수익률: 투자자가 보유한 자산이나 투자 포트폴리오에 대해 기대할 수 있는 수익이며, 일반적으로 역사적 수익 데이터에 기초하여 예측된다.
$E(R_p) = \sum_{i=1}^{n} w_i E(R_i) $
여기서, $E ((R_p) $는 포트폴리오의 예상 수익률, $w_i$는 포트폴리오의 첫 번째 자산의 무게, $E ((R_i) $는 첫 번째 자산의 예상 수익률이다.
위험 (변동성 또는 표준 격차): 투자 수익의 불확실성 또는 투자의 변동성을 측정하기 위해 사용됩니다.
$\sigma_p = \sqrt{\sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_{ij}}$
여기서, $\sigma_p$는 포트폴리오의 총 위험이며, $\sigma_{ij}$는 자산 $i$과 자산 $j$의 간격차이며, 이 두 자산 사이의 가격 변화 관계를 측정한다.
협조의 차이두 가지 자산의 가격 변화의 상호 관계를 측정합니다.
$\sigma_{ij} = \rho_{ij} \sigma_i \sigma_j$
여기서, $\rho_{ij}$는 자산 $i$와 자산 $j$의 상관 계수이며, $\sigma_i$와 $\sigma_j$는 각각 자산 $i$와 자산 $j$의 표준 차입니다.
효과적인 경계: 위험-이익 좌표 시스템에서, 효과적인 경계는 주어진 위험 수준에서 최대 기대 수익을 제공할 수 있는 포트폴리오의 집합이다.
위 그림은 효과적인 경계선의 도표입니다. 각 점들은 다른 무게의 포트폴리오를 나타냅니다. 가로 좌표는 변동률, 즉 위험 수준, 그리고 가로 좌표는 수익률입니다. 분명히, 우리는 그림의 위쪽에 초점을 맞추고 있습니다. 이 쪽은 동일한 위험 수준에서 가장 높은 수익을 얻습니다.
양적 거래 및 포트폴리오 관리에서 이러한 원칙을 적용하기 위해서는 역사적 데이터에 대한 통계 분석을 수행하고, 각종 자산의 예상 수익, 표준 차원 및 동률 차원을 추정하기 위해 수학 모델을 사용해야 합니다. 그리고 최적화 기술을 사용하여 최적의 자산 재배치를 찾을 수 있습니다. 이 과정은 종종 복잡한 수학 연산과 많은 컴퓨터 처리를 포함합니다. 이것이 현대 금융 분야에서 양적 분석이 매우 중요하게 된 이유입니다. 다음과 같은 구체적인 파이썬 예제를 통해 최적화 방법을 설명합니다.
마코비츠 최적 복합을 계산하는 것은 여러 단계의 과정이며, 데이터 준비, 모형 포트폴리오, 계산 지표 등 여러 가지 중요한 단계가 포함됩니다. 참고 자료:https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/
시장 데이터:
get_data
함수, 선택된 디지털 화폐의 역사적 가격 데이터를 획득한다. 이것은 수익률과 위험을 계산하는 데 필요한 데이터이며, 이들은 포트폴리오를 구성하고 샤프 비율을 계산하는 데 사용됩니다.수익률과 위험을 계산합니다.:
calculate_returns_risk
함수는 각 디지털 화폐의 연간 수익률과 연간 위험을 계산합니다. 이것은 각 자산의 역사적 성능을 양적으로 측정하기 위해 최적의 조합에 사용되도록합니다.마코비츠의 최적 조합을 계산합니다.:
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.4403