策略建模基础:策略的定义与表示、策略空间、策略评估指标
好,咱们正式开始聊策略建模。说实话,很多人一上来就撸代码,结果策略跑出来自己都看不懂。我见过太多这样的项目了——策略定义不清,评估指标混乱,最后根本没法上线。
这一节,咱们把地基打牢。你想想看,盖楼之前总得先画图纸吧?策略建模就是那张图纸。
策略的定义与表示
先问个问题:什么是策略?
在我眼里,策略就是一个从状态到动作的映射函数。说白了,就是「在什么情况下,做什么事」。
举个例子,一个简单的交易策略:
# 策略定义:移动平均线交叉
def strategy(data):
if data['ma5'] > data['ma20']:
return 'buy' # 金叉,买入
elif data['ma5'] < data['ma20']:
return 'sell' # 死叉,卖出
else:
return 'hold' # 持有不动
嗯,这里要注意:策略的表示方式有很多种。我个人习惯把它们分成三类:
- 规则型策略:if-else 写死的逻辑,简单直观,但灵活性差
- 参数化策略:比如 y = wx + b,通过调整参数来改变行为
- 函数型策略:用神经网络等复杂函数逼近,表达能力最强
策略空间
策略空间,就是所有可能策略的集合。这个概念很重要,因为它决定了你的搜索范围有多大。
你想想看,如果策略空间太小,可能找不到最优解;如果太大,搜索起来又太慢。这就像找钥匙——你是在一个抽屉里找,还是在整个小区里找?
策略空间通常由几个维度决定:
| 维度 | 说明 | 示例 |
|---|---|---|
| 参数空间 | 策略中可调参数的范围 | 移动平均的周期数:5~200 |
| 动作空间 | 策略可以执行的动作集合 | {买入, 卖出, 持有} |
| 状态空间 | 策略依赖的输入信息 | 价格、成交量、技术指标 |
我曾经犯过一个错误:把策略空间设得太大,结果搜索了三天三夜都没收敛。后来我学乖了,先缩小参数范围,找到大致方向后再精细调整。
下面这张图展示了策略空间的核心结构:
策略评估指标
策略建好了,怎么判断好坏?这就得靠评估指标了。我一般从三个维度来评估:收益、风险、鲁棒性。
收益指标
收益是最直观的,但也是最容易骗人的。我见过有人拿「年化收益率 500%」的策略来炫耀,结果一看回测周期只有一个月。
常用的收益指标:
- 累计收益率:总赚了多少,简单粗暴
- 年化收益率:把收益换算成年化水平,方便比较
- 夏普比率:每承担一单位风险能获得多少超额收益
- 最大回撤:从最高点到最低点的跌幅,这个很关键
风险指标
风险是什么?说白了就是不确定性。一个策略今天赚 10%,明天亏 20%,你敢用吗?
我常用的风险指标:
| 指标 | 含义 | 理想值 |
|---|---|---|
| 波动率 | 收益率的波动程度 | 越低越好 |
| 最大回撤 | 历史最大亏损幅度 | 小于 20% |
| VaR (风险价值) | 在给定置信水平下的最大可能损失 | 根据风险偏好定 |
| 下行风险 | 只考虑亏损时的波动 | 越低越好 |
嗯,这里要特别说一下最大回撤。我曾经有个策略,年化收益 30%,看着挺美。结果最大回撤 45%——也就是说,如果你在最高点买入,得亏掉将近一半。这种策略你敢实盘吗?反正我不敢。
鲁棒性指标
鲁棒性,就是策略在不同市场环境下的适应能力。说白了,换个时间段、换个品种,你的策略还灵不灵?
我一般这样测鲁棒性:
# 鲁棒性测试示例
def robustness_test(strategy, data_list):
results = []
for data in data_list: # 不同市场环境的数据
perf = backtest(strategy, data)
results.append(perf['sharpe_ratio'])
# 计算稳定性
mean_perf = np.mean(results)
std_perf = np.std(results)
# 鲁棒性得分:均值高且标准差低
robustness_score = mean_perf / (std_perf + 1e-6)
return robustness_score
鲁棒性差的策略有个典型特征:回测时曲线漂亮得像艺术品,一上实盘就崩。为什么会这样?因为回测数据里没有「意外」,而真实市场永远充满意外。
最后总结一下我的评估流程:
- 先看收益——能不能赚钱
- 再看风险——会不会亏大钱
- 最后看鲁棒性——换个环境还灵不灵
这三个维度缺一不可。我见过太多人只盯着收益,结果被风险一巴掌拍死。记住:活得久比赚得快更重要。
好了,策略建模的基础就聊到这儿。这些概念看着简单,但真正用好需要大量实践。你可以在自己的项目里试试,从定义策略开始,一步步搭建评估体系。