策略建模基础:策略的定义与表示、策略空间、策略评估指标

好,咱们正式开始聊策略建模。说实话,很多人一上来就撸代码,结果策略跑出来自己都看不懂。我见过太多这样的项目了——策略定义不清,评估指标混乱,最后根本没法上线。

这一节,咱们把地基打牢。你想想看,盖楼之前总得先画图纸吧?策略建模就是那张图纸。

策略的定义与表示

先问个问题:什么是策略?

在我眼里,策略就是一个从状态到动作的映射函数。说白了,就是「在什么情况下,做什么事」。

举个例子,一个简单的交易策略:

# 策略定义:移动平均线交叉
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
动作空间 策略可以执行的动作集合 {买入, 卖出, 持有}
状态空间 策略依赖的输入信息 价格、成交量、技术指标

我曾经犯过一个错误:把策略空间设得太大,结果搜索了三天三夜都没收敛。后来我学乖了,先缩小参数范围,找到大致方向后再精细调整。

避坑指南:策略空间不是越大越好。我曾经把参数范围设成 [0, 10000],结果大部分时间都在无效区域里打转。合理的做法是先做敏感性分析,找到参数的有效区间。

下面这张图展示了策略空间的核心结构:

策略空间结构图 策略空间 参数空间 移动平均周期: [5, 200] 止损比例: [0.01, 0.10] 仓位比例: [0.1, 1.0] 动作空间 动作集合: {买入, 卖出, 持有} 状态空间 输入特征: 价格, 成交量, 指标 策略 = f(参数, 动作, 状态)

策略评估指标

策略建好了,怎么判断好坏?这就得靠评估指标了。我一般从三个维度来评估:收益、风险、鲁棒性。

收益指标

收益是最直观的,但也是最容易骗人的。我见过有人拿「年化收益率 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
我的习惯:做鲁棒性测试时,我会故意加入一些「脏数据」——比如 2008 年金融危机、2020 年疫情暴跌。如果策略在这些极端行情下还能稳住,那才是真本事。

鲁棒性差的策略有个典型特征:回测时曲线漂亮得像艺术品,一上实盘就崩。为什么会这样?因为回测数据里没有「意外」,而真实市场永远充满意外。

最后总结一下我的评估流程:

  1. 先看收益——能不能赚钱
  2. 再看风险——会不会亏大钱
  3. 最后看鲁棒性——换个环境还灵不灵

这三个维度缺一不可。我见过太多人只盯着收益,结果被风险一巴掌拍死。记住:活得久比赚得快更重要。

再次提醒:不要过度优化回测数据。我曾经犯过这个错——把参数调到完美拟合历史数据,结果实盘一塌糊涂。这叫过拟合,是策略建模的头号杀手。

好了,策略建模的基础就聊到这儿。这些概念看着简单,但真正用好需要大量实践。你可以在自己的项目里试试,从定义策略开始,一步步搭建评估体系。

专注资料整理