别再只盯着K线了!用Python的get_fundamentals()函数,5分钟筛出被低估的潜力股 用Python挖掘被低估的潜力股get_fundamentals()实战指南当大多数投资者还在K线图中寻找买卖信号时聪明的资金早已转向基本面数据的深度挖掘。本文将带你用Python的get_fundamentals()函数构建一个高效的基本面筛选系统5分钟内找出那些被市场低估的优质标的。1. 为什么基本面分析比技术指标更可靠技术分析关注价格波动而基本面分析直击企业价值核心。想象一下当你在二手市场买手机是更关注它的价格曲线还是实际配置和使用体验股票投资也是同样道理。技术指标的三大局限性滞后性所有指标都基于历史价格计算同质化使用相同指标的投资者看到相同信号易操纵短期价格可能被大资金影响相比之下基本面数据如市盈率(PE)、市净率(PB)能反映企业真实价值。我们来看一个典型的价值陷阱案例# 技术指标显示买入信号但基本面恶化的股票示例 import pandas as pd from jqdatasdk import * # 假设某股票代码为600XXX.XSHG tech_data get_price(600XXX.XSHG, end_date2023-12-31, frequencydaily, fields[close], count100)[close] # 计算MACD等技术指标... fundamental get_fundamentals( query(valuation.pe_ratio, indicator.roe), date2023-12-31 ) print(fPE Ratio: {fundamental[pe_ratio][0]}, ROE: {fundamental[roe][0]})当技术指标发出买入信号但PE高达50倍且ROE低于5%时这就是典型的价值陷阱。2. get_fundamentals()核心参数详解聚宽平台的get_fundamentals()函数是我们挖掘金矿的地质雷达。让我们拆解它的核心组件2.1 查询构建器query()query()是筛选条件的装配车间支持多种财务表查询from jqdatasdk import query, valuation, indicator # 基础查询结构示例 q query( valuation.code, # 股票代码 valuation.pe_ratio, # 市盈率 valuation.pb_ratio, # 市净率 indicator.roe, # 净资产收益率 indicator.inc_revenue_year # 营收同比增长 ).filter( valuation.pe_ratio 15, # 市盈率低于15倍 valuation.pb_ratio 2 # 市净率低于2倍 ).order_by( valuation.pe_ratio.asc() # 按市盈率升序排列 ).limit(50) # 限制50条结果常用财务表对比表名核心字段适用场景valuationpe_ratio, pb_ratio估值分析indicatorroe, inc_revenue盈利能力分析balancetotal_assets, equity资产负债表分析cash_flowcash_from_operations现金流质量分析2.2 日期参数的精妙运用date和statDate参数决定了获取哪一时点的财务数据# 获取最新财报数据 latest get_fundamentals(q, date2023-12-31) # 获取2023年三季度数据 q3_2023 get_fundamentals(q, statDate2023q3) # 动态获取回测前一天数据(在策略中特别有用) # 假设当前回测日期是2023-10-20 context.previous_day context.current_dt - timedelta(days1) dynamic_data get_fundamentals(q, datecontext.previous_day)提示季报数据通常在季度结束后1-2个月发布使用statDate获取的是原始财报数据而date参数获取的是指定日期能看到的最新数据。3. 构建多因子筛选模型单一指标容易失真我们需要构建多因子模型。以下是典型的格雷厄姆式价值筛选def graham_screen(): 本杰明·格雷厄姆改进版价值筛选 q query( valuation.code, valuation.pe_ratio, valuation.pb_ratio, indicator.roe, indicator.inc_revenue_year, valuation.market_cap ).filter( valuation.pe_ratio 15, valuation.pb_ratio 1.5, indicator.roe 0.15, indicator.inc_revenue_year 0.1, valuation.market_cap 50 # 市值大于50亿避免小盘股 ).order_by( (valuation.pe_ratio * valuation.pb_ratio).asc() # 综合估值排序 ).limit(30) df get_fundamentals(q) # 添加股息率因子 dividend_q query( valuation.code, valuation.dividend_yield ).filter( valuation.code.in_(df[code]) ) dividend_df get_fundamentals(dividend_q) return pd.merge(df, dividend_df, oncode)因子权重分配建议因子权重说明PE30%估值核心指标PB25%资产质量指标ROE20%盈利能力指标营收增长15%成长性指标股息率10%现金流回报指标4. 从数据到决策实战分析流程获取数据只是第一步真正的价值在于解读。让我们以具体案例演示分析流程4.1 数据获取与清洗# 获取中证500成分股基本面数据 hs300_stocks get_index_stocks(000300.XSHG) q query( valuation.code, valuation.pe_ratio, valuation.pb_ratio, indicator.roe, indicator.inc_revenue_year, valuation.market_cap ).filter( valuation.code.in_(hs300_stocks) ) raw_data get_fundamentals(q) # 数据清洗 clean_data raw_data[ (raw_data[pe_ratio] 0) (raw_data[pb_ratio] 0) (raw_data[roe].notnull()) ].copy() # 计算综合得分 clean_data[pe_rank] clean_data[pe_ratio].rank(pctTrue) clean_data[pb_rank] clean_data[pb_ratio].rank(pctTrue) clean_data[roe_rank] clean_data[roe].rank(pctTrue) clean_data[score] 0.4*clean_data[pe_rank] 0.3*clean_data[pb_rank] - 0.3*clean_data[roe_rank]4.2 可视化分析import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize(12, 8)) sns.scatterplot(dataclean_data, xpe_ratio, ypb_ratio, hueroe, sizemarket_cap, sizes(20, 200), paletteviridis) plt.xlim(0, 50) plt.ylim(0, 5) plt.axvline(x15, colorr, linestyle--) plt.axhline(y1.5, colorr, linestyle--) plt.title(PE-PB-ROE三维分析, fontsize15) plt.xlabel(市盈率(PE), fontsize12) plt.ylabel(市净率(PB), fontsize12) plt.show()4.3 深入个股分析筛选出潜力股后需要深入分析其财务细节target_code 600519.XSHG # 示例股票代码 # 获取5年财务数据 years [2019, 2020, 2021, 2022, 2023] financials [] for year in years: data get_fundamentals( query( valuation.pe_ratio, indicator.roe, indicator.inc_revenue_year, balance.total_assets, cash_flow.net_operate_cash_flow ).filter( valuation.code target_code ), statDateyear ) financials.append(data) # 构建趋势分析DataFrame trend_df pd.concat(financials) trend_df[year] years关键财务指标趋势分析表年份PEROE营收增长总资产(亿)经营现金流(亿)201928.532%16.5%1,532452202035.231%13.7%1,789498202140.129%11.4%2,012523202233.727%9.8%2,245501202330.525%8.5%2,4674875. 避免常见陷阱基本面分析的注意事项即使是最好的工具使用不当也会导致亏损。以下是五个必须警惕的陷阱财务造假识别# 检测异常财务指标 def detect_anomaly(code): data get_fundamentals( query( indicator.roe, indicator.inc_revenue, cash_flow.net_operate_cash_flow, income.net_profit ), statDate2023 ) # 经营现金流与净利润比率 cash_ratio data[net_operate_cash_flow][0] / data[net_profit][0] # 营收与应收账款比率 # 需要income表的详细数据... return cash_ratio 0.5 # 警示信号周期股误判原材料行业在高PE时可能被低估消费行业在低PE时可能已见顶会计政策影响不同折旧方法影响利润研发费用资本化处理差异非经常性损益# 获取扣非净利润 q query( income.net_profit, income.deducted_profit # 扣非净利润 ).filter( valuation.code target_code )行业差异考量科技行业合理PE通常高于制造业银行股更适合用PB而非PE评估6. 构建自动化监控系统最后我们将这些分析思路转化为自动化监控工具def value_monitor(): 价值股监控系统 # 1. 筛选候选股票 candidates graham_screen() # 2. 排除财务异常 candidates candidates[ candidates.apply(lambda x: not detect_anomaly(x[code]), axis1) ] # 3. 行业中性化处理 industry_pe get_industry_pe() # 获取各行业平均PE candidates pd.merge(candidates, industry_pe, onindustry) candidates[pe_diff] candidates[pe_ratio] - candidates[industry_pe] # 4. 生成监控信号 candidates[alert] candidates.apply( lambda x: 买入 if x[pe_diff] -0.3 else 观望, axis1 ) return candidates.sort_values(pe_diff) # 定时运行在聚宽策略中 def run_daily(context): if context.current_dt.weekday() 0: # 每周一运行 monitor_results value_monitor() logger.info(f本周价值监控结果:\n{monitor_results.head(10)})这套系统可以定期运行自动筛选并监控符合价值投资标准的股票。在实际应用中建议结合以下优化动态调参根据市场整体估值水平调整筛选阈值黑名单机制排除有重大负面消息的公司仓位控制根据估值水平决定配置比例再平衡策略设定定期调整规则记住没有任何量化模型可以永远有效。在使用get_fundamentals()进行投资决策时保持独立思考定期检视模型假设才是长期战胜市场的关键。