回测系统2用字符串表达式方式批量构建股票因子自定义因子

一.效果如下

回测系统2用字符串表达式方式批量构建股票因子自定义因子

回测系统2用字符串表达式方式批量构建股票因子自定义因子

扩展:有了这个之后,就可以构造Alpha158的因子了, 可以做为深度学习,机器学习的特征值

二.实现

1.核心思想就是用到了eval,将因子字符串表达式 变成可计算的表达式

from datafeed.expr_funcs import *


import pandas as pd


def expr_transform(df, expr):


    """


    将表达式中的列名替换为DataFrame列引用的字符串表示。


    参数:


    df (pd.DataFrame): 包含数据的DataFrame。


    expr (str): 需要转换的表达式字符串。


    返回:


    str: 转换后的表达式字符串,列名被替换为DataFrame列引用的字符串表示。


    close/shift(close,5) -1 => df["close"]/shfit(df["close"] -1


    """


    # 遍历DataFrame的列名


    for col in df.columns:


        # 将列名替换为DataFrame列引用的字符串表示


        expr = expr.replace(col, 'df["{}"]'.format(col))


    return expr


def calc_expr(df: pd.DataFrame, expr: str) -> pd.Series:


    """


    计算表达式并返回结果。


    参数:


    df (pd.DataFrame): 包含数据的DataFrame。


    expr (str): 需要计算的表达式字符串。


    返回:


    pd.Series: 计算结果的Series对象。


    """


    # 如果表达式是DataFrame的列名,直接返回该列


    if expr in df.columns:


        return df[expr]


    # 将表达式转换为DataFrame列引用的字符串表示


    expr = expr_transform(df, expr)


    # 使用eval函数计算表达式


    # 注意:使用eval可能会带来安全风险,因为它会执行任何传递给它的代码


    # 在实际应用中,你应该确保expr只包含你信任的表达式,或者使用更安全的方法来解析和执行表达式


    se = eval(expr)


    return se


if __name__ == '__main__':


    df = pd.DataFrame({'close': [1, 2, 3, 4, 5]})


    expr = 'close/shift(close,1)-1'


    result = calc_expr(df, expr)


    print(result)

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/268147
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 3小时前
下一篇 3小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注