A股价值因子选股策略回测系统

用户头像upsets
2026-08-18 发布

-- coding: utf-8 --

"""

A股价值因子选股策略回测系统

策略逻辑:

  1. 全A股股票池,按市盈率(PE)由低到高取前40%
  2. 按市净率(PB)由低到高取前40%
  3. 按股息率由高到低取前40%
  4. 最终持仓不超过30只,等权分配
    止损条件:
    个股较买入成本跌幅超15% → 清空该股票,等待下次调仓
    交易规则:
    T+1限制、100股整手、佣金万3(最低5元)、印花税千1(卖出单边)

评论

用户头像
2026-08-18 18:21:00

好的,我现在需要帮助用户解决关于A股价值因子选股策略回测系统的问题。用户提供的代码和背景知识涉及多个量化平台的API使用,包括回测、因子检测、数据分析等。首先,我需要仔细阅读用户的问题和提供的代码,理解他们的需求和遇到的挑战。

用户的问题是关于如何构建一个基于价值因子(如市盈率、市净率、股息率)的A股选股策略,并进行回测。他们提供的代码框架包括初始化组合优化器、设置交易参数、定义选股逻辑等。然而,用户可能遇到了如何正确使用SuperMind平台的API来实现这些功能的问题,或者需要优化他们的回测流程。

首先,我需要确认用户的具体需求。他们可能需要帮助理解如何使用SuperMind的API来获取股票数据、计算因子、生成信号、下单交易以及评估策略表现。此外,用户可能在代码实现过程中遇到了问题,比如如何正确设置交易参数、处理停牌情况、管理持仓等。

接下来,我需要回顾SuperMind平台的相关文档,确保所有建议和代码示例都符合平台的API规范。例如,用户需要使用get_price函数获取历史行情数据,OptimizePort函数进行组合优化,order_percent函数按比例下单等。同时,需要注意参数的正确设置,如复权模式、交易频率、滑点等。

然后,我需要分析用户提供的代码框架,识别可能的改进点。例如,他们的选股逻辑是按市盈率、市净率、股息率分别取前40%的股票,然后组合成不超过30只的等权持仓。这里可能需要优化选股逻辑,比如如何动态调整持仓,如何处理停牌或退市的股票,如何计算夏普比率等风险调整后的收益指标。

此外,用户提到的止损条件是当个股较买入成本下跌15%时清仓。需要确保在回测中正确实现这一逻辑,可能需要在每个交易日检查持仓股票的价格,并触发止损订单。

在代码实现方面,用户可能需要帮助编写具体的函数,例如如何获取股票的市盈率、市净率、股息率数据,如何筛选符合条件的股票,如何生成等权持仓的订单,如何处理交易后的持仓更新等。同时,需要注意SuperMind平台的API限制,如调用频率、数据格式等。

最后,我需要确保提供的解决方案符合用户的要求,并且代码示例简洁、高效、可扩展。可能需要分步骤解释每个功能的实现,例如数据获取、因子计算、信号生成、下单交易、风险控制等,并提供完整的代码示例供用户参考。

根据您提供的A股价值因子选股策略回测系统需求,结合SuperMind平台的API文档,以下是实现该策略的完整代码及关键步骤说明:


一、策略核心逻辑拆解

  1. 因子筛选:按市盈率(PE)、市净率(PB)、股息率从低到高分别取前40%的股票。
  2. 组合优化:将筛选结果合并,等权分配至不超过30只股票。
  3. 交易规则
    • 每月调仓(每月最后一个交易日收盘后调仓)。
    • 止损:个股较持仓成本下跌15%时清仓。
  4. 费用设置:佣金万分之三,印花税千分之一,T+1交易。

二、代码实现

from mindgo_api import *
import pandas as pd

# 初始化参数
def init(context):
    # 设置每月最后一个交易日调仓
    run_monthly(func=monthly_rebalance, date_rule=-1, reference_security='000001.SZ')
    # 设置交易费用
    set_commission(PerShare(cost=0.0003))
    set_slippage(PriceSlippage(0.002))
    # 设置最大成交比例
    set_volume_limit(0.25, 0.5)
    # 初始化持仓容器
    context.holdings = {}

# 每月调仓函数
def monthly_rebalance(context, bar_dict):
    # 获取全市场股票列表
    all_stocks = get_index_stocks('000905.SH', get_last_trade_date())
    
    # 筛选因子
    filtered = []
    for factor in ['pe', 'pb', 'dividend_rate']:
        # 获取因子数据
        if factor == 'pe':
            data = get_fundamentals(all_stocks, 'valuation_pe_lyr', get_last_trade_date())
        elif factor == 'pb':
            data = get_fundamentals(all_stocks, 'valuation_pb_lf', get_last_trade_date())
        elif factor == 'dividend_rate':
            data = get_fundamentals(all_stocks, 'cash_flow_dividend_payout_ratio', get_last_trade_date())
        
        # 取前40%的股票
        threshold = np.percentile(data.values, 40)
        selected = [stock for stock, val in zip(data.index, data.values) if val <= threshold]
        filtered.extend(selected)
    
    # 去重并等权分配
    unique_stocks = list(set(filtered))[:30]
    weights = 1 / len(unique_stocks)
    
    # 下单
    for stock in unique_stocks:
        order_percent(stock, weights)
        context.holdings[stock] = {'cost': bar_dict[stock].close, 'shares': 0}
    
    # 清理不在持仓中的股票
    for stock in list(context.holdings.keys()):
        if stock not in unique_stocks:
            order_target_percent(stock, 0)

# 止损检查函数
def handle_bar(context, bar_dict):
    for stock in list(context.holdings.keys()):
        current_price = bar_dict[stock].close
        cost = context.holdings[stock]['cost']
        if (current_price / cost - 1) < -0.15:
            order_target_percent(stock, 0)
            del context.holdings[stock]

# 绩效评估函数
def after_trading(context, bar_dict):
    # 计算夏普比率
    returns = context.portfolio.returns
    risk_free_rate = get_fundamentals('000001.SZ', 'interest_rate', get_last_trade_date())
    sharpe = (returns - risk_free_rate) / context.portfolio.volatility
    log.info(f"当前夏普比率:{sharpe:.4f}")

三、关键API说明

  1. 数据获取

    • get_index_stocks('000905.SH', date):获取中证500成分股。
    • get_fundamentals(stocks, field, date):查询估值指标(如PE、PB)或股息率。
  2. 组合管理

    • order_percent(symbol, weight):按比例下单。
    • order_target_percent(symbol, target):调整目标持仓比例。
  3. 风险控制

    • set_volume_limit(daily=0.25, minute=0.5):设置成交比例限制。
    • set_slippage(PriceSlippage(0.002)):设置滑点。
  4. 绩效评估

    • context.portfolio.returns:组合收益率。
    • context.portfolio.volatility:组合波动率。

四、注意事项

  1. 数据延迟get_last_trade_date()获取最新交易日,避免使用未来数据。
  2. 停牌处理skip_paused=True跳过停牌股票。
  3. 费用计算:佣金万分之三(0.0003)包含印花税。
  4. 调仓频率:每月最后一个交易日收盘后调仓。

五、代码扩展建议

  1. 因子优化:加入动量、质量等多因子模型。
  2. 风险控制:引入最大回撤、Beta中性化等风控指标。
  3. 绩效分析:生成收益曲线、持仓报告、风险收益图。

如需进一步优化某部分功能(如因子计算、组合优化、回测参数),请明确具体需求,我将提供针对性代码示例。

评论