)
摘要本文详细拆解 PTrade 量化终端自带的「小市值策略」官方 Demo从核心投资逻辑出发逐模块解析策略初始化、盘前选股、盘中交易、仓位管理的代码实现梳理每个环节用到的 PTrade 原生 API并标注实盘运行的关键避坑点帮助量化新手快速读懂官方策略、掌握 PTrade 基础开发范式。一、策略核心逻辑小市值策略到底在做什么小市值策略的底层逻辑源于 A 股的市场特征流通市值偏小的股票通常股价弹性更强在行情启动阶段更容易出现较大涨幅。策略并非简单买入市值最小的股票而是通过「盘前筛坑 盘中动态调仓 涨停锁仓」三层规则在控制风险的前提下捕捉小盘股超额收益。1.1 盘前剔除风险股锁定候选股票池每天开盘前策略会完成一轮选股筛选相当于提前做好「备菜」工作限定选股范围仅从中小板综指数代码399101.XBHS的成分股中选股确保标的聚焦中小盘赛道剔除风险标的过滤掉成分股中的 ST 股、停牌股、退市股避免踩雷无法交易的标的缩小候选规模先按前一交易日收盘流通市值从小到大排序取前 100 只提升回测效率再经过风险过滤后最终保留流通市值最小的 10 只作为当日候选池。1.2 盘中动态调仓 涨停股锁仓开盘交易时段策略按周期执行调仓核心规则只有两条始终持有最小市值标的实时计算个股流通市值昨日流通股本 × 当日实时股价动态排序后始终持有流通市值最小的 5 只股票涨停股不强制卖出若持仓个股当日涨停即使它不再是市值最小的 5 只也暂时保留不卖避免卖出后无法买回、错过后续连板收益。二、逐模块代码拆解核心函数与 API 解析整个策略代码由 5 个核心函数构成分别对应「初始化 - 盘前准备 - 盘中触发 - 选股计算 - 交易执行」完整流程下面逐个拆解对应逻辑与 API 用法。2.1 initialize ()策略初始化设定全局规则initialize是每个 PTrade 策略的必备入口函数仅在策略启动时执行 1 次用于设置基准、股票池、全局参数等基础配置。def initialize(context): # 设置策略业绩基准为沪深300指数 set_benchmark(000300.XSHG) # 选股来源中小板综指数 g.index 399101.XBHS # 最终持仓股票数量 g.buy_stock_count 5 # 盘前筛选候选股数量 g.screen_stock_count 10 # 非实盘环境下开启回测模式 if not is_trade(): set_backtest()关键 API 与变量说明set_benchmark()设置策略回测 / 实盘的业绩比较基准用于衡量策略是否跑赢大盘gPTrade 全局变量对象全策略生命周期内均可读写用于存储常量、中间数据is_trade()判断当前运行环境是否为实盘配合set_backtest()开启回测专属配置。2.2 before_trading_start ()盘前执行筛选当日候选池该函数在每个交易日开盘前自动执行负责完成当日选股的前置准备生成候选股票池。def before_trading_start(context, data): # 记录上一交易日的持仓列表 g.pre_position_list list(get_positions().keys()) # 获取中小板综指数全部成分股 g.stock_list get_index_stocks(g.index) # 查询成分股的估值数据流通市值、流通股本 df get_fundamentals(g.stock_list, valuation, fields[float_value, a_floats]) stock_list_tmp df.index.tolist() # 过滤ST、停牌、退市类风险股票 stock_list_tmp filter_stock_by_status(stock_list_tmp, filter_type[ST, halt, delist]) # 保留筛选后的标的取流通市值最小的10只存入全局变量 df df[df.index.isin(stock_list_tmp)] g.df df.head(g.screen_stock_count)核心 API 解析get_positions()获取当前账户持仓信息.keys()提取持仓股票代码列表get_index_stocks()传入指数代码返回该指数的全部成分股代码列表get_fundamentals()查询股票基本面 / 估值数据此处获取流通市值float_value与流通股本a_floatsfilter_stock_by_status()PTrade 内置状态过滤函数一键剔除风险标的是策略的风控核心。2.3 handle_data ()盘中周期触发串联选股与交易handle_data是策略的周期执行入口按策略设定的周期日线 / 分钟线自动运行负责衔接选股逻辑与交易执行。def handle_data(context, data): # 计算当日最终买入股票列表 buy_stocks get_trade_stocks(context, data) # 记录当日选股结果方便回测排查问题 log.info(buy_stocks: %s % buy_stocks) # 执行调仓交易 trade(context, buy_stocks)该函数逻辑非常简洁相当于策略的「调度开关」先调用选股函数得到标的列表再调用交易函数完成买卖同时打印日志留存选股记录。2.4 get_trade_stocks ()核心选股逻辑保留涨停股这是整个策略的核心算法函数负责结合实时行情计算最终持股列表实现「小市值排序 涨停锁仓」规则。def get_trade_stocks(context, data): # 筛选昨日持仓中当日涨停的股票标记为强制保留 hold_up_limit_stock [stock for stock in g.pre_position_list if check_limit(stock)] df g.df # 候选池为空时仅保留涨停持仓 if df.empty: return hold_up_limit_stock # 计算实时流通市值 昨日流通股本 × 当日实时价格 df[curr_float_value] df.apply(lambda x: x[a_floats] * data[x.name].price, axis1) # 按实时流通市值从小到大排序 stocks df.sort_values(bycurr_float_value).index.tolist() # 计算需要补充的股票数量总持仓数 - 涨停保留数 need_count g.buy_stock_count - len(hold_up_limit_stock) # 最终持股 新选的小市值股 持仓涨停股 result stocks[:need_count] hold_up_limit_stock return result关键逻辑与 APIcheck_limit(stock)判断标的是否涨停返回布尔值是实现涨停锁仓的核心接口data[stock].price获取标的实时最新价格用于计算实时流通市值选股设计亮点优先保留涨停持仓剩余仓位用最小市值标的补齐兼顾弹性与连板收益。2.5 trade ()执行调仓卖旧买新均分仓位该函数负责落地交易动作按照选股结果完成持仓调整实现「不在列表的全卖、新入选的均分资金买入」。def trade(context, buy_stocks): # 第一步清仓不在买入列表中的持仓 for stock in context.portfolio.positions: if stock not in buy_stocks: order_target_value(stock, 0) log.info(sell: %s % stock) # 获取当前实际持仓标的列表 position_list [p.sid for p in context.portfolio.positions.values()] position_count len(position_list) # 第二步剩余可用资金平均分配买入新入选标的 if g.buy_stock_count position_count: # 计算每只股票分配的资金 per_value context.portfolio.cash / (g.buy_stock_count - position_count) for stock in buy_stocks: if stock not in context.portfolio.positions: order_target_value(stock, per_value)核心交易 API 与注意事项order_target_value(stock, value)目标市值下单函数将标的持仓调整至指定市值传入 0 即代表清仓该标的⚠️实盘重要提醒该函数在回测环境中持仓数据瞬时更新可直接使用但实盘环境下券商柜台数据存在延迟直接循环调用可能导致重复下单实盘运行必须增加委托状态校验、持仓刷新等待逻辑。三、策略适用人群与实盘避坑3.1 适合与不适合人群✅适合人群想研究中小盘股超额收益、接受日线级别调仓的交易者偏好规则明确、逻辑可解释的量化策略希望通过回测验证因子有效性的学习者刚接触 PTrade想通过官方 Demo 学习 API 用法的入门用户。❌不适合人群偏好大盘蓝筹、厌恶高波动无法接受每日调仓的交易者追求绝对收益、期待策略稳赚不赔的投资者任何量化策略都存在亏损风险。3.2 实盘运行避坑要点下单函数适配不要直接照搬回测的order_target_value循环调用实盘需增加下单间隔、持仓校验、撤单判断逻辑流动性风险极小市值股票可能存在流动性不足的问题下单容易滑点可适当提高候选股市值下限风控补充原生策略未设置止损、仓位上限实盘建议补充个股止损、总仓位控制规则控制回撤风险成分股变更指数成分股会定期调整盘前选股接口会自动适配无需手动维护。四、学习总结PTrade 官方提供的小市值 Demo是非常经典的量化策略入门模板它覆盖了「初始化 - 盘前选股 - 盘中计算 - 交易执行」的完整策略框架用到了选股、行情、交易、风控四类核心 API非常适合新手拆解学习。学习建议先在回测环境运行原生策略理解每个函数的执行时机与输出结果尝试修改参数如持仓数量、选股指数、过滤条件观察回测收益变化实盘前先修改下单逻辑补充风控与异常处理小仓位试运行验证。风险提示投资有风险入市需谨慎本文只做教学不做任何投资建议