欢迎访问369期货网 369会员登录 注册

当前位置: 主页 > 期货量化

量化交易实战17 - 当因子遇见线性模型(三)财务因子+线性模型策略能不能挣到钱?回测一下看看吧!!!

时间:2025-10-14 15:26|来源:369期货网|作者:369期货网|点击:
前面我们说到,加上线性回归后,可以找到远低于市值的,然后我们去执行一下原假设,低的时候买入,高的时候卖出。

温馨提示:仅供理解,思路可以用于实盘,但是不可直接用于实盘。



将思路变成策略
简述思路:
使用财务因子和线性模型,列出包含了若干股票的表——表中股票都是市值被低估的。交易思路就是,当某只票出现在这个表中的时候就买入并持仓;当原本在列表中的股票从列表中消失时(也就是市值上市),就将其卖出。
代码:
    # 导入所需库import pandas as pdimport numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.linear_model import Ridge# 初始化函数def initialize(context):    set_params()    set_backtest()    run_daily(trade, time='every_bar')# 设置参数def set_params():    g.days = 0    g.refresh_rate = 5    g.stocknum = 10# 设置回测参数def set_backtest():    set_benchmark('000001.XSHG')    set_option('use_real_price', True)    log.set_level('order', 'error')# 每日交易逻辑def trade(context):    if g.days % g.refresh_rate == 0:        # 获取上证50成分股        stocks = get_index_stocks('000016.XSHG', date=context.current_dt)        # 获取基本面数据        q = query(            valuation.code,            valuation.market_cap,            balance.total_assets - balance.total_liability,            balance.total_assets / balance.total_liability,            income.net_profit,            indicator.inc_revenue_year_on_year,            balance.development_expenditure        ).filter(valuation.code.in_(stocks))        df = get_fundamentals(q, date=context.current_dt)        # 重命名列        df.columns = ['code', 'mcap', 'na', '1/DA_ratio', 'net_income', 'growth', 'RD']        df.set_index('code', inplace=True)        df.fillna(0, inplace=True)        # 特征和目标        X = df.drop(columns=['mcap'])        y = df['mcap']        # 训练线性回归模型        reg = LinearRegression()        reg.fit(X, y)        # 预测市值        predict = pd.DataFrame(reg.predict(X), index=X.index, columns=['predict_mcap'])        diff = df['mcap'] - predict['predict_mcap']        diff = pd.DataFrame(diff, index=X.index, columns=['diff'])        diff = diff.sort_values(by='diff', ascending=True)        # 获取买入前g.stocknum只股票        stockset = list(diff.index[:g.stocknum])        # 获取当前持仓股票        sell_list = list(context.portfolio.positions.keys())        # 卖出不在买入列表中的股票        for stock in sell_list:            if stock not in stockset:                order_target_value(stock, 0)        # 计算买入金额        if len(context.portfolio.positions) < g.stocknum:            num = g.stocknum - len(context.portfolio.positions)            cash = context.portfolio.available_cash / num        else:            cash = 0            num = 0        # 买入新股票        for stock in stockset[:g.stocknum]:            if stock in context.portfolio.positions:                continue            if num == 0:                break            order_target_value(stock, cash)            num -= 1    # 每天更新天数    g.days += 1
    回测结果:
    图片
    不得不说2000-2024年之间的蓝筹股是真的惨,看财务的票居然能跑的这么拉跨,到2024年新的国九条开始后,蓝筹股的表现才稍微好些。
    策略是完美失效的。
    我的回测时间是2022.7.31-2025.7.31

    回测结果分析:根据系统返回的收益概述情况。直观来看,这个策略有点拉垮。再来看具体指标:策略的累计收益率为23.48%,年化收益率为7.51%,超额收益率为12.43%。紧随其后的还有“阿尔法”“贝塔”“夏普比率”“最大回撤”等若干个指标。这些指标对于朋友们来说,还有点儿陌生。咱们就用一点儿篇幅来简单介绍一下几个重点指标。

    阿尔法:也就是Alpha,指的是通过投资,获得的与市场波动无关的回报,简单来说,就是策略收益比基准收益多(或者少)的部分。它的计算公式是

    Alpha=Rp-(Rfp(Rm -Rf))

    其中,Rp是策略的年化收益率,Rf是无风险利润(默认取0.04),Rm是基准收益率,β是策略的贝塔值。阿尔法值越大,说明策略的收益越高。如果有个策略的阿尔法值小于0,那说明使用这个策略进行交易,还不如直接买指数基金赚得多。

    贝塔:也就是Beta,指的是策略对与大盘变化的敏感性。举例来说,假如大盘上涨了1%,而策略的收益上涨了2%,说明贝塔值在2左右。当然这是粗略的说法,详细的计算公式是:

    图片

    式中,Dp 指的是每日策略的收益,Dm指的是每日的基准收益。Cov指的是协方差,Var指的是方差。

    简单地讲,

    如果贝塔值小于0,说明策略收益与大盘的走势相反;

    如果贝塔值等于0,说明策略收益与大盘的走势没有关系;

    如果贝塔值大于0且小于1,说明策略收益与大盘的走势相同,但是波动幅度比大盘的波动幅度小;

    如果贝塔值大于1,说明策略的收益与大盘的走势相同,而且波动幅度比大盘的波动幅度还要大。

    夏普比率:也就是Sharpe Ratio,指的是策略每承受一单位的风险,能够产生多少超额回报。它的计算公式是:

    图片

    式中,Rp是策略的年化收益率,Rf是基准收益。σp是策略收益的标准差,也就是策略收益的波动率。对于策略来说,夏普比率的值越高越好。

    最大回撤:也就是 Max DrawDown,指的是在一定时间范围内,总资产的最大值与最小值的差与最大值的比率。这个指标衡量的是策略可能带来的亏损,其计算公式为:

    图片

    Ppeak:历史最高净值

    Ptrough:历史最低净值

    通俗地说,假设某日我们的总资产P是1万元,而过了若干天,总资产缩水到了8000元,则最大回撤是(10000-8000)/10000x100%=20%。也就是说,该策略的最大回撤是 20%。

    述几个指标之外,回测结果还包含了一些其他指标。这里我们不详细展开,留给大家自己了解即可。回过头来,咱们再说一说策略的表现--策略的累计收益率为23.48%,年化收益率为7.51%--虽然整体跑赢了大盘基准收益,但显然,不管是看到这里的各位还是西西对这个结果是不满意的--费了那么大劲,结果却比买保本理财产品的年化收益率高不了多少,那还不如买理财产品呢。看起来,我们还得继续优化我们的策略才行。

    注意:在本策略中,我们使用了线性回归模型来进行选股。限于篇幅,我们就不展示其他线性模型的使用方法了。感兴趣的朋友可以尝试替换成岭回归或其他的线性模型算法,对比一下看策略的收益能否有效提高。


    再次提示:仅供理解,思路可以用于实盘,但是不可直接用于实盘。
    量化实战 · 目录上一篇量化交易实战16 - 当因子遇见线性模型(二)用线性模型搞交易策略下一篇量化交易实战18 - 因子与决策树和随机森林(一)决策树和随机森林的概念阅读 330



    编辑推荐

    Copyright © 2024-2025 成都宁时科技有限公司 版权所有

    蜀ICP备2022023994号