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 查当前,自动跳过非交易日 。大家可以结合自身策略需求,在模拟盘环境中动手测试。

相关推荐
柒和远方1 小时前
LeetCode 139. 单词拆分 —— 从暴力回溯到 DP 完全背包
javascript·python·算法
半兽先生2 小时前
大模型实现金融文本分类
人工智能·python·金融
汤姆小白2 小时前
06-LoRA参数高效微调
人工智能·python·机器学习·transformer
铅笔侠_小龙虾2 小时前
Rust 学习(6)-所有权规则、移动语义、Clone 与 Copy
python·学习·rust
码云骑士2 小时前
65-AI-Agent基础原理-AutoGPT-四大架构全景解读
人工智能·python·架构
Ulyanov3 小时前
刚体动力学方程——牛顿-欧拉与陀螺效应的奥秘
开发语言·python·目标跟踪·雷达电子对抗·导引头
观察员3 小时前
用 Streamlit + 智谱 AI 打造虚拟伴侣聊天机器人
python
Cubar4 小时前
[一]开源ERP:odoo19二次开发问题-原库存模块问题
python·开源·odoo·开源erp
不能只会打代码4 小时前
Day 002 — Python 工程化 & FastAPI & 数据库速通
数据库·redis·python·docker·fastapi·测试