量化交易:多因子选股结合布林带择时

哈喽,大家好,我是木头左!

多因子选股策略是一种基于多个财务指标来筛选股票的方法。这种策略认为,通过综合考虑多个因素,可以更全面地评估一家公司的价值和盈利潜力。
感兴趣的朋友,可以在下方公号内回复:001,即可获取源码,共同交流!

策略的基本原理

在本策略中,我们选择了市值、利润、现金流和负债四个指标来计算股票的排名。市值反映了公司的规模,利润代表了公司的盈利能力,现金流显示了公司的流动性,而负债则揭示了公司的财务风险。

股票池的构建

我们的目标是选出排名靠前的二十只股票,构建我们的股票池。具体步骤如下:

  1. 数据获取:收集所有股票的市值、利润、现金流和负债数据。
  2. 指标标准化:对每个指标进行标准化处理,消除不同量纲的影响。
  3. 权重分配:为每个指标分配权重,市值40%,利润30%,现金流20%,负债10%。
  4. 综合评分:根据权重计算每只股票的综合得分。
  5. 排名筛选:选择得分最高的前二十只股票。

布林带择时:把握买卖的最佳时机

布林带是一种基于价格波动性来构建交易区间的技术分析工具。它可以帮助我们识别市场的过度买入或卖出状态,从而找到买卖的时机。

策略的基本原理

布林带由中轨(MB)、上轨(UB)和下轨(LB)组成,其中:

  • 中轨(MB):通常是20日的移动平均线。
  • 上轨(UB):中轨加上两倍的标准差。
  • 下轨(LB):中轨减去两倍的标准差。

买卖时机的判断

在本策略中,我们制定了以下规则:

  • 卖出规则:当持有股票,且股价穿过布林带中轨时,卖出股票。
  • 买入规则:当不持有股票,且股价穿过布林带上界时,买入股票。

聚宽平台上的Python实现

market_open(context) 函数被设计为每月开盘时运行一次,根据上一交易日的因子值进行调仓。

def market_open(context):
    # 卖出当前持有的所有股票,进行资金的重新分配
    bulk_sell(context)
    # 清空当前的持仓列表,准备重新选股
    context.own_list = []
    # 获取沪深300指数成分股作为潜在的股票池
    universe = get_index_stocks('000300.XSHG')

多因子数据获取与处理

  • 使用 get_fundamentals 函数获取股票池中股票的市值、市盈率(PE)、净利润同比增长率和净资产收益率(ROE)等财务指标。
  • 选择沪深300指数(‘000300.XSHG’)作为股票池,即 universe = get_index_stocks(‘000300.XSHG’)。
df = get_fundamentals(query(
    valuation.code, valuation.market_cap, valuation.pe_ratio, 
    indicator.inc_net_profit_year_on_year, indicator.roe
).filter(
    valuation.code.in_(universe), valuation.pe_ratio > 0, 
    indicator.inc_net_profit_year_on_year > 0
))
# 设置股票代码为索引,以便于后续处理
df.set_index(['code'], inplace=True)

因子加权与排名

  • 对市盈率进行升序排名,对净利润同比增长率和净资产收益率进行降序排名,然后将这些排名相加得到最终的因子值。
  • 排名(rank)是一种去量纲的方法,使得不同单位的因子可以相加。
# 对市盈率进行升序排名,对净利润同比增长率和净资产收益率进行降序排名
final_factor = df['pe_ratio'].rank(ascending=True) + \
                df['inc_net_profit_year_on_year'].rank(ascending=False) + \
                df['roe'].rank(ascending=False)

持仓股票列表的确定

根据最终的因子值,选取排名前20的股票作为目标持仓。

# 选取排名前20的股票作为目标持仓
stock_list = final_factor.sort_values(ascending=True)[:20].index.tolist()
# 更新上下文的持仓列表
context.list = stock_list

布林带择时策略

开盘时运行布林带择时策略,boll(context) 布林带的实现参考量化交易:布林带突破策略的python实现

def market_open_bolling(context):
    # 计算每只股票平均可使用的资金
    context.cash = context.portfolio.cash / len(context.list)
    for symbol in context.list:  # 遍历股票池
        context.symbol = symbol  # 设置当前股票
        # 调用布林带择时函数(未提供实现)
        boll(context)

这段代码首先构建了一个包含前二十只高盈利潜力股票的股票池,然后使用布林带择时来决定买卖时机。在每个交易日开始前,它会根据最新的财务数据更新股票池,并调整仓位。在交易时段内,它会实时监控股票价格,根据布林带的变化来执行买卖操作。回测结果如下:

在这里插入图片描述

结语

多因子选股结合布林带择时的量化交易策略,是一种综合了基本面分析和技术分析的方法,所有的选股和择时都可以结合起来,用效果更佳。
市场有风险,交易需谨慎。
感兴趣的朋友,可以在下方公号内回复:001,即可获取源码,共同交流!

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 14:06:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 14:06:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 14:06:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 14:06:01       20 阅读

热门阅读

  1. Android malloc_debug实现原理及使用

    2024-04-23 14:06:01       15 阅读
  2. Golang专题精进

    2024-04-23 14:06:01       13 阅读
  3. golang实现获取切片的交集和差集

    2024-04-23 14:06:01       12 阅读
  4. spark运行报错

    2024-04-23 14:06:01       10 阅读
  5. Android UI底层绘制原理

    2024-04-23 14:06:01       10 阅读
  6. leetcode热题HOT 155. 最小栈

    2024-04-23 14:06:01       10 阅读
  7. 【React Router】快速使用

    2024-04-23 14:06:01       14 阅读