label_expr 标注表达式里面的where 如何构建的?

标注表达式
标签: #<Tag:0x00007f73dfbd6a78>

(matrixreloaded) #1

label_expr = ['return * 100', 'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(15)]

我想知道这个label_expr是如何具体处理的。因为这个label标注的不是很正态,但是把format(100)反而收益和其他指标都下降了,我认为可能要做一些标准化和正则化还有两端去极值,正态化如box cox的操作,但是不知道你们的具体封装的python的什么语法字符串,不好直接改,所以想问一下。

能不能把这个更新到文档中?否则确实不太好改。。谢谢。


(matrixreloaded) #2

@wallstreetcat 这个有人知道嘛?我想改进一下我的评分,谢谢。


(神龙斗士) #3

先解一下这个具体的表达式:

label_expr = [
    'return * 100', # 收益乘以 100,即如果未来5天收益是 12.5%,则转化为 12.5
    'where(label > {0}, {0}, where(label < -{0}, -{0}, label)) + {0}'.format(15)
       # 两个 where是等价于  min(-15, max(label, 15)),将label限定在 [-15, 15]之间
       # + 15,将label转化为非负数 [0, 30]
]
# 最后,还有一个隐含的,会对label做取整

我们在的完善文档部分。通过如下方式,你可以看到这个函数的定义信息

克隆策略
In [1]:
M.fast_auto_labeler.v5.m_help()
M.fast_auto_labeler.v5(instruments, start_date, end_date, label_expr, hold_days, post_label_map={}, buy_at='open', sell_at='close', benchmark=None)

        数据标注,根据未来收益和波动率做分级标注
        :param history_data: 数据
        :param label_expr: 标注表达式,可以用数组来给定多个表达式,顺序执行。结果会被取整。
                可用变量
                    return:收益
                    volatility:波动率
                    benchmark_return:基准收益
                    benchmark_volatility:基准波动率
                更多支持的函数见 https://github.com/pydata/numexpr#supported-functions
        :param hold_days: 持仓天数
        :param post_label_map: dict,可以对最后的取整后的label再做一次从key到value的映射
        :param buy_at: 买入价,取值 open 或者 close
        :param sell_at: 卖出价,取值 open 或者 close
        :param benchmark: 基准,收益和波动率会减去基准对应的值。常用 000300.SHA。默认为None。
        
其他:
  m_arguments: 参数列表
  m_doc: 文档
  m_sourcecode: 源代码

label_expr是一个表达式列表,会顺序执行,是一个python numexpr的语法(会应用到 python pandas dataframe上),更多语法支持参考

# 伪代码
foreach 表达式 in label_expr:
    label = 在df上应用 表达式

df 是根据股票数据计算出来的,有 return / volatility / benchmark_return / benchmark_volatility 可以在表达式中使用,未来用户可以自定义计算其他数据(比如期间最高价等等)。


(PAYNE) #4

看来这个地方确实是坑啊,我今天也碰到这个问题了,说是封装好的,没有别的解释了


(iQuant) #5

您好,如果想改进数据标注或者希望对数据标注分数结果进行核对,欢迎使用模块:
M.advanced_auto_labeler,该模块能够进行更为灵活地数据标注。

你可以单独拿一只股票来测试。比对手动计算的分数和自动标注的分数是否一致。
注:该模块参数cast_label_int (bool) ,默认值是True,如果想比对原始值,请将该参数设置为False。