前言
书接上回,我们已经讲解了get_trading_day函数的基础语法与三类常用场景。本篇我们继续深入,通过一个完整的周度轮动调仓策略,演示该函数在实盘策略中的落地用法,并整理三个高频踩坑点,帮助大家规避常见开发错误。
一、进阶实战:周度轮动调仓完整策略
1.1 场景说明
需求:每周第一个交易日开盘时,等权重买入指定股票池(招商银行、中国平安),且整周仅执行一次调仓操作,避免重复下单。 这是典型的周度低频轮动策略,也是get_trading_day结合交易执行函数的经典落地场景。
1.2 完整示例代码
bash
# 导入必要的日期处理模块
from datetime import timedelta
def initialize(context):
# 1. 设定股票池(招商银行、中国平安)
g.stocks = ["600036.SS", "601318.SS"]
set_universe(g.stocks)
# 2. 全局变量:标记本周是否已下单,避免重复操作
g.weekly_order_done = False
# 3. 设定定时任务:每日9:30执行交易逻辑
run_daily(context, weekly_trade_logic, time="9:30")
def weekly_trade_logic(context):
# 若本周已完成调仓,直接跳过
if g.weekly_order_done:
return
# 4. 获取当前交易日
today = get_trading_day(0)
log.info(f"当前交易日: {str(today)}")
# 5. 判断是否为本周第一个交易日
# 计算本周一(自然日)日期
monday = today - timedelta(days=today.weekday())
# 计算当前交易日距离本周一的自然日天数
days_since_monday = (today - monday).days
# 本周前3个自然日内触发,兼容节假日导致的交易日延迟
if days_since_monday < 3:
log.info(f"{str(today)} 为本周第一个交易日,开始调仓")
# 6. 等权重买入股票池,每只标的目标仓位50%
for stock in g.stocks:
order_target_percent(stock, 0.5)
log.info(f"买入 {stock},目标仓位: 50%")
# 7. 标记本周已完成下单
g.weekly_order_done = True
else:
log.info(f"{str(today)} 不是本周第一个交易日,不执行调仓")
1.3 核心逻辑解析
- 交易日判断逻辑 :通过
today.weekday()获取当前为周几(0 = 周一,4 = 周五),结合timedelta倒推本周一自然日日期,再通过自然日天数差判断是否为周内首个交易日;设置「前 3 个自然日」的容错区间,兼容周一因节假日休市的特殊情况。 - 防重复下单机制 :通过全局变量
g.weekly_order_done做状态标记,调仓完成后置为True,本周后续交易日直接跳过,从逻辑上杜绝重复下单风险。 - 仓位管理 :使用
order_target_percent按目标比例下单,确保两只标的等权重配置,各占总仓位 50%。
1.4 回测运行效果
回测日志示例:
bash
INFO - 当前交易日: 2025-09-01
INFO - 2025-09-01 为本周第一个交易日,开始调仓
INFO - 买入 600036.SS,目标仓位: 50%
INFO - 买入 601318.SS,目标仓位: 50%
INFO - 正在进行回测统计数据汇总
INFO - 回测统计数据汇总完成
INFO - 回测结束,结束类型: 程序结束
二、高频避坑指南
2.1 参数必须为整数
day参数仅支持整数类型(如0、3、-2),不可传入日期字符串(如"2025-10-20")、浮点数或其他类型,否则会触发参数类型错误。
2.2 严格区分「交易日」与「自然日」
day=1不等于 "明天",而是 "下一个交易日"。例如周五调用时,day=1将返回下周一的日期,自动跳过周六周日,切勿与自然日偏移混淆,这是新手最易踩的核心误区。
2.3 初始化阶段避免联动数据查询
get_trading_day可在initialize初始化函数中直接调用,但如果需要搭配get_price等行情查询函数联动使用,必须将逻辑放在run_daily等运行阶段函数中,否则会触发环境报错。
三、风险提示
- 技术风险:函数基于平台内置交易日历计算,遇交易所临时休市、节假日调整可能存在数据更新时滞,实盘需辅以二次日期校验,避免参数误用导致交易时机偏差。
- 回实差异风险:回测基于历史固定交易日历,实盘休市安排可能因政策、公告变动,需做好异常兼容,防止日期判断偏差引发无效下单、漏单。
- 投资风险:本文仅为 PTrade API 技术用法讲解,不构成任何投资建议与收益承诺,证券市场存在固有风险,投资决策请自主判断、自担风险。
- 合规风险:使用量化交易接口需遵守证券法律法规及券商交易规则,严禁实施异常交易、内幕交易等违法违规行为。
结尾
get_trading_day函数虽然语法简单,但却是所有量化策略的「时间基石」------ 无论是历史数据回溯、未来交易计划排布,还是当前交易状态判断,都离不开它的支撑。
至此该函数的基础语法、实战场景与避坑要点已全部讲解完毕,核心记住一句话:day 为整数偏移量,正数查未来、负数查过去、0 查当前,自动跳过非交易日 。大家可以结合自身策略需求,在模拟盘环境中动手测试。