久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    年化238%,回撤10%,夏普3.74 | 輕量級因子表達式引擎python代碼

     AI量化實驗室 2025-09-04 發布于北京
    原創內容第991篇,專注AGI+,AI量化投資、個人成長與財富自由。
    今日策略

    年化238%,回撤10%,夏普3.74。

    策略地址:

    http://www./strategy/68ad3c53c530d4e228fdede0

    如昨天的文章:年化234%,回撤10%,夏普比3.71,3積分可查看參數。所說,專注于ETF是一個更好的選擇。
    對于普通人而言,ETF做量化投資和智能投顧都是不錯的選擇。
    在工程上,還有不少的優點:數據準備簡單,就是價量數據,而且熱門的ETF只有100多支,就算全量也就1000多支。數據量不大。
    本身跨市場,跨品類。
    今天咱們要來說說因子表達式。因子表達式一直都是咱們星球代碼里的核心之一。不過現在開源項目里,因子表達式的項目也越來越豐富。
    不過對于ETF,不需要那么多的功能,因此從技術選型極簡化的角度,我們還是希望只使用pandas和numpy就可以搞定。
    之前我們介紹過vnpy里alpha模塊里內置的類似qlib的polars版本的因子引擎。
    因子表達式的原理
    其實就是一個字符串計算公式——比如“roc(close,20)”——就是計算“收益價的20天漲幅”,利用python的eval函數,把close當成變量,把roc當成函數。——這時候,上下文context里需要有這兩個變量即可運行。

    from datafeed.factor_utils import FactorUtilsimport numpy as npimport pandas as pd
    class FactorBuilder:    def __init__(self, df):        self.df =  df
            context = {}        for method_name in dir(FactorUtils):            if not method_name.startswith('_'):                method = getattr(FactorUtils, method_name)                context[method_name] = method                context[method_name.upper()] = method
            # Add math functions to context        math_funcs = {            'LOG': np.log, 'EXP': np.exp, 'SQRT': np.sqrt, 'ABS': np.abs,            'SIN': np.sin, 'COS': np.cos, 'TAN': np.tan, 'POWER': np.power,            'SIGN': np.sign, 'MAX': np.maximum, 'MIN': np.minimum,            'MEAN': np.mean, 'STD': np.std        }        context.update(math_funcs)
            # Add numpy and pandas to context        context['np'] = np        context['pd'] = pd
            self.context = context        self.update_base_factors()
        def update_base_factors(self):        for c in ['open''high''low''close''volume']:            data = self.df[['date','symbol',c]]            data = data.set_index(['date''symbol'])            data = data[c]            self.context[c.upper()] = data

        def calc_formula(self, expr: str):        try:            context = self.context            result = eval(expr.upper(), context)            print(result)            print(f"Result type: {type(result)}")            if not isinstance(result, pd.Series):                result = pd.Series(result)
                # Ensure result has correct index            if not isinstance(result.index, pd.MultiIndex):                result = pd.Series(result, index=pd.MultiIndex.from_tuples(                    [(d, s) for d, s in zip(result.index, result.index)],                    names=['date''symbol']                ))
                # Ensure index names are correct            if result.index.names != ['date''symbol']:                result.index.names = ['date''symbol']
                # Ensure index is unique            result = result[~result.index.duplicated(keep='first')]            result.name = expr            return result

                #return result.to_frame(name='value')        except Exception as e:            print(f"Formula execution error: {str(e)}")            print("Functions available in context:")            for key in sorted(context.keys()):                if callable(context[key]):                    print(f"- {key}")            raise
        def calc_formulas(self, expr_list:list[str]):        datas = []        for expr in expr_list:            result = self.calc_formula(expr)            datas.append(result)
            df = self.df.copy(deep=True)        df = df.set_index(['date','symbol'])
            datas.append(df)        all = pd.concat(datas, axis=1)        all = all.reset_index(level=1)        return all


    if __name__ == '__main__':    from datafeed.csv_dataloader import CsvDataLoader    df = CsvDataLoader().read_df(symbols=['510300.SH''159915.SZ'])    print(df)    result = FactorBuilder(df).calc_formula('ATR(close,high,low,20)')    print(type(result))
        result = FactorBuilder(df).calc_formulas(['ATR(close,high,low,20)','roc100(close,20)','roc(close,20)'])    print(type(result),result)
        df_close = result.pivot_table(values='close', index=result.index, columns='symbol')    print(df_close)
        df_close = result.pivot_table(values='roc(close,20)', index=result.index, columns='symbol')    print(df_close)
        df_close = result.pivot_table(values='roc100(close,20)', index=result.index, columns='symbol')    print(df_close)

    每天“不管”一點點,每天就變強一天天。
    代碼和數據下載:AI量化實驗室——2025量化投資的星辰大海

    AI量化實驗室 星球,已經運行三年多,1800+會員。

    aitrader代碼,因子表達式引擎、遺傳算法(Deap)因子挖掘引等,支持vnpy,qlib,backtrader和bt引擎,內置多個年化30%+的策略,每周五迭代一次,代碼和數據在星球全部開源。

    點擊 “查看原文”,直接訪問策略集合

    擴展  ·  歷史文章   


    年化390%,回撤7%,夏普6.32 | A股量化策略配置

    年化30.24%,最大回撤19%,綜合動量多因子評分策略再升級(python代碼+數據)

    年化429%,夏普5.51 | 全A股市場回測引擎構建

    年化443%,回撤才7%,夏普5.53,3積分可查看策略參數

      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章

      主站蜘蛛池模板: 2021亚洲国产精品无码 | 亚洲人成网站18禁止无码| 国产成人精彩在线视频| 国产乱码精品一区二区三区四川人| 四虎亚洲精品无码| 国产明星精品无码AV换脸| 精品熟女少妇AV免费观看| 少妇上班人妻精品偷人| 欧美老人巨大XXXX做受视频| 人妻人人澡人人添人人爽| 老色鬼在线精品视频| 日韩系列精品无码免费不卡 | 综合图区亚洲欧美另类图片| 国产精品久久国产三级国不卡顿| 免费无码又爽又刺激高潮虎虎视频 | 久青草国产97香蕉在线视频| 国产欧美日韩一区二区三区| 疯狂做受XXXX高潮国产| 亚洲人成无码WWW久久久 | 无码国模国产在线观看免费| 久久婷婷综合色丁香五月| 国产午精品午夜福利757视频播放| 国产偷窥熟女高潮精品视频| 成人啪精品视频网站午夜| 亚洲AV永久无码精品一区二区国产 | 波多野结衣乳巨码无在线观看| 国产破外女出血视频| 日本乱偷人妻中文字幕在线| 无码AV无码免费一区二区| 免费看国产美女裸体视频| 狠狠婷婷色五月中文字幕| 国产四虎永久免费观看| 人妻少妇偷人精品无码| 国产乱码1卡二卡3卡四卡5| 青青青爽在线视频观看| 男人把女人桶到喷白浆的软件免费| 人妻丝袜AV中文系列先锋影音 | 无码人妻少妇色欲AV一区二区 | 成年在线观看免费人视频| 国产精品无码av不卡| 久久狠狠高潮亚洲精品|