进阶部分
更新时间:2025-12-29
写好评估器的关键在于设计好evaluate函数的返回值metrics。在该部分,我们将详细metrics各字段的设计原则。
Plain Text
1def evaluate(path_user_py: str) :#函数名不可变,path_user_py参数名不可变
2 #1.定义返回的字典
3 metrics= {
4 "validity": 0.0, #必须,0/1,判断生成的代码的有效性
5 "combined_score": 0.0, #必须,float,判断生成的代码的质量,分数越高越好
6 "feature1": 0.0, #添加任何你关注的指标,可以没有,变量名自定义
7 "feature2": 0.0, #添加任何你关注的指标,可以没有,变量名自定义
8 "error_info": {}#必须,字典格式,在生成的代码无效的时候,需要在这个字段中说明为什么无效
9 }
1.combined_score设计
combined_score设计原则:正向、同量纲,而不是简单把原始指标直接加权相加。以量化为例子:
-
在量化中,会关注AnnRet、Sharpe、Max DD、Calmar等指标
- 年化收益率:AnnRet(越大越好)
- Sharpe:Sharpe(越大越好)
- 最大回撤:Max DD(越小越好)
- Calmar:年化收益 / 最大回撤(越大越好)
-
在设计 combined_score 的时候需要考虑以下几个点:
- 正向:最大回撤为负向指标,需要调整为正向指标
- 同量纲:AnnRet、Sharpe、Max DD、Calmar 是否同量纲,刚好这个例子中为同量纲,所以不需要调整
- 权重:AnnRet、Sharpe、Max DD、Calmar 中用户最关注的是哪个指标
比如说用户极度风险厌恶,那么最能衡量风险厌恶水平的 Max DD 就应该给更高的权重。
具体可参照如下写法:
Plain Text
1combined_score = (
2 0.1 * ann_ret
3 + 0.2 * sharpe
4 + 0.5 / max_dd
5 + 0.2 * calmar
6) * validity
2.combined_score与validity
-
硬约束应该放在validity字段进行判断
- 什么是硬约束:如果违反了某个约束条件,会导致解完全不可用,则该约束就是硬约束
- 硬约束应该设置为validity的判断条件,如果违反该约束,则validity应该设置为0
- validity=0的解的combined_score值应该设置为0,即combined_score的计算方式最好为【score】*validity
-
软约束应该放在combined_score字段进行惩罚
- 什么是软约束:如果违反了某个约束条件,导致解的质量降低,则该约束为软约束
- 软约束可以以惩罚项的形式体现在combined_score的计算逻辑中
3.validity与error_info
- 在validity=1的时候,error_info为空字典{}
-
在validity=0的时候,需要自定义返回error_info的信息:
-
这一步非常重要!只有把具体的错误信息告诉大模型,大模型才知道后续的改进方向
- 如果是代码报错,需要返回报错信息,包括异常处理机制
- 如果是违反了约束条件,也需要在error_info中写清楚违反的具体是什么条件
-
- 量化例子:若用户希望满足如下的硬性约束条件:1)不能做空;2)投资权重和为1。那么约束检验不通过时,需要返回对应的错误信息'error_info',具体可以参照如下写法:
Plain Text
1# 约束 1:不允许负权重(无做空)
2if any(w < 0 for w in weights):
3 metrics["validity"] =0.0
4 metrics['error_info'] = {
5 "w_negative": "Portfolio contains negative weights; each w_i must satisfy w_i >= 0 (no short positions allowed)"
6 }
7# 约束 2:权重需要和为 1(全额投资)
8if abs(sum(weights) - 1.0) > 1e-8:
9 metrics["validity"] =0.0
10 metrics['error_info'] = {
11 "w_sum_not_one": "Sum of portfolio weights must be 1.0 (fully invested constraint); current sum deviates from 1.0 beyond tolerance."
12 }
4.自定义feature
原则:尽量把中间指标都返回
除了必须返回的combined_score、validity、error_info,您可以将combined_score的组成项得分都返回,从而给到大模型更多信息用于演进优化,更好的提升combined_score
- 原因:假设combined_score从1提升到1.2,如果不返回中间指标,大模型不知道提升是来自哪个方向的改进,不利于找到后续的优化方向。
- 在量化的例子中,一个策略的combined_score从1提升到1.2可能是来自Sharpe 的提高,也可能是来自AnnRet的提高,只有把中间指标都返回,大模型才知道提高的具体来源,从而找到后续的优化方向
Plain Text
1def evaluate(path_user_py: str) :
2
3 #定义返回的字典
4 metrics= {
5 "validity": 0.0,
6 "combined_score": 0.0,
7 "ann_ret": 0.0, #把中间指标都返回
8 "max_dd": 0.0,
9 "calmar": 0.0,
10 "error_info": {}
11 }
