
为什么数学模型能帮你选策略
很多人做量化交易,手里攒了七八个策略,实盘时却不知道该跑哪一个。凭感觉挑,往往挑中最近表现最亮眼的那个,结果一上实盘就亏钱。数学模型的价值在于:把主观判断变成可重复的计算,用客观指标代替直觉。
股票和期货市场里,策略的表现会随行情变化。一个在趋势行情里赚钱的策略,到了震荡市可能连续回撤。数学模型不是预测未来,而是帮你衡量每个策略在不同市场环境下的风险收益特征,从而做出更理性的选择。
核心指标:别只看收益率
选策略不能只看谁赚得多。真正有用的数学模型会同时考虑收益和风险。
夏普比率
夏普比率 = (策略年化收益 - 无风险利率) / 策略年化波动率。

它衡量的是每承担一单位波动风险,你能拿到多少超额收益。股票策略夏普比率超过1就算不错,期货策略因为杠杆效应,夏普比率通常更高,但也要看杠杆倍数。
最大回撤
最大回撤是从历史最高点跌到最低点的幅度。它告诉你最坏情况下会亏多少。一个策略年化收益30%,但最大回撤50%,另一个年化收益20%,最大回撤15%。后者更容易坚持执行,因为回撤小,心理压力小。
胜率和盈亏比
胜率是盈利交易占比,盈亏比是平均盈利除以平均亏损。高胜率低盈亏比的策略,遇到连续亏损容易让人怀疑人生。低胜率高盈亏比的策略,需要耐心等大行情。数学上,期望收益 = 胜率 × 平均盈利 - 败率 × 平均亏损。这个值必须为正。
卡玛比率
卡玛比率 = 年化收益 / 最大回撤。它直接告诉你每承担一单位回撤风险,能换来多少收益。卡玛比率大于1的策略,通常比较稳健。
构建评分模型:把多个指标揉成一个分数
单独看每个指标容易顾此失彼。你可以给每个指标分配权重,计算综合得分。
假设你关注四个指标:夏普比率、最大回撤、卡玛比率、胜率。给它们分别赋权:夏普30%,最大回撤25%,卡玛25%,胜率20%。然后对每个策略的指标做标准化处理,消除量纲影响。
标准化公式:(原始值 - 最小值) / (最大值 - 最小值)。对于最大回撤这种越小越好的指标,标准化后取反。
import numpy as np
import pandas as pd
# 假设有四个策略的指标数据
data = {
'策略': ['A', 'B', 'C', 'D'],
'夏普比率': [1.2, 0.8, 1.5, 1.0],
'最大回撤': [0.25, 0.15, 0.35, 0.20],
'卡玛比率': [0.8, 1.2, 0.6, 1.0],
'胜率': [0.55, 0.60, 0.45, 0.52]
}
df = pd.DataFrame(data)
# 标准化函数
def normalize(series, reverse=False):
min_val = series.min()
max_val = series.max()
norm = (series - min_val) / (max_val - min_val)
if reverse:
norm = 1 - norm
return norm
df['夏普_std'] = normalize(df['夏普比率'])
df['回撤_std'] = normalize(df['最大回撤'], reverse=True)
df['卡玛_std'] = normalize(df['卡玛比率'])
df['胜率_std'] = normalize(df['胜率'])
# 权重
weights = {'夏普_std': 0.3, '回撤_std': 0.25, '卡玛_std': 0.25, '胜率_std': 0.2}
df['综合得分'] = sum(df[col] * w for col, w in weights.items())
print(df[['策略', '综合得分']].sort_values('综合得分', ascending=False))
这个得分不是唯一真理。权重需要根据你的风险偏好调整。保守型投资者可以提高最大回撤的权重,激进型可以提高夏普比率的权重。
引入市场状态:动态调整策略选择
股票和期货市场有明显的状态切换。趋势市、震荡市、高波动市,不同策略表现差异巨大。数学模型可以识别市场状态,然后动态分配资金。
识别市场状态
用波动率指标和趋势强度指标。波动率可以用ATR(平均真实波幅)或历史波动率。趋势强度可以用ADX(平均趋向指数)或者价格与移动平均线的偏离程度。
简单划分:
高波动 + 强趋势 → 趋势跟踪策略
低波动 + 无趋势 → 均值回归策略
高波动 + 无趋势 → 降低仓位或空仓
动态权重
给每个策略分配一个基于市场状态的权重。市场状态越适合某策略,权重越高。
# 假设根据ADX和ATR划分市场状态
def get_market_state(adx, atr_percent):
if adx > 25 and atr_percent > 0.02:
return '趋势高波动'
elif adx > 25 and atr_percent <= 0.02:
return '趋势低波动'
elif adx <= 25 and atr_percent > 0.02:
return '震荡高波动'
else:
return '震荡低波动'
# 策略权重映射
state_weights = {
'趋势高波动': {'趋势策略': 0.6, '均值回归': 0.1, '套利': 0.3},
'趋势低波动': {'趋势策略': 0.4, '均值回归': 0.3, '套利': 0.3},
'震荡高波动': {'趋势策略': 0.1, '均值回归': 0.4, '套利': 0.5},
'震荡低波动': {'趋势策略': 0.2, '均值回归': 0.6, '套利': 0.2}
}
current_state = get_market_state(adx=30, atr_percent=0.025)
print(f'当前市场状态:{current_state}')
print(f'策略权重:{state_weights[current_state]}')
这个框架让策略选择不再是静态的,而是随市场呼吸。
股票和期货的差异
股票策略更关注选股因子和行业轮动,期货策略更关注杠杆和展期成本。数学模型选策略时,股票要额外考虑交易成本和冲击成本,期货要关注保证金和流动性。
股票量化策略的回测容易过拟合,因为股票数量多,因子挖掘空间大。期货品种少,过拟合风险相对低,但杠杆会放大波动。用数学模型时,股票策略要留出更长的样本外测试期,期货策略要更重视压力测试。
避免过拟合:数学模型的边界
数学模型能帮你排序,但不能保证未来。回测漂亮的策略,实盘可能失效。几个原则:
样本外测试:至少留30%数据不参与参数优化。
参数敏感性:参数微调后收益不能剧烈变化。
逻辑支撑:策略要有经济逻辑,不能纯数据挖掘。
滚动评估:每季度重新计算指标,动态调整。
数学模型是地图,不是终点。它帮你避开明显的坑,但路还是要自己走。
收集每个策略的历史净值曲线。
计算夏普比率、最大回撤、卡玛比率、胜率。
标准化后加权求和,得到综合得分。
识别当前市场状态,调整策略权重。
定期滚动评估,剔除持续低分策略。
这套方法不复杂,但能让你从凭感觉选策略,变成用数据做决策。股票期货都适用,关键在于坚持执行和动态调整。