当前位置: 首页 > news >正文

别再只用history()了!用get_fundamentals()给你的量化策略加点‘基本面’佐料

量化策略进阶:用基本面数据为你的交易模型注入新动能

当你的量化策略在历史回测中表现平平,当市场波动让单纯的技术指标频频失效,是时候为你的交易模型加点"硬菜"了。基本面数据就像量化世界里的营养剂,能让策略从"快餐式"交易升级为"营养均衡"的投资组合。本文将带你深入聚宽平台,探索如何将行情数据与财务指标巧妙融合,打造更具韧性的"量价+基本面"双因子模型。

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, date='2023-12-31')

注意:财务数据通常有季度性更新延迟,使用时需注意报告期与实际交易日的对应关系

2. 数据融合:让量价与基本面产生化学反应

单纯的基本面选股就像只看成绩单选学生,而纯技术分析则像只观察课堂表现。真正的威力来自于两者的有机结合。以下是三种经典的融合方式:

2.1 因子分层筛选法

先用量价指标初筛,再用基本面因子精选:

  1. history()筛选出20日均线上穿的股票池
  2. get_fundamentals()从中选择PE低于行业平均的标的
  3. 结合成交量指标确认入场时机
# 分层筛选示例代码 def screen_stocks(context): # 第一步:技术面筛选 prices = history(20, '1d', 'close', security_list=None, df=True) 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_stocks

2.2 动态加权评分模型

为不同因子分配权重,构建综合评分系统:

因子类型具体指标权重评分标准
估值因子PE30%行业百分位
质量因子ROE25%绝对值
动量因子20日涨幅20%市场排名
波动因子30日波动率15%反向评分
规模因子流通市值10%行业调整

2.3 基本面预警系统

用量价信号触发交易,用基本面数据过滤假信号:

  • 当出现MACD金叉时,检查公司近两年ROE是否持续>10%
  • 突破阻力位时,验证季度营收增长率是否加速
  • 放量下跌时,查看负债率是否超过警戒线

3. 实战陷阱:避开基本面数据使用的常见误区

3.1 未来函数问题

财务报告发布时间与实际覆盖期存在滞后。假设在2023年10月使用2023Q3的数据,实际上该数据可能直到11月才公布。错误的处理方式:

# 错误示范:直接使用当前日期查询 df = get_fundamentals(q, date=context.current_dt) # 可能导致未来函数

正确做法应该是:

# 正确做法:使用报告期或滞后日期 df = get_fundamentals(q, statDate='2023q3') # 明确指定报告期 # 或 df = get_fundamentals(q, date=context.previous_date) # 使用上一个交易日

3.2 数据标准化挑战

不同行业、不同规模的公司在财务指标上存在天然差异。直接比较银行和科技公司的PB就像比较苹果和橙子。解决方法:

  1. 行业中性化:计算指标在行业内的百分位

    # 计算行业PE百分位示例 industry_pe = get_industry_pe(stock_code) stock_pe = get_fundamentals(query(valuation.pe_ratio).filter(valuation.code==stock_code)) pe_percentile = (stock_pe / industry_pe) * 100
  2. 规模调整:按市值分组比较

  3. 时间序列标准化:使用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', ascending=False)

4.2 动态因子权重调整

市场环境变化时,不同因子的有效性也会改变。可以通过以下方法实现动态调整:

  1. 市场状态识别

    • 波动率水平
    • 市场趋势强度
    • 行业轮动速度
  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], df=True) # 获取财务数据 q = query( indicator.inc_revenue_year_on_year # 营收同比增长 ).filter( valuation.code == stock_code ) fund_data = get_fundamentals(q, statDate=get_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_divergence'

5. 从回测到实盘:基本面策略的特殊考量

基本面策略在实盘中的表现往往与回测存在差异,主要原因包括:

  • 数据更新时间差:回测中所有数据都是已知的,而实盘中需要等待财报发布
  • 行业标准变化:会计准则调整会影响财务数据的可比性
  • 极端市场环境:系统性风险下因子可能失效

实盘优化建议

  1. 设置缓冲期:财报公布后观察1-2周再交易
  2. 多因子冗余:准备3-5个相关性低的基本面因子
  3. 动态止损:基本面恶化时及时退出
  4. 容量监控:关注策略资金容量与流动性匹配

重要提示:任何策略都需要至少3个完整市场周期(包含牛熊)的测试,单纯牛市中的优异表现可能只是运气

在实际操作中,我发现将基本面因子与简单均线系统结合,往往比复杂模型更稳健。比如用PE百分位控制仓位,在估值低位时增加头寸,高位时减少暴露,这种朴素的方法在长期回测中显示出惊人的稳定性。

http://www.jsqmd.com/news/924993/

相关文章:

  • 别再折腾驱动了!用DKMS一劳永逸解决Ubuntu内核升级后的RTL8822CE网卡失效问题
  • Visuino图形化编程实现Arduino舵机交互控制:从按钮到PWM的实践指南
  • 02 基础语法 JavaScript 入门到精通全套教程 19-33
  • 2026西安黄金回收上门服务榜单丨告别出门排队 当面验金秒到账全指南 - 西安闲转记
  • 基于Arduino与LM741的心电图采集系统:从模拟电路到心率检测
  • CAXA 块
  • 6款主流降AIGC网站 降痕效果拉满
  • AI Agent Harness Engineering 在制造:巡检、质检与工艺优化
  • 【头部银行已紧急启用】:Gemini风控v2.3动态阈值引擎上线倒计时,3类高危场景必须今日校准
  • 个人助手Agent:全场景任务自动执行
  • Windows Cleaner终极指南:免费解决C盘爆红的完整解决方案
  • 告别卡顿!5分钟用GHelper释放华硕笔记本全部潜力
  • 2026芜湖奢侈品名牌包包名牌手表回收哪家报价公道? - 鸿运名品
  • 2026毕业生降AI率工具盘点:深度消痕+保护隐私哪家强?
  • Python协程实战:异步高效爬取《鬼神传》全本小说
  • 深度解析:RevokeMsgPatcher如何彻底解决微信QQ消息撤回烦恼
  • 基于Arduino与433MHz模块的无线距离报警器设计与实现
  • Arduino引脚扩展实战:74HC595级联控制16个LED实现18种特效
  • 微信聊天记录永久保存与智能分析的终极指南:WeChatMsg完整解决方案
  • 如何用Obsidian PDF++插件实现PDF知识管理的革命性突破:3步构建你的智能文献系统
  • Jamstack开发:构建高性能静态网站
  • 黄大年茶思屋榜文132期 储能篇 第1题 储能锂离子大电芯析锂无损检测
  • 碧蓝航线自动化脚本终极指南:解放双手,轻松管理你的舰队
  • 2026年4月眼镜片厂家推荐,司徕柏智感变色镜片/司徕柏全景高清镜片/超清碧玉膜镜片/渐进片,眼镜片厂商哪家好 - 品牌推荐师
  • 3步掌握YimMenu:GTA5开源防护工具完全实战指南
  • VisualCppRedist AIO:终结Windows DLL缺失困扰的完整解决方案
  • 如何构建企业级游戏串流服务器:Sunshine高级部署完全指南
  • 芜湖黄金店哪家金价最便宜? - 鸿运名品
  • PKSM终极指南:一站式管理所有世代宝可梦存档的免费方案
  • 5分钟掌握AMD Ryzen处理器调试技巧:SMUDebugTool完全指南