量化策略进阶用基本面数据为你的交易模型注入新动能当你的量化策略在历史回测中表现平平当市场波动让单纯的技术指标频频失效是时候为你的交易模型加点硬菜了。基本面数据就像量化世界里的营养剂能让策略从快餐式交易升级为营养均衡的投资组合。本文将带你深入聚宽平台探索如何将行情数据与财务指标巧妙融合打造更具韧性的量价基本面双因子模型。1. 基本面因子量化策略中被低估的阿尔法源泉很多量化新手会陷入一个误区认为高频交易和复杂的技术指标才是盈利的关键。但数据告诉我们长期来看结合基本面因子的策略往往展现出更强的稳定性和抗风险能力。基本面数据之所以重要是因为它反映了企业的真实经营状况而市场情绪导致的股价波动最终会向基本面回归。在聚宽平台上get_fundamentals()函数就是打开这座宝库的钥匙。与history()获取的行情数据不同它能提取包括但不限于以下核心财务指标估值类指标PE市盈率、PB市净率、PS市销率财务健康度资产负债率、流动比率、现金流成长性指标营收增长率、净利润增长率质量指标ROE净资产收益率、ROIC投资资本回报率# 获取多只股票最新财务数据示例 q query( valuation.code, valuation.pe_ratio, valuation.pb_ratio, valuation.ps_ratio ).filter( valuation.code.in_([000001.XSHE, 600000.XSHG]) ) fund_data get_fundamentals(q, date2023-12-31)注意财务数据通常有季度性更新延迟使用时需注意报告期与实际交易日的对应关系2. 数据融合让量价与基本面产生化学反应单纯的基本面选股就像只看成绩单选学生而纯技术分析则像只观察课堂表现。真正的威力来自于两者的有机结合。以下是三种经典的融合方式2.1 因子分层筛选法先用量价指标初筛再用基本面因子精选用history()筛选出20日均线上穿的股票池用get_fundamentals()从中选择PE低于行业平均的标的结合成交量指标确认入场时机# 分层筛选示例代码 def screen_stocks(context): # 第一步技术面筛选 prices history(20, 1d, close, security_listNone, dfTrue) ma20 prices.mean() ma5 prices.iloc[-5:].mean() tech_stocks ma5[ma5 ma20].index.tolist() # 第二步基本面筛选 q query( valuation.code, valuation.pe_ratio ).filter( valuation.code.in_(tech_stocks), valuation.pe_ratio 15 ) fund_data get_fundamentals(q) final_stocks fund_data[code].tolist() return final_stocks2.2 动态加权评分模型为不同因子分配权重构建综合评分系统因子类型具体指标权重评分标准估值因子PE30%行业百分位质量因子ROE25%绝对值动量因子20日涨幅20%市场排名波动因子30日波动率15%反向评分规模因子流通市值10%行业调整2.3 基本面预警系统用量价信号触发交易用基本面数据过滤假信号当出现MACD金叉时检查公司近两年ROE是否持续10%突破阻力位时验证季度营收增长率是否加速放量下跌时查看负债率是否超过警戒线3. 实战陷阱避开基本面数据使用的常见误区3.1 未来函数问题财务报告发布时间与实际覆盖期存在滞后。假设在2023年10月使用2023Q3的数据实际上该数据可能直到11月才公布。错误的处理方式# 错误示范直接使用当前日期查询 df get_fundamentals(q, datecontext.current_dt) # 可能导致未来函数正确做法应该是# 正确做法使用报告期或滞后日期 df get_fundamentals(q, statDate2023q3) # 明确指定报告期 # 或 df get_fundamentals(q, datecontext.previous_date) # 使用上一个交易日3.2 数据标准化挑战不同行业、不同规模的公司在财务指标上存在天然差异。直接比较银行和科技公司的PB就像比较苹果和橙子。解决方法行业中性化计算指标在行业内的百分位# 计算行业PE百分位示例 industry_pe get_industry_pe(stock_code) stock_pe get_fundamentals(query(valuation.pe_ratio).filter(valuation.codestock_code)) pe_percentile (stock_pe / industry_pe) * 100规模调整按市值分组比较时间序列标准化使用Z-score等方法3.3 财务数据频率与交易频率错配日频交易策略使用季度更新的财务数据时会出现信息更新不及时的问题。解决方案对低频财务数据进行插值处理建立财务数据变化率的衍生指标结合高频的舆情数据作为补充4. 进阶技巧提升基本面因子效能的实用方法4.1 构建复合因子单一财务指标往往解释力有限但通过科学组合可以产生更稳定的阿尔法# 质量-价值复合因子示例 def get_quality_value_score(stock_list): q query( valuation.code, indicator.roe, # 质量因子 valuation.pe_ratio, # 价值因子 valuation.pb_ratio ).filter( valuation.code.in_(stock_list) ) df get_fundamentals(q) # 标准化处理 df[roe_norm] (df[roe] - df[roe].mean()) / df[roe].std() df[pe_norm] (df[pe_ratio].max() - df[pe_ratio]) / (df[pe_ratio].max() - df[pe_ratio].min()) # 复合评分 df[qv_score] df[roe_norm] * 0.6 df[pe_norm] * 0.4 return df.sort_values(qv_score, ascendingFalse)4.2 动态因子权重调整市场环境变化时不同因子的有效性也会改变。可以通过以下方法实现动态调整市场状态识别波动率水平市场趋势强度行业轮动速度因子权重映射表市场状态估值因子权重质量因子权重动量因子权重牛市初期40%30%30%牛市后期20%50%30%熊市中期60%20%20%震荡市30%40%30%4.3 基本面与技术面背离交易当两者出现背离时往往意味着重要的交易机会正向背离股价创新低但基本面改善 → 潜在买入机会营收增长加速但股价下跌毛利率提升但估值压缩负向背离股价创新高但基本面恶化 → 潜在卖出信号PE扩张但ROE下滑股价上涨但自由现金流转为负# 背离检测示例 def detect_divergence(stock_code): # 获取价格数据 prices history(250, 1d, close, security_list[stock_code], dfTrue) # 获取财务数据 q query( indicator.inc_revenue_year_on_year # 营收同比增长 ).filter( valuation.code stock_code ) fund_data get_fundamentals(q, statDateget_last_quarter()) # 计算250日价格变化 price_change (prices.iloc[-1] - prices.iloc[0]) / prices.iloc[0] # 判断背离 if price_change -0.2 and fund_data[inc_revenue_year_on_year] 0.3: return positive_divergence elif price_change 0.5 and fund_data[inc_revenue_year_on_year] -0.1: return negative_divergence else: return no_divergence5. 从回测到实盘基本面策略的特殊考量基本面策略在实盘中的表现往往与回测存在差异主要原因包括数据更新时间差回测中所有数据都是已知的而实盘中需要等待财报发布行业标准变化会计准则调整会影响财务数据的可比性极端市场环境系统性风险下因子可能失效实盘优化建议设置缓冲期财报公布后观察1-2周再交易多因子冗余准备3-5个相关性低的基本面因子动态止损基本面恶化时及时退出容量监控关注策略资金容量与流动性匹配重要提示任何策略都需要至少3个完整市场周期包含牛熊的测试单纯牛市中的优异表现可能只是运气在实际操作中我发现将基本面因子与简单均线系统结合往往比复杂模型更稳健。比如用PE百分位控制仓位在估值低位时增加头寸高位时减少暴露这种朴素的方法在长期回测中显示出惊人的稳定性。
别再只用history()了!用get_fundamentals()给你的量化策略加点‘基本面’佐料
发布时间:2026/5/31 20:27:25
量化策略进阶用基本面数据为你的交易模型注入新动能当你的量化策略在历史回测中表现平平当市场波动让单纯的技术指标频频失效是时候为你的交易模型加点硬菜了。基本面数据就像量化世界里的营养剂能让策略从快餐式交易升级为营养均衡的投资组合。本文将带你深入聚宽平台探索如何将行情数据与财务指标巧妙融合打造更具韧性的量价基本面双因子模型。1. 基本面因子量化策略中被低估的阿尔法源泉很多量化新手会陷入一个误区认为高频交易和复杂的技术指标才是盈利的关键。但数据告诉我们长期来看结合基本面因子的策略往往展现出更强的稳定性和抗风险能力。基本面数据之所以重要是因为它反映了企业的真实经营状况而市场情绪导致的股价波动最终会向基本面回归。在聚宽平台上get_fundamentals()函数就是打开这座宝库的钥匙。与history()获取的行情数据不同它能提取包括但不限于以下核心财务指标估值类指标PE市盈率、PB市净率、PS市销率财务健康度资产负债率、流动比率、现金流成长性指标营收增长率、净利润增长率质量指标ROE净资产收益率、ROIC投资资本回报率# 获取多只股票最新财务数据示例 q query( valuation.code, valuation.pe_ratio, valuation.pb_ratio, valuation.ps_ratio ).filter( valuation.code.in_([000001.XSHE, 600000.XSHG]) ) fund_data get_fundamentals(q, date2023-12-31)注意财务数据通常有季度性更新延迟使用时需注意报告期与实际交易日的对应关系2. 数据融合让量价与基本面产生化学反应单纯的基本面选股就像只看成绩单选学生而纯技术分析则像只观察课堂表现。真正的威力来自于两者的有机结合。以下是三种经典的融合方式2.1 因子分层筛选法先用量价指标初筛再用基本面因子精选用history()筛选出20日均线上穿的股票池用get_fundamentals()从中选择PE低于行业平均的标的结合成交量指标确认入场时机# 分层筛选示例代码 def screen_stocks(context): # 第一步技术面筛选 prices history(20, 1d, close, security_listNone, dfTrue) ma20 prices.mean() ma5 prices.iloc[-5:].mean() tech_stocks ma5[ma5 ma20].index.tolist() # 第二步基本面筛选 q query( valuation.code, valuation.pe_ratio ).filter( valuation.code.in_(tech_stocks), valuation.pe_ratio 15 ) fund_data get_fundamentals(q) final_stocks fund_data[code].tolist() return final_stocks2.2 动态加权评分模型为不同因子分配权重构建综合评分系统因子类型具体指标权重评分标准估值因子PE30%行业百分位质量因子ROE25%绝对值动量因子20日涨幅20%市场排名波动因子30日波动率15%反向评分规模因子流通市值10%行业调整2.3 基本面预警系统用量价信号触发交易用基本面数据过滤假信号当出现MACD金叉时检查公司近两年ROE是否持续10%突破阻力位时验证季度营收增长率是否加速放量下跌时查看负债率是否超过警戒线3. 实战陷阱避开基本面数据使用的常见误区3.1 未来函数问题财务报告发布时间与实际覆盖期存在滞后。假设在2023年10月使用2023Q3的数据实际上该数据可能直到11月才公布。错误的处理方式# 错误示范直接使用当前日期查询 df get_fundamentals(q, datecontext.current_dt) # 可能导致未来函数正确做法应该是# 正确做法使用报告期或滞后日期 df get_fundamentals(q, statDate2023q3) # 明确指定报告期 # 或 df get_fundamentals(q, datecontext.previous_date) # 使用上一个交易日3.2 数据标准化挑战不同行业、不同规模的公司在财务指标上存在天然差异。直接比较银行和科技公司的PB就像比较苹果和橙子。解决方法行业中性化计算指标在行业内的百分位# 计算行业PE百分位示例 industry_pe get_industry_pe(stock_code) stock_pe get_fundamentals(query(valuation.pe_ratio).filter(valuation.codestock_code)) pe_percentile (stock_pe / industry_pe) * 100规模调整按市值分组比较时间序列标准化使用Z-score等方法3.3 财务数据频率与交易频率错配日频交易策略使用季度更新的财务数据时会出现信息更新不及时的问题。解决方案对低频财务数据进行插值处理建立财务数据变化率的衍生指标结合高频的舆情数据作为补充4. 进阶技巧提升基本面因子效能的实用方法4.1 构建复合因子单一财务指标往往解释力有限但通过科学组合可以产生更稳定的阿尔法# 质量-价值复合因子示例 def get_quality_value_score(stock_list): q query( valuation.code, indicator.roe, # 质量因子 valuation.pe_ratio, # 价值因子 valuation.pb_ratio ).filter( valuation.code.in_(stock_list) ) df get_fundamentals(q) # 标准化处理 df[roe_norm] (df[roe] - df[roe].mean()) / df[roe].std() df[pe_norm] (df[pe_ratio].max() - df[pe_ratio]) / (df[pe_ratio].max() - df[pe_ratio].min()) # 复合评分 df[qv_score] df[roe_norm] * 0.6 df[pe_norm] * 0.4 return df.sort_values(qv_score, ascendingFalse)4.2 动态因子权重调整市场环境变化时不同因子的有效性也会改变。可以通过以下方法实现动态调整市场状态识别波动率水平市场趋势强度行业轮动速度因子权重映射表市场状态估值因子权重质量因子权重动量因子权重牛市初期40%30%30%牛市后期20%50%30%熊市中期60%20%20%震荡市30%40%30%4.3 基本面与技术面背离交易当两者出现背离时往往意味着重要的交易机会正向背离股价创新低但基本面改善 → 潜在买入机会营收增长加速但股价下跌毛利率提升但估值压缩负向背离股价创新高但基本面恶化 → 潜在卖出信号PE扩张但ROE下滑股价上涨但自由现金流转为负# 背离检测示例 def detect_divergence(stock_code): # 获取价格数据 prices history(250, 1d, close, security_list[stock_code], dfTrue) # 获取财务数据 q query( indicator.inc_revenue_year_on_year # 营收同比增长 ).filter( valuation.code stock_code ) fund_data get_fundamentals(q, statDateget_last_quarter()) # 计算250日价格变化 price_change (prices.iloc[-1] - prices.iloc[0]) / prices.iloc[0] # 判断背离 if price_change -0.2 and fund_data[inc_revenue_year_on_year] 0.3: return positive_divergence elif price_change 0.5 and fund_data[inc_revenue_year_on_year] -0.1: return negative_divergence else: return no_divergence5. 从回测到实盘基本面策略的特殊考量基本面策略在实盘中的表现往往与回测存在差异主要原因包括数据更新时间差回测中所有数据都是已知的而实盘中需要等待财报发布行业标准变化会计准则调整会影响财务数据的可比性极端市场环境系统性风险下因子可能失效实盘优化建议设置缓冲期财报公布后观察1-2周再交易多因子冗余准备3-5个相关性低的基本面因子动态止损基本面恶化时及时退出容量监控关注策略资金容量与流动性匹配重要提示任何策略都需要至少3个完整市场周期包含牛熊的测试单纯牛市中的优异表现可能只是运气在实际操作中我发现将基本面因子与简单均线系统结合往往比复杂模型更稳健。比如用PE百分位控制仓位在估值低位时增加头寸高位时减少暴露这种朴素的方法在长期回测中显示出惊人的稳定性。