今天我们来解析一下ptrade的二八轮动策略(工具+代码)
发布时间:5小时前阅读:43
今天我们带小伙伴们来解析一下ptrade的二八轮动策略。
“二八轮动” 里的 “二” 和 “八”,其实是市场常见的风格划分:“二” 指大盘股(比如沪深 300 指数成分股,占市场 20% 左右市值),“八” 指中小盘股(比如中证 500 指数成分股,占市场 80% 左右市值)。策略的核心思路就是 “追强避弱”:哪个指数近期涨得好,就买对应的 ETF;如果两个指数都涨得不好,就躲进货币基金避险,同时规定 “最少持有 10 天”,避免频繁操作。
整体逻辑分三步,像 “比涨幅→定标的→稳持有”:
第一步:选 “轮动标的”—— 只盯 3 类资产
策略不选个股,只在 3 类基金里轮动,目标明确、风险可控:
l 大盘股代表:沪深 300 指数(代码 000300.SS)及对应的 ETF(510300.SS)—— 覆盖 A 股 300 只大盘蓝筹股,波动相对小;
l 中小盘股代表:中证 500 指数(代码 000905.SS)及对应的 ETF(510500.SS)—— 覆盖 A 股 500 只中小盘股,弹性比大盘股大;
l 避险代表:货币基金(代码 511880.SS,华宝添益)—— 几乎不跌,主要用来 “躲跌”,比如市场大跌时持有,保住本金。
第二步:比 “阶段涨幅”—— 选涨得好的
每天盘中,策略会计算 “沪深 300” 和 “中证 500” 两个指数的 “20 日涨幅”(最近 20 个交易日涨了多少):
l 先算涨幅:比如沪深 300 指数 20 天前收盘价 1000 点,现在 1050 点,20 日涨幅就是 5%;
l 再比高低:哪个指数的 20 日涨幅更大,就认为它 “当前更强”;
l 设门槛:如果最强指数的涨幅还没超过 0%(也就是没涨甚至跌了),说明市场整体弱势,就不买股票 ETF,改买货币基金。
第三步:定 “持有规则”—— 最少拿 10 天
策略有个 “铁规矩”:一旦买入某类资产(沪深 300ETF、中证 500ETF、货币基金),最少持有 10 个交易日,其间不管涨跌都不换仓 —— 这样做是为了避免 “追涨杀跌”:比如刚买完大盘股,第二天跌了就换中小盘股,反而容易两边亏;10 天的持有期能过滤短期波动,让策略更聚焦 “中期趋势”。
下面我们来解析一下demo代码,代码按 “初始化→盘前→盘中判断→交易” 的顺序运行,没有复杂的因子处理,核心是 “算涨幅、比强弱、定买卖”。
初始化函数(initialize):

这部分是策略的 “初始设置”,核心是 “定标的” 和 “分模式”:
l g.fund_list:明确轮动的 “6 个标的”,其实是 3 组(指数 + ETF)—— 指数用来算涨幅,ETF 用来实际买卖;货币基金的指数和 ETF 用了同一个代码(511880.SS),因为货币基金波动小,用 ETF 直接算也可以;
l is_trade():判断当前是实盘还是回测(API“实盘 / 回测模式判断” 接口),回测时用set_backtest()开 “无限制回测模式”(API “回测参数设置” 接口),还会在set_backtest()里设手续费(后面拆);
l g.open_date:记录 “首次买入日期”,初始设为 “40 天前”,是为了让策略第一次运行时就满足 “持有期≥10 天” 的条件,能正常换仓。
参数与回测设置(set_params/set_backtest)
1)策略参数(set_params):定涨幅和持有规则

这三个参数是策略的 “核心规矩”:g.N决定 “看多久的涨幅”,g.holding_days决定 “最少拿多久”,g.rise_threshold决定 “要不要进场”,改了这三个数,策略逻辑会完全变。
2)回测设置(set_backtest):设手续费和回测模式

set_commission:设置回测的手续费(API “回测手续费设置” 接口),佣金 0.015%、最低 5 元,和实盘的手续费规则一致(比如买 1 万元股票,佣金 1.5 元,但按最低 5 元收),让回测结果更真实。
3)盘前处理(before_trading_start)

l 逻辑:沪深 300 指数是 2005 年 4 月 8 日才发布的,之前没有数据,所以策略设 “20050501 前不交易”,避免用残缺数据算错涨幅;
l g.trade_flag:当天是否允许交易的 “总开关”,关了之后盘中不会有任何操作。
4)盘中处理(handle_data)
每天盘中会先算 “交易信号”,再按信号执行买卖,逻辑很清晰:

核心是两个函数:create_signal(算信号)和trade(执行交易),后面会重点拆这两个函数。
我们下面对核心函数进行拆解,
1)算交易信号(create_signal):比涨幅,定标的

关键 API:get_history(获取历史 K 线数据,API “历史行情获取” 接口)—— 这里拿 “num+1” 天的收盘价,是因为算 “N 日涨幅” 需要 “N 天前” 和 “现在” 两个价格(比如 20 日涨幅需要 21 天数据:第 1 天和第 21 天);
信号规则:
l 信号 = 1:沪深 300 指数涨幅最大且≥0%→买沪深 300ETF(fund_list [1]);
l 信号 = 2:中证 500 指数涨幅最大且≥0%→买中证 500ETF(fund_list [3]);
l 信号= 3:两个指数涨幅都<0%→买货币基金(fund_list [5]);
l 注意:代码里写 “signal=security_round_num”,security_round_num=3,但实际用的时候会对应到 fund_list 的第 5 个位置(索引 5),因为 “(3-1)*2+1=5”,后面交易函数会解释。
2)执行交易(trade):按信号买卖,确保持有≥10 天


关键 API:
l get_trading_day(-holding_days - 1):获取 “holding_days 天前” 的交易日(API “交易日查询” 接口),比如 holding_days=10,就是获取 11 天前的交易日,用来判断持有期是否够 10 天;
l order_target(stock, 0):清仓(API “目标持仓下单” 接口),不管当前有多少,都卖到 0;
l order_value(stock, target_value):按金额下单(API “金额下单” 接口),把所有现金买成目标标的,不用手动算股数,方便;
l 持有期判断:days = (g.open_date - pre_trading_date).days—— 如果 days>0,说明从 “g.open_date” 到现在还没超过 10 天,不交易;只有 days≤0,才允许换仓;
l 标的对应关系:信号 = 1→沪深 300ETF:(1-1)*2+1=1→fund_list[1] = 510300.SS;信号 = 2→中证 500ETF:(2-1)*2+1=3→fund_list[3] = 510500.SS;信号 = 3→货币基金:(3-1)*2+1=5→fund_list[5] = 511880.SS;代码里 “signal==0” 其实是冗余的,实际信号只会是 1、2、3,对应到货币基金的逻辑是 “signal=security_round_num=3”。
最后记住3个关键点:
l order_target/order_value的实盘风险:API 文档明确说了,这两个接口在回测里 “瞬时更新持仓”,但实盘要等券商柜台返回数据 —— 比如卖完旧标的后,没收到成交反馈就买新标的,可能导致 “没卖成却买了新的”,持仓翻倍;一定要先在仿真盘试 1-2 个月,观察延迟情况;
l “追强” 的 “踏空风险”:策略是 “追涨” 逻辑 —— 等指数涨了 20 天再买,可能买在 “阶段性高点”,比如沪深 300 涨了 20 天后开始回调,刚买就亏;反过来,如果指数突然大涨,策略要等 10 天持有期过了才能换仓,也会错过收益;
l 货币基金的 “收益局限”:货币基金虽然稳,但收益低(年化 2%-3%),如果市场长期弱势,策略一直持有货币基金,可能跑不赢通胀;而且一旦市场反弹,策略要等 10 天持有期过了才能换仓,会错过反弹初期的收益。
感兴趣的小伙伴快去试试吧!
(我司上市券商平台,可提供QMT/PTrade量化系统,免费使用,支持提供券商VIP交易服务配合使用;现在新开户交易佣金优惠,正在进行AI投ETF/选好股/选好基金等AI投顾工具体验活动;欢迎点击文章上方“问一问”,或文章下方微信+电话,直接联系沟通需求!)
温馨提示:投资有风险,选择需谨慎。
什么是行业轮动策略?如何应用行业轮动策略进行投资?
-
想换券商又怕麻烦?转户全流程拆解:不用先销户,资产转移比你想象的简单
2026-07-13 10:11
-
104天过会、估值420亿:宇树科技凭什么成为"人形机器人第一股"?
2026-07-13 10:11
-
本周打新日历:2026年A股规模最大IPO【长鑫科技】即将发行!一键速览重点
2026-07-13 10:11


问一问

+微信
分享该文章
