La semana pasadaGestión de riesgos de VaRCuando se habla del riesgo de una cartera de inversiones, el riesgo no es igual al riesgo de los activos individuales, y está relacionado con su correlación de precios. Por ejemplo, si dos activos tienen una correlación positiva muy fuerte, es decir, coinciden, entonces la dispersión en más inversiones no reduce el riesgo, si la correlación es negativa, la dispersión puede reducir significativamente el riesgo.
La teoría del portafolio moderno (MPT), propuesta por Harry Markowitz en 1952, es un marco matemático de selección de portafolios que busca maximizar los beneficios esperados y controlar el riesgo mediante la selección de diferentes portafolios de activos de riesgo. La idea central es que los cambios de precios no perfectamente sincronizados entre los activos pueden reducir el riesgo de inversión en general mediante la diversificación de la distribución de los activos.
Los rendimientos esperados: Es el rendimiento que un inversor puede esperar obtener de un activo o una cartera de inversiones, generalmente basado en datos de rendimiento histórico.
$E(R_p) = \sum_{i=1}^{n} w_i E(R_i) $
Donde, $E ((R_p) $ es el rendimiento esperado de la cartera, $w_i$ es el peso de los activos $i$ en la cartera, y $E ((R_i) $ es el rendimiento esperado de los activos $i$.
Riesgo (Volatilidad o desventaja estándar)Se utiliza para medir la incertidumbre o la volatilidad de los retornos de las inversiones.
$\sigma_p = \sqrt{\sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_{ij}}$
Donde $\sigma_p$ es el riesgo total de la cartera, $\sigma_{ij}$ es el diferencial de coeficiente entre el activo $i$ y el activo $j$, que mide la relación entre los cambios de precios de los dos activos.
Diferencias de cooperaciónLos precios de los activos son los siguientes:
¿Por qué no lo haces?
Donde $\rho_{ij}$ es el coeficiente correlativo de los activos $i$ y $j$, y $\sigma_i$ y $\sigma_j$ son el desvío estándar de los activos $i$ y $j$, respectivamente.
Fronteras eficacesEn el sistema de coordenadas riesgo-beneficio, el límite efectivo es el conjunto de portafolios que pueden ofrecer el máximo rendimiento esperado a un nivel de riesgo dado.
El gráfico anterior es un diagrama de los límites efectivos, donde cada punto representa una cartera de inversiones con diferentes pesos, con las coordenadas horizontales de volatilidad o nivel de riesgo, y las coordenadas verticales de rendimiento. Obviamente, nos centramos en la parte superior del gráfico, que obtiene el mayor rendimiento con el mismo nivel de riesgo.
En la gestión de transacciones y portafolios cuantificados, la aplicación de estos principios requiere el análisis estadístico de datos históricos, el uso de modelos matemáticos para estimar las ganancias esperadas, los desviales estándar y los desviales correlativos de una variedad de activos; y luego, la aplicación de técnicas de optimización para encontrar la mejor reubicación de activos. Este proceso generalmente involucra complejas operaciones matemáticas y una gran cantidad de procesamiento por computadora, por lo que el análisis cuantitativo se ha vuelto tan importante en el campo financiero moderno.
El cálculo de la combinación óptima de Markowitz es un proceso de varios pasos, que involucra varios pasos clave, como la preparación de datos, la simulación de la cartera, el cálculo de indicadores y otros.https://plotly.com/python/v3/ipython-notebooks/markowitz-portfolio-optimization/
Obtención de datos del mercado:
get_data
Función que obtiene datos de precios históricos de la moneda digital seleccionada. Estos son los datos necesarios para calcular el rendimiento y el riesgo, y se utilizan para construir portafolios y calcular el índice de Sharpe.Calcular los beneficios y riesgos:
calculate_returns_risk
La función calcula el rendimiento anualizado y el riesgo anualizado de cada moneda digital (desventaja estándar). Esto es para cuantificar el rendimiento histórico de cada activo para usarlo en la combinación óptima.Calcula la combinación óptima de Markowitz:
calculate_optimal_portfolio
Función que simula varios portafolios. En cada simulación, se generan pesos de activos al azar y se calcula el rendimiento y el riesgo esperados de la cartera en función de estos pesos.El objetivo de todo el proceso es encontrar una cartera que obtenga el mejor rendimiento esperado a un nivel de riesgo dado. Al simular varias combinaciones posibles, los inversores pueden comprender mejor el rendimiento de las diferentes configuraciones y elegir la combinación que mejor se adapte a sus objetivos de inversión y su capacidad de soportar el riesgo.
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()
El resultado final es: La mejor combinación: El peso de BTCUSDT es de 0.0721 El peso de ETHUSDT es de 0.2704 BNBUSDT tiene un peso de 0.3646 LINKUSDT tiene un peso de 0.1892 El peso de BCHUSDT es de 0.0829 El peso de LTCUSDT es de 0.0209 El rendimiento esperado: 0.4195 El riesgo esperado (desvio estándar): 0.1219 El índice de Sharp: 3.4403