PTrade 量化入门必学:get\_trading\_day 交易日函数全解与实战(下)

前言

书接上回,我们已经讲解了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 核心逻辑解析

  1. 交易日判断逻辑 :通过today.weekday()获取当前为周几(0 = 周一,4 = 周五),结合timedelta倒推本周一自然日日期,再通过自然日天数差判断是否为周内首个交易日;设置「前 3 个自然日」的容错区间,兼容周一因节假日休市的特殊情况。
  2. 防重复下单机制 :通过全局变量g.weekly_order_done做状态标记,调仓完成后置为True,本周后续交易日直接跳过,从逻辑上杜绝重复下单风险。
  3. 仓位管理 :使用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参数仅支持整数类型(如03-2),不可传入日期字符串(如"2025-10-20")、浮点数或其他类型,否则会触发参数类型错误。

2.2 严格区分「交易日」与「自然日」

day=1不等于 "明天",而是 "下一个交易日"。例如周五调用时,day=1将返回下周一的日期,自动跳过周六周日,切勿与自然日偏移混淆,这是新手最易踩的核心误区。

2.3 初始化阶段避免联动数据查询

get_trading_day可在initialize初始化函数中直接调用,但如果需要搭配get_price等行情查询函数联动使用,必须将逻辑放在run_daily等运行阶段函数中,否则会触发环境报错。

三、风险提示

  1. 技术风险:函数基于平台内置交易日历计算,遇交易所临时休市、节假日调整可能存在数据更新时滞,实盘需辅以二次日期校验,避免参数误用导致交易时机偏差。
  2. 回实差异风险:回测基于历史固定交易日历,实盘休市安排可能因政策、公告变动,需做好异常兼容,防止日期判断偏差引发无效下单、漏单。
  3. 投资风险:本文仅为 PTrade API 技术用法讲解,不构成任何投资建议与收益承诺,证券市场存在固有风险,投资决策请自主判断、自担风险。
  4. 合规风险:使用量化交易接口需遵守证券法律法规及券商交易规则,严禁实施异常交易、内幕交易等违法违规行为。

结尾

get_trading_day函数虽然语法简单,但却是所有量化策略的「时间基石」------ 无论是历史数据回溯、未来交易计划排布,还是当前交易状态判断,都离不开它的支撑。

至此该函数的基础语法、实战场景与避坑要点已全部讲解完毕,核心记住一句话:day 为整数偏移量,正数查未来、负数查过去、0 查当前,自动跳过非交易日 。大家可以结合自身策略需求,在模拟盘环境中动手测试。

相关推荐
cui_ruicheng2 分钟前
Python数据分析(十三):Seaborn 统计可视化
开发语言·python·信息可视化·数据分析
如此这般英俊7 分钟前
手搓Claude Code-第十章 system_prompt
数据结构·人工智能·python·语言模型·自然语言处理·prompt
高洁0126 分钟前
VLA:驱动具身智能迈向通用的关键引擎
人工智能·python·深度学习·transformer·知识图谱
糖炒栗子032637 分钟前
RF-DETR + DeepSpeed 双节点集群训练环境搭建操作记录
python
今天AI了吗1 小时前
【AI智能体】Hermes Agent 从部署到项目实战操作详解
java·人工智能·python·milvus
心运软件1 小时前
基于机器学习的智能邮件分类系统:从数据采集到模型部署全流程实战
人工智能·python·算法·随机森林·机器学习·分类·scikit-learn
ZHOU_WUYI1 小时前
5. fastwam 模型 video expert pre dit过程
pytorch·python·世界动作模型
过期的秋刀鱼!2 小时前
机器学习开发的迭代循环
人工智能·python·深度学习·神经网络·机器学习
小白学大数据2 小时前
基于Python的抖音网页版视频点赞数增长趋势追踪系统设计与实现
开发语言·爬虫·python·搜索引擎·音视频
circuitsosk3 小时前
平台整体能力与功能特性设计:分群、联运、ABTest与运营位系统
python·机器学习·搜索引擎·ab测试·vllm·rag检索