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

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

量化交易实战16 - 当因子遇见线性模型(二)用线性模型搞交易策略

时间:2025-10-14 15:26|来源:369期货网|作者:369期货网|点击:

经过了上一章的学习,朋友们对线性模型的原理和用法有了基本的了解。那么如何借助线性模型来制定交易策略呢?

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



咱们来梳理一下思路:假如我们把炒股看作做生意,那么西西要做的是以较低的价格“进货”(买入股票),等价格涨起来之后“出货”(卖出股票)。那么问题来了--我们怎么知道股票的价格是在较低的水平,还是在较高的水平呢?

这时需要做一个假设--市场是有效的,在某个时期内,企业的估值总是在一定的范围内上下波动(有时候被低估,有时被高估)。市场整体存在一个公允的估值方法,被低估的股票迟早会上涨,被高估的股票迟早会回调。借助线性模型的图可以说明这个假设,

如图所示。

图片

准备因子

既然我们要判断某只股票的估值,不妨想一想:财务状况越好的企业,理应得到更高的估值。因此,我们要用与财务相关的因子,如净资产、资产负债率、净利润、利润的增长,以及在研发方面的投入等。当然,资产负债率越低,说明财务状况越好,与估值呈现正相关的关系,我们来取它的倒数。下面我们就来获取这些因代码如下:

    # 获取上证50成分股stocks = get_index_stocks('000016.XSHG')# 构造查询语句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)# 设置列名df.columns = [    'code',    'mcap',    'na',    '1/DA_ratio',    'net_income',    'growth',    'RD']# 查看前几行df.head()

    运行结果:

    图片

    训练模型

    在获取数据之后,接下来我们来对数据做预处理。首先,把股票代码作为数据表的imndex,让它们不参与模型的训练;其次,要把数据分成特征和目标--股票的市值作为数据集的目标值,其他的财务因子作为特征值;最后,要用0来替换掉原始数据中的空值,防止在模型训练的过程中产生错误。输入代码如下:

      import pandas as pdfrom sklearn.linear_model import LinearRegression# 1. 设置股票代码为索引df.index = df['code'].values# 2. 删除原来的 'code' 列df = df.drop('code', axis=1)# 3. 特征值 X(去掉 mcap)X = df.drop('mcap', axis=1)# 4. 目标值 y(市值)y = df['mcap']# 5. 用 0 填补缺失值X = X.fillna(0)y = y.fillna(0)# 6. 线性回归建模reg = LinearRegression()reg.fit(X, y)# 7. 预测值predict = pd.DataFrame(reg.predict(X), index=y.index, columns=['predict_mcap'])# 8. 查看结果predict.head()

      运行结果:

      图片

      【结果分析】通过使用样本股票的特征数据进行训练之后,模型已经可以对股票的市值做出预测了。以600028为例,可以看到,这只股票真实的市值大约是7153.47亿元,模型给出的预测市值大约是4537.79亿元,也就是说,模型给出的结论是:这只股票的价值被高估了。

      基于模型的预测进行选股

      既然现在模型已经可以对股票的市值做出预测了,我们就继续验证西西的假设:把真实的市值比模型预测值低得最多的股票找出来。输入代码如下:

        # 1. 计算实际市值与预测市值的差值diff = df['mcap'] - predict['predict_mcap']# 2. 将差值存入一个DataFrame,index保持为股票代码diff = pd.DataFrame(diff, index=y.index, columns=['diff'])# 3. 按差值升序排序(差值越小,说明被低估越严重)diff = diff.sort_values(by='diff', ascending=True)# 4. 查看被低估最多的前10只股票diff.head(10)
        图片

        从运行结果可以看出,程序将计算出的实际市值比模型预测市值低的最多的十只股票进行了返回,后面我们将对列表中的股票买入并持有,一旦某只股票的市值明显上升后,与模型预测的市值差距缩小,这时该股票可能不会再出现在这个列表中,此时就考虑将该股票卖出。

        注意:因为市值会变化,所以大家输出的股票跟我的可能会有差异,是正常的哈。


        编辑推荐

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

        蜀ICP备2022023994号