La semaine dernièreGestion des risques VaRLe risque d'un portefeuille n'est pas le même que celui des différents actifs, mais est lié à leur correlation de prix. Prenons deux actifs, par exemple, si leur correlation positive est très forte, c'est-à-dire qu'ils tombent à la même chute, alors la dispersion ne réduit pas le risque. Si la correlation négative est forte, la dispersion peut réduire considérablement le risque.
La théorie du portefeuille moderne (MPT), proposée en 1952 par Harry Markowitz, est un cadre mathématique de sélection de portefeuilles visant à maximiser les rendements attendus en sélectionnant différents portefeuilles d'actifs à risque tout en contrôlant les risques. L'idée centrale est que les variations de prix non parfaitement synchronisées entre les actifs peuvent réduire le risque global d'investissement par la diversification de l'alignement des actifs.
Résultats attendus: C'est le rendement que l'investisseur peut s'attendre à obtenir en détenant un actif ou un portefeuille, généralement basé sur des données de rendement historiques.
$E(R_p) = \sum_{i=1}^{n} w_i E(R_i) $
Par exemple, $E (R_p) $ est le taux de rendement attendu du portefeuille, $w_i$ est le poids du premier $i$ dans le portefeuille, et $E (R_i) $ est le taux de rendement attendu du premier $i$.
Risque (volatilité ou défaut de référence): utilisé pour mesurer l'incertitude ou la volatilité des rendements des investissements.
$\sigma_p = \sqrt{\sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_{ij}}$
Parmi eux, $\sigma_p$ est le risque total du portefeuille, $\sigma_{ij}$ est la différence de coefficient entre les actifs $i$ et $j$, et il mesure la relation entre les variations de prix des deux actifs.
Différences de coopérationLes prix des actifs sont mesurés en fonction de la variation de prix entre deux actifs.
Je ne sais pas si je peux le faire.
Dans ce cas, $\rho_{ij}$ est le coefficient correspondant des actifs $i$ et $j$, et $\sigma_i$ et $\sigma_j$ sont respectivement les différences standards des actifs $i$ et $j$.
Frontières efficaces: Dans un système de coordonnées risque-bénéfice, la limite d'efficacité est la collection de portefeuilles pouvant offrir le meilleur rendement attendu à un niveau de risque donné.
Le graphique ci-dessus est un diagramme de la frontière efficace, chaque point représentant un portefeuille avec des poids différents, les coordonnées horizontales étant la volatilité, le niveau de risque, et les coordonnées horizontales le taux de rendement.
Dans la gestion quantitative des transactions et des portefeuilles, l'application de ces principes nécessite l'analyse statistique des données historiques, l'utilisation de modèles mathématiques pour estimer les rendements, les écarts standards et les écarts de coefficients attendus des différents actifs. Ensuite, des techniques d'optimisation sont utilisées pour trouver la réallocation optimale des actifs. Ce processus implique généralement des opérations mathématiques complexes et de nombreux traitements informatiques, ce qui explique pourquoi l'analyse quantitative est devenue si importante dans le domaine financier moderne.
Le calcul de la combinaison optimale de Markowitz est un processus en plusieurs étapes qui implique plusieurs étapes essentielles, telles que la préparation des données, la simulation du portefeuille et le calcul des indicateurs.https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/
Obtenir des données sur le marché:
get_data
Fonction qui obtient des données sur les prix historiques de la crypto-monnaie sélectionnée. Ce sont des données nécessaires pour calculer le taux de rendement et le risque, et elles sont utilisées pour construire des portefeuilles et calculer les ratios de Sharpe.Calculer les rendements et les risques:
calculate_returns_risk
La fonction calcule le taux de rendement annuel et le risque annuel ("décalage type") de chaque crypto-monnaie. Il s'agit de quantifier la performance historique de chaque actif afin de l'utiliser dans une combinaison optimale.Calculer la combinaison optimale de Makowitz:
calculate_optimal_portfolio
Une fonction qui simule plusieurs portefeuilles. Dans chaque simulation, des pondérations d'actifs sont générées au hasard, puis le rendement et le risque attendus du portefeuille sont calculés en fonction de ces pondérations.L'objectif du processus est de trouver le portefeuille qui offre le meilleur rendement attendu à un niveau de risque donné. En simulant plusieurs combinaisons possibles, les investisseurs peuvent mieux comprendre les performances des différentes configurations et choisir la combinaison qui convient le mieux à leurs objectifs d'investissement et à leur tolérance au risque. Cette approche aide à optimiser les décisions d'investissement et à rendre les investissements plus efficaces.
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()
Le résultat final: Le meilleur: Poids du BTCUSDT: 0.0721 Le poids de l'ETHUSDT est de 0.2704 BNBUSDT pondéré à 0,3646 LINKUSDT pondéré à 0,1892 BCHUSDT pondéré à 0.0829 Poids LTCUSDT: 0,0209 Le taux de rendement prévu: 0.4195 Risque attendu (décalage type): 0.1219 Le taux de Sharp est de 3,4403.