3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资中,基本面选股是构建中长期超额收益策略的重要手段。财务成长能力指标能够直接反映公司的业务扩张速度和盈利盈利质量。在 PTrade 平台中,我们可以通过调用 get_fundamentals 接口查询成长能力数据表(growth_ability),从而精准筛选出符合条件的高成长股票。
get_fundamentals在 PTrade 中,获取财务数据统一使用 get_fundamentals 接口。要获取成长能力指标,需要将 table 参数指定为 'growth_ability'。
growth_ability 表)| 字段名称 | 含义说明 | 数据类型 |
|---|---|---|
oper_profit_grow_rate |
营业利润同比增长(%) | float |
net_profit_grow_rate |
净利润同比增长(%) | float |
operating_revenue_grow_rate |
营业收入同比增长(%) | float |
np_parent_company_yoy |
归属母公司股东的净利润同比增长(%) | float |
before_trading_start 或通过 run_daily 触发的定时任务中获取全市场(如全 A 股)代码。get_fundamentals(security_list, 'growth_ability', fields=['oper_profit_grow_rate', 'net_profit_grow_rate'])。oper_profit_grow_rate > 20% 且 net_profit_grow_rate > 20% 的标的;filter_stock_by_status 剔除 ST、停牌或退市股票。set_universe),并在盘中(handle_data)进行等权重建仓或调仓。import pandas as pd
import time
def initialize(context):
# 初始化全局变量
g.max_hold_count = 10 # 最大持仓股票数
g.rebalance_flag = False # 调仓标识
# 设置调仓周期:每月第一个交易日9:31执行筛选与调仓逻辑
run_daily(context, check_rebalance, time='09:31')
def check_rebalance(context):
# 简易示范:每月月初调仓(根据月度第1个交易日判断)
current_dt = context.blotter.current_dt
if current_dt.day == 1 or not g.rebalance_flag:
g.rebalance_flag = True
filter_growth_stocks(context)
def filter_growth_stocks(context):
# 1. 获取全A股代码
all_stocks = get_Ashares()
# 2. 过滤 ST、停牌、退市股票
valid_stocks = filter_stock_by_status(all_stocks, filter_type=["ST", "HALT", "DELISTING"])
# 3. 获取成长能力财务数据
fields = ['oper_profit_grow_rate', 'net_profit_grow_rate']
# 按日期查询模式,默认取离当前日期最近的财务数据
df_fundamentals = get_fundamentals(
security=valid_stocks,
table='growth_ability',
fields=fields
)
if df_fundamentals is None or df_fundamentals.empty:
log.warning("获取财务数据失败或数据为空")
return
# 4. 数据清洗与筛选
# 删除存在空值的行
df_clean = df_fundamentals.dropna(subset=fields)
# 条件:营业利润同比增长 > 20% 且 净利润同比增长 > 20%
condition = (df_clean['oper_profit_grow_rate'] > 20.0) & (df_clean['net_profit_grow_rate'] > 20.0)
target_df = df_clean[condition]
# 按营业利润增长率降序排序,取前 N 只
target_df = target_df.sort_values(by='oper_profit_grow_rate', ascending=False)
selected_stocks = target_df.index.tolist()[:g.max_hold_count]
log.info("筛选出的高成长股票列表: %s" % selected_stocks)
# 5. 更新股票池并执行调仓
if selected_stocks:
set_universe(selected_stocks)
rebalance_portfolio(context, selected_stocks)
def rebalance_portfolio(context, target_stocks):
# 卖出不在目标列表中的持仓股票
current_positions = context.portfolio.positions
for stock in list(current_positions.keys()):
if stock not in target_stocks:
order_target_value(stock, 0)
log.info("卖出非目标持仓股票: %s" % stock)
# 等权重买入目标股票
if target_stocks:
total_value = context.portfolio.portfolio_value
target_value_per_stock = total_value / len(target_stocks)
for stock in target_stocks:
order_target_value(stock, target_value_per_stock)
log.info("调仓买入股票: %s, 目标市值: %s" % (stock, target_value_per_stock))
def handle_data(context, data):
pass
get_fundamentals 属于在线接口,单次查询上限 50,000 条,每秒不超过 100 次。在全市场选股时,如遇到频次限制可分批查询并加 time.sleep(1) 保护。publ_date(财报实际公告日期)作为数据生效时间点,可有效避免未来函数。merge_type 建议不传或留空以获取首次发布数据,贴近实际交易环境。valuation 表中的 pe_ttm、pb)及技术面指标(如均线趋势)进行综合筛选。