Cách đánh giá hiệu suất mô hình giao dịch định lượng
Đánh giá hiệu suất là một phần quan trọng trong phát triển mô hình giao dịch định lượng. Bài viết này sẽ hướng dẫn bạn các phương pháp và chỉ số để đánh giá hiệu suất của mô hình giao dịch một cách toàn diện.
1. Các chỉ số cơ bản
Tỷ suất lợi nhuận (Return)
Tỷ suất lợi nhuận là chỉ số cơ bản nhất để đánh giá hiệu suất của mô hình. Có hai loại lợi nhuận chính:
- Lợi nhuận tuyệt đối: Tổng lợi nhuận của danh mục
- Lợi nhuận tương đối: Lợi nhuận so với benchmark
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Tính toán lợi nhuận
def calculate_returns(portfolio_values):
returns = portfolio_values.pct_change()
return returns
# Ví dụ
portfolio_values = pd.Series([100, 105, 110, 108, 115])
returns = calculate_returns(portfolio_values)
print("Lợi nhuận hàng ngày:")
print(returns)
Độ biến động (Volatility)
Độ biến động đo lường mức độ dao động của lợi nhuận. Đây là một chỉ số quan trọng để đánh giá rủi ro của mô hình.
def calculate_volatility(returns, annualization_factor=252):
volatility = returns.std() * np.sqrt(annualization_factor)
return volatility
# Ví dụ
volatility = calculate_volatility(returns)
print(f"\nĐộ biến động hàng năm: {volatility:.2%}")
2. Các chỉ số nâng cao
Tỷ số Sharpe
Tỷ số Sharpe đo lường lợi nhuận điều chỉnh theo rủi ro. Công thức:
Sharpe Ratio = (R - Rf) / σ
Trong đó:
- R: Lợi nhuận của danh mục
- Rf: Lợi nhuận phi rủi ro
- σ: Độ lệch chuẩn của lợi nhuận
def calculate_sharpe_ratio(returns, risk_free_rate=0.02, annualization_factor=252):
excess_returns = returns - risk_free_rate/annualization_factor
sharpe_ratio = np.sqrt(annualization_factor) * excess_returns.mean() / returns.std()
return sharpe_ratio
# Ví dụ
sharpe = calculate_sharpe_ratio(returns)
print(f"\nTỷ số Sharpe: {sharpe:.2f}")
Tỷ số Sortino
Tỷ số Sortino tương tự như Sharpe nhưng chỉ xem xét rủi ro downside. Công thức:
Sortino Ratio = (R - Rf) / σd
Trong đó:
- σd: Độ lệch chuẩn của lợi nhuận âm
def calculate_sortino_ratio(returns, risk_free_rate=0.02, annualization_factor=252):
excess_returns = returns - risk_free_rate/annualization_factor
downside_returns = returns[returns < 0]
sortino_ratio = np.sqrt(annualization_factor) * excess_returns.mean() / downside_returns.std()
return sortino_ratio
# Ví dụ
sortino = calculate_sortino_ratio(returns)
print(f"\nTỷ số Sortino: {sortino:.2f}")
3. Phân tích rủi ro
Drawdown
Drawdown đo lường mức độ sụt giảm từ đỉnh xuống đáy của danh mục. Đây là một chỉ số quan trọng để đánh giá rủi ro tối đa.
def calculate_drawdown(portfolio_values):
rolling_max = portfolio_values.expanding().max()
drawdown = (portfolio_values - rolling_max) / rolling_max
return drawdown
# Ví dụ
drawdown = calculate_drawdown(portfolio_values)
print("\nDrawdown:")
print(drawdown)
Value at Risk (VaR)
VaR đo lường mức thua lỗ tối đa có thể xảy ra với một xác suất nhất định. Ví dụ, VaR 95% là mức thua lỗ tối đa có thể xảy ra với xác suất 95%.
def calculate_var(returns, confidence_level=0.95):
var = np.percentile(returns, (1 - confidence_level) * 100)
return var
# Ví dụ
var_95 = calculate_var(returns)
print(f"\nVaR 95%: {var_95:.2%}")
4. Phân tích hiệu suất
Phân tích thời gian
Phân tích hiệu suất theo các khung thời gian khác nhau giúp đánh giá tính ổn định của mô hình.
def analyze_performance_by_time(returns):
# Phân tích theo tháng
monthly_returns = returns.resample('M').mean()
# Phân tích theo quý
quarterly_returns = returns.resample('Q').mean()
# Phân tích theo năm
yearly_returns = returns.resample('Y').mean()
return monthly_returns, quarterly_returns, yearly_returns
# Ví dụ
monthly, quarterly, yearly = analyze_performance_by_time(returns)
print("\nLợi nhuận theo tháng:")
print(monthly)
Phân tích tương quan
Phân tích tương quan giúp đánh giá mức độ phụ thuộc của mô hình vào thị trường.
def analyze_correlation(returns, benchmark_returns):
correlation = returns.corr(benchmark_returns)
return correlation
# Ví dụ
benchmark_returns = pd.Series([0.01, 0.02, -0.01, 0.03, 0.01])
correlation = analyze_correlation(returns, benchmark_returns)
print(f"\nTương quan với benchmark: {correlation:.2f}")
5. Đánh giá tổng thể
Báo cáo hiệu suất
Tạo báo cáo tổng hợp các chỉ số hiệu suất để có cái nhìn toàn diện.
def generate_performance_report(returns, portfolio_values):
report = {
'Tổng lợi nhuận': (portfolio_values[-1] / portfolio_values[0] - 1),
'Lợi nhuận trung bình': returns.mean(),
'Độ biến động': returns.std(),
'Tỷ số Sharpe': calculate_sharpe_ratio(returns),
'Tỷ số Sortino': calculate_sortino_ratio(returns),
'VaR 95%': calculate_var(returns),
'Drawdown tối đa': calculate_drawdown(portfolio_values).min()
}
return report
# Ví dụ
report = generate_performance_report(returns, portfolio_values)
print("\nBáo cáo hiệu suất:")
for metric, value in report.items():
print(f"{metric}: {value:.2%}")
6. Trực quan hóa
Biểu đồ hiệu suất
Biểu đồ hiệu suất giúp trực quan hóa kết quả của mô hình theo thời gian.
def plot_performance(portfolio_values, benchmark_values=None):
plt.figure(figsize=(12, 6))
plt.plot(portfolio_values.index, portfolio_values, label='Portfolio')
if benchmark_values is not None:
plt.plot(benchmark_values.index, benchmark_values, label='Benchmark')
plt.title('Hiệu suất danh mục')
plt.xlabel('Thời gian')
plt.ylabel('Giá trị')
plt.legend()
plt.grid(True)
plt.show()
# Ví dụ
plot_performance(portfolio_values)
Biểu đồ phân phối lợi nhuận
Biểu đồ phân phối lợi nhuận giúp hiểu rõ hơn về tính chất của lợi nhuận.
def plot_returns_distribution(returns):
plt.figure(figsize=(12, 6))
sns.histplot(returns, kde=True)
plt.title('Phân phối lợi nhuận')
plt.xlabel('Lợi nhuận')
plt.ylabel('Tần suất')
plt.show()
# Ví dụ
plot_returns_distribution(returns)
Kết luận
Đánh giá hiệu suất mô hình giao dịch định lượng đòi hỏi việc xem xét nhiều khía cạnh khác nhau:
-
Lợi nhuận và rủi ro
- Tỷ suất lợi nhuận
- Độ biến động
- Drawdown
- VaR
-
Các chỉ số hiệu suất điều chỉnh theo rủi ro
- Tỷ số Sharpe
- Tỷ số Sortino
-
Phân tích theo thời gian
- Hiệu suất theo tháng/quý/năm
- Tính ổn định của mô hình
-
Tương quan với benchmark
- Mức độ phụ thuộc vào thị trường
- Khả năng tạo alpha
Việc sử dụng kết hợp các chỉ số này sẽ giúp bạn có cái nhìn toàn diện về hiệu suất của mô hình giao dịch và đưa ra quyết định đầu tư tốt hơn.