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

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

量化交易实战11 - 因子来了(二) 如何用量化选股?因子来帮忙(含代码)

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

下面西西将和大家一起探讨第一个问题--“买谁”。

选股,确实不是件容易事。纵观整个A股市场,有几千只股票。光是一眼看过去密密麻麻的数据,就让人头晕眼花,更别说一个一个去分析它们的数据了。

不要着急,我们可以一步一步地把范围缩小。




一、确定股票池

大家都知道几个名词:“沪深300”“上证50”“中证100”“中证200”“中证500”等。这些名词代表的是“指数”,举例来说明:“沪深300”指的就是从上海证券交易所和深圳证券交易所挑选出经营状况良好、规模庞大且流动性非常高的300只股票组成的指数;而“上证50”是上海证券交易所中规模较大、流动性较高的50只股票组成的指数;“中证500”则是在沪深两市中,选出市值较高的800只股票,再把“沪深 300”中的股票剔除出去,余下的500只股票组成的指数。

在所有这些指数中,一般认为“沪深300”“上证50”“中证500”这3个最能体现

市场的情况。简单来说,“沪深 300”体现的是“大盘股”的走势,“上证50”体现的是“大盘股”的走势情况,而“中证500”体现的是“中小盘股”的整体走势。这3个指数没有“好”和“不好”的区别,只是风格不同。大家可以想象一下,对于市值庞大的“超大盘股”来说,要想让它们暴涨或者暴跌,那难度堪比把大象抛到月球上,需要极大的“动能”才行;而“大盘股”的体量也不小,它们的价格波动幅度也不会太大;“中证500”虽然代表“中小盘股”的走势,但由于A股市场经过了这么多年的发展,这些所谓的“中小盘股”的体量也要比创业板、中小板这些板块上的股票大得多,它们的涨跌幅度也只是相对“大盘股”和“超大盘股”来说稍微大一些而已。

作为一个量化新手,西西的建议是先“稳中求进”,不论能不能赚到钱,至少要保证资金的安全--因此选择“沪深300”成分股作为选股的“股票池”,并结合量化选股因子,找到其中财务状况最好、发展前景最好的企业的股票,作为未来的投资标的。


二、获取沪深两市的全部指数


为了让没有量化软件的朋友好实践,西西还是用聚宽去尝试了。

大家可以根据自己使用的量化软件的api去修改哦。

    # 导入聚宽因子库的 get_factor_values 函数from jqfactor import get_factor_values# 导入 pandasimport pandas as pd# 在聚宽环境中运行# 指定 get_all_securities 的 types 参数为 'index'# 查询全部指数indices = get_all_securities(types=['index'])# 查看前十条结果print(indices.head(10))

    运行结果:

    图片


    为了方便展示,我们只选择了其中10条。表中的第一列是指数代码,后面分别是指数的中文名称、简称、上市日期、退市日期和证券类型。对于目前仍然存在的指数,退市日期统一用 2200-01-01表示。


    三、获取股票的市值因子


    前面说的,西西推荐朋友们使用“沪深300”成分股作为选股的股票池。下面我们就来获取沪深300成分股的数据。如果我们想获取这些股票的市值数据,就可以用下面的代码。


      # 导入聚宽的因子分析库from jqfactor import get_factor_values# 使用 get_index_stocks 函数获取沪深300成分股# 使用 get_factor_values 函数获取这些成分股的市值# 注意:get_index_stocks 和 get_factor_values 都是聚宽提供的函数,需要在聚宽环境中运行factor_mc = get_factor_values(    securities=get_index_stocks('000300.XSHG'),  # 获取沪深300成分股    factors=['market_cap'],  # 获取市值因子    end_date='2025-06-08',  # 结束日期    count=1  # 获取最近1天的数据)['market_cap']# 检查结果# 使用 .T 将原始结果进行转置(行变列,列变行)print(factor_mc.T.head())

      运行结果:


      图片

      这里的市值是科学计数法,如2.270492e+11,代表2.270492×10^11。


      我们可以得到“沪深300”成分股在2025年6月6日的市值。



      四、获取股票的现金流因子


      除了关心股票的整体市值之外,我们还想了解企业的现金流与股价的对比情况,也就是“市现率”这个指标的情况。毕竟经济大环境不好的话,充足的现金流才是保证企业生存发展的前提。因此,我们来获取一下股票市现率的倒数(因为市现率越小越好,因此其倒数越大越好)。输入代码如下:


        # 导入聚宽的因子分析库from jqfactor import get_factor_values# 使用 get_index_stocks 函数获取沪深300成分股# 使用 get_factor_values 函数获取这些成分股的市现率倒数(Cash Flow to Price Ratio)factor_cfp = get_factor_values(    securities=get_index_stocks('000300.XSHG'),      factors=['cash_flow_to_price_ratio'],     end_date='2025-06-08',      count=1)['cash_flow_to_price_ratio']# 检查结果# 使用 .T 将原始结果进行转置(行变列,列变行)print(factor_cfp.T.head(5))


        图片

        实现率为负说明公司资金流出,正数说明资金正流入。



        五、获取股票的净利率因子


        既然我们了解了企业的现金流情况,那么接下来我们就要看看这些企业究竟是盈利还是亏损。如果盈利,那么净利润率又是多少呢?我们就继续来查询这些股票的净利润率数据。输入代码如下:


          # 导入聚宽的因子分析库from jqfactor import get_factor_values# 使用 get_index_stocks 函数获取沪深300成分股# 使用 get_factor_values 函数获取这些成分股的净利润率(Net Profit Ratio)factor_npr = get_factor_values(    securities=get_index_stocks('000300.XSHG'),  # 获取沪深300成分股    factors=['net_profit_ratio'],  # 获取净利润率因子    end_date='2025-06-08',  # 结束日期    count=1  # 获取最近1天的数据)['net_profit_ratio']# 检查结果# 使用 .T 将原始结果进行转置(行变列,列变行)print(factor_npr.T.head())
          图片

          000157的净利润率还是比较不错的,约为9.83%,而 000001这只股票的净利润率更是达到了30.8%左右,是一个很不错的数据。

          六、获取股票的净利润增长率因子

          对企业来说,盈利固然重要,比盈利更重要的是,能够持续不断地创造更多的利润。也就是说,企业需要有良好的成长性。衡量成长性的一个重要指标就是净利润的增长率。下面我们就来获取“沪深300”成分股的净利润增长率数据。输入代码如下:

          # 导入聚宽的因子分析库

            from jqfactor import get_factor_values# 使用 get_index_stocks 函数获取沪深300成分股# 使用 get_factor_values 函数获取这些成分股的净利润增长率(Net Profit Growth Rate)factor_npgr = get_factor_values(    securities=get_index_stocks('000300.XSHG'),  # 获取沪深300成分股    factors=['net_profit_growth_rate'],  # 获取净利润增长率因子    end_date='2025-06-09',  # 结束日期    count=1  # 获取最近1天的数据)['net_profit_growth_rate']# 检查结果# 使用 .T 将原始结果进行转置(行变列,列变行)print(factor_npgr.T.head())
            图片

            000157的净利率增长率是很不错滴。


            编辑推荐

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

            蜀ICP备2022023994号