正交实验设计
单参数调优的局限在于:参数之间可能存在交互作用。A 参数的最优值可能取决于 B 参数的取值。单独调优 A 找到的最佳值,在与 B 组合时未必最优。
4 参数 × 3 水平 = 81 种组合。全跑一遍太耗时。正交实验设计用数学方法挑出代表性组合,9 次实验覆盖 80% 的信息量。
正交表 L9(3^4):┌────────┬───────┬───────┬────────┬─────────┐│ 实验号 │ lr │ depth │ leaves │ colsample│├────────┼───────┼───────┼────────┼─────────┤│ 32 │ 0.01 │ 8 │ 64 │ 0.7 ││ 33 │ 0.01 │ 10 │ 128 │ 0.9 ││ 34 │ 0.01 │ 12 │ 256 │ 1.0 ││ 35 │ 0.05 │ 8 │ 128 │ 0.7 ││ 36 │ 0.05 │ 10 │ 64 │ 0.9 ││ 37 │ 0.05 │ 12 │ 256 │ 1.0 ││ 38 │ 0.1 │ 8 │ 256 │ 0.9 ││ 39 │ 0.1 │ 10 │ 64 │ 0.7 ││ 40 │ 0.1 │ 12 │ 128 │ 1.0 │└────────┴───────┴───────┴────────┴─────────┘正交性保证:每个参数的每个水平都均匀出现 3 次。
代码实践
import qlibfrom qlib.constant import REG_CNfrom qlib.utils import init_instance_by_configfrom qlib.workflow import Rimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignore')provider_uri = "/Users/tian/Documents/aicoding/qlib/a_ty_study/data/qlib_data/cn_data"qlib.init(provider_uri=provider_uri, region=REG_CN)# 定义正交实验配置orthogonal_config = [# (exp_id, lr, depth, leaves, colsample) (32, 0.01, 8, 64, 0.7), (33, 0.01, 10, 128, 0.9), (34, 0.01, 12, 256, 1.0), (35, 0.05, 8, 128, 0.7), (36, 0.05, 10, 64, 0.9), (37, 0.05, 12, 256, 1.0), (38, 0.1, 8, 256, 0.9), (39, 0.1, 10, 64, 0.7), (40, 0.1, 12, 128, 1.0),]all_results = []for exp_id, lr, depth, leaves, colsample in orthogonal_config: result = run_orthogonal_experiment(exp_id, lr, depth, leaves, colsample) all_results.append(result)运行 9 个实验的结果:
================================================================================正交实验结果汇总================================================================================ exp_id lr depth leaves colsample IC ICIR time 32 0.01 8 64 0.7 0.019458 1.945782 36.842383 33 0.01 10 128 0.9 0.020539 2.053870 39.038554 34 0.01 12 256 1.0 0.031221 3.122106 42.592270 35 0.05 8 128 0.7 0.013548 1.354798 36.251076 36 0.05 10 64 0.9 0.014608 1.460768 35.779799 37 0.05 12 256 1.0 0.030694 3.069372 43.520219 38 0.10 8 256 0.9 0.014347 1.434726 36.148463 39 0.10 10 64 0.7 0.005809 0.580874 34.288053 40 0.10 12 128 1.0 0.034153 3.415315 35.755852================================================================================排名前三:
实验 40 胜出:IC=0.0342, ICIR=3.42。
参数敏感性排序(差异越大越敏感):
colsample: 0.0191 ← 最敏感depth: 0.0184leaves: 0.0121lr: 0.0056 ← 最不敏感参数效应分析结果:
lr: 0.01: IC=0.0237 0.05: IC=0.0196 0.1: IC=0.0181depth: 8: IC=0.0158 10: IC=0.0137 12: IC=0.0320 ← depth=12 明显更好leaves: 64: IC=0.0133 128: IC=0.0227 256: IC=0.0254colsample: 0.7: IC=0.0129 0.9: IC=0.0165 1.0: IC=0.0320 ← 全量特征明显更好热力图:

参数效应曲线:

交叉验证
找到最佳配置后,需要验证这个配置在不同时间段是否稳定。训练数据用 2010-2014,测试三个时间段:2015-2016、2017-2019、2019-2020。
时间序列交叉验证的关键:只能用"前向"验证,用历史预测未来是正确做法,用未来预测历史是作弊。
# 最佳配置best_config = {'learning_rate': 0.1,'max_depth': 12,'num_leaves': 128,'colsample_bytree': 1.0}# 三个验证时间段cv_segments = [ (41, '2015-2016', '2010-01-01', '2014-12-31', '2015-01-01', '2016-12-31'), (42, '2017-2019', '2012-01-01', '2016-12-31', '2017-01-01', '2019-12-31'), (43, '2019-2020', '2014-01-01', '2018-12-31', '2019-01-01', '2020-08-01'),]三个时间段全部通过稳定性检验:
================================================================================稳定性评估================================================================================ period IC ICIR win_rate IC_ok ICIR_ok overall_pass2015-2016 0.034153 3.415315 0.6 True True True2017-2019 0.051228 5.122806 0.6 True True True2019-2020 0.035737 3.573745 0.6 True True True================================================================================通过统计================================================================================IC > 0.02 通过: 3/3ICIR > 0.5 通过: 3/3整体通过: 3/3================================================================================跨时间段表现:
IC 范围: 0.0342 ~ 0.0512IC 均值: 0.0404ICIR 范围: 3.4153 ~ 5.1228ICIR 均值: 4.0373可视化结果:

今日收获
正交实验 vs 网格搜索:81 种组合 → 9 种代表组合,效率提升 8 倍,覆盖度约 80%。适合初期快速探索参数空间。
参数敏感性发现:colsample_bytree 最敏感,其次是 depth。lr 相对不敏感,但太小会欠拟合(lr=0.01),太大不稳定(lr=0.5)。
训练数据时间长度的影响:Day 09 用 6 年训练数据(2008-2014),今天用 4 年(2010-2014)。数据少的时候需要更复杂的模型(depth=12, leaves=256)来弥补,数据多的时候可以用更保守的配置。
最佳配置:lr=0.1, depth=12, leaves=128, colsample=1.0。这个配置在 3 个时间段都稳定有效,ICIR 均值 4.04,属于优秀水平(>1.0 为优秀)。
进度:10/70
夜雨聆风