지난 주에 우리는 소개했습니다VaR 위험 관리포트폴리오의 위험에 대해 말할 때, 이는 개별 자산의 위험과 동일하지 않으며, 가격 상관관계와 관련이 있습니다. 두 자산을 예로 들어, 두 자산의 양의 상관관계가 매우 강하고, 즉 두 자산이 함께 오르락내리락한다면, 롱 투자를 분산 투자해도 위험이 줄어들지 않습니다. 음의 상관관계가 매우 강하다면 분산 투자로 위험을 상당히 줄일 수 있습니다. 자연스러운 질문은, 포트폴리오에 투자할 때 특정 수준의 위험으로 어떻게 수익을 극대화할 수 있는가입니다. 오늘 제가 소개할 마르코비츠 이론은 바로 여기서 적용됩니다.
1952년 해리 마코비츠가 제안한 현대 포트폴리오 이론(MPT)은 다양한 위험 자산 조합을 선택하여 위험을 통제하면서 기대 수익을 극대화하는 것을 목표로 하는 포트폴리오 선택을 위한 수학적 프레임워크입니다. 핵심 아이디어는 자산 가격이 완벽한 동기화 상태로 움직이지 않는다는 것(즉, 자산 간에 불완전한 상관관계가 있다는 것)이며, 자산 배분을 다각화하면 전반적인 투자 위험을 줄일 수 있다는 것입니다.
\(E(R_p) = \sum_{i=1}^{n} w_i E(R_i)\)
여기서 \(E(R_p)\)는 포트폴리오의 기대 수익률이고, \(wi\)는 포트폴리오의 \(i\)번째 자산의 가중치이며, \(E(R_i)\)는 포트폴리오의 \(i\)번째 자산의 기대 수익률입니다. 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\)의 표준 편차입니다.
위의 그림은 유효 프런티어의 개략도입니다. 각 점은 서로 다른 가중치를 가진 투자 포트폴리오를 나타냅니다. 수평축은 변동성, 즉 위험 수준이고, 수직축은 수익률입니다. 당연히 우리는 동일한 위험 수준에서 가장 높은 수익을 낼 수 있는 그래프의 상단에 초점을 맞춥니다.
양적 거래와 포트폴리오 관리에서 이러한 원칙을 적용하려면 과거 데이터의 통계적 분석과 수학적 모델을 사용하여 다양한 자산의 예상 수익률, 표준 편차, 공분산을 추정해야 합니다. 그런 다음 최적화 기술을 적용하여 최적의 자산 가중치 구성을 찾습니다. 이 과정에는 일반적으로 복잡한 수학적 계산과 많은 컴퓨터 처리가 포함되며, 이로 인해 현대 금융에서 양적 분석이 매우 중요해졌습니다. 다음에서는 특정 Python 예제를 사용하여 최적화 방법을 설명합니다.
마르코비츠 최적 포트폴리오를 계산하는 것은 데이터 준비, 포트폴리오 시뮬레이션, 지표 계산 등 여러 핵심 단계를 포함하는 다단계 프로세스입니다. 참고: 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
예상 위험(표준편차): 0.1219
샤프지수: 3.4403