PTrade 策略入门:before_trading_start 函数详解(上)—— 盘前准备逻辑全指南

本文为 PTrade 量化策略开发基础教程,系统讲解 before_trading_start 盘前函数的核心作用、语法规则、运行机制,并附带两套可直接运行的实战代码,帮助新手快速掌握盘前逻辑的写法。


一、函数核心定位:策略的「晨间准备时间」

在量化策略运行中,每日开盘前的准备工作是交易顺利执行的前提。PTrade 内置的 before_trading_start 函数,正是专门承担「盘前准备」职责的核心事件函数。

核心作用

该函数每个交易日开盘前自动执行且仅执行一次,用于处理所有需要在开盘前完成的工作,典型场景包括:

  • 查询账户资金、持仓状态,做每日盘前自检
  • 设定当日交易的目标价格、买卖数量、标的范围
  • 更新当日风控阈值、策略参数
  • 输出盘前日志,确认策略运行状态

简单来说,它就像策略每日的「开机启动项」,把固定的准备工作统一管理,让盘中交易逻辑更简洁清晰。

二、基础语法与运行机制

2.1 函数定义与参数

函数为固定格式,包含两个必填参数:

bash 复制代码
def before_trading_start(context, data):
    # 此处编写盘前执行的逻辑
    pass

参数说明:

  • context :策略全局上下文对象,存储账户资产、持仓信息、全局变量(g.xxx)等核心数据,是策略的「全局数据账本」。
  • data:行情数据对象,盘前阶段一般不用于读取实时行情,按格式保留参数即可。

2.2 执行时间规则

在不同运行环境下,函数的执行时间略有差异:

运行场景 执行时间
回测环境 每个回测交易日的 08:30 自动执行 1 次
实盘 / 模拟盘 策略启动当日立即执行 1 次;次日起默认每日 09:10 执行 1 次

⚠️ 关键避坑提醒 若在 09:10 前启动实盘 / 模拟盘策略,函数执行时实时行情尚未完成更新,此时调用行情接口会得到错误数据。 解决方案:可在函数内添加延时等待至 09:10,或将实时行情读取逻辑迁移至 run_daily 定时任务中。

三、入门实战:基础盘前检查 + 固定目标价

下面通过一个完整的极简策略,演示函数的标准用法。策略逻辑:每日盘前打印账户信息,设定固定买入目标价,盘中价格达标自动买入。

完整可运行代码

bash 复制代码
# =====================
# 第一步:策略全局初始化
# =====================
def initialize(context):
    # 设置关注标的:中国银行
    g.stock = "601988.SS"
    # 订阅标的行情
    set_universe(g.stock)


# =====================
# 第二步:每日盘前准备
# =====================
def before_trading_start(context, data):
    # 1. 获取并打印当前交易日
    today = get_trading_day()
    print(f"==== 今天是 {str(today)},准备开盘 ====")
    
    # 2. 查询账户可用资金
    cash = context.portfolio.cash
    print(f"账户可用资金:{cash} 元")
    
    # 3. 设定当日买入目标价
    g.today_buy_price = 3.5
    print(f"今日交易计划:中国银行低于 {g.today_buy_price} 元时买入")
    print("==================================\n")


# =====================
# 第三步:盘中交易逻辑
# =====================
def handle_data(context, data):
    # 获取标的当前收盘价
    current_price = data[g.stock].close
    
    # 价格低于盘前设定的目标价时,执行买入
    if current_price < g.today_buy_price:
        print(f"当前价格 {current_price} 元,低于计划价,买入 100 股")
        order(g.stock, 100)

回测日志效果

策略回测运行后,每日开盘前会自动输出准备日志,效果如下:

bash 复制代码
==== 今天是 2025-09-01,准备开盘 ====
账户可用资金:100000.0 元
今日交易计划:中国银行低于 3.5 元时买入
==================================

==== 今天是 2025-09-02,准备开盘 ====
账户可用资金:100000.0 元
今日交易计划:中国银行低于 3.5 元时买入
==================================

==== 今天是 2025-09-03,准备开盘 ====
账户可用资金:100000.0 元
今日交易计划:中国银行低于 3.5 元时买入
==================================

四、进阶场景:动态买卖计划 + 持仓自检

进阶用法:根据每日持仓状态,动态切换交易计划 ------ 空仓时设置买入价,持仓时设置卖出价,实现简单的区间交易逻辑。

完整可运行代码

bash 复制代码
def initialize(context):
    # 设置关注标的:农业银行
    g.stock = "601288.SS"
    set_universe(g.stock)
    # 全局变量:存储当日交易计划
    g.today_plan = ""


def before_trading_start(context, data):
    # 1. 交易日标识
    today = str(get_trading_day())
    print(f"\n==== {today} 交易前准备 ====")
    
    # 2. 查询账户可用资金
    cash = context.portfolio.cash
    print(f"账户可用资金:{cash:.2f} 元")
    
    # 3. 查询当前持仓数量
    position = get_position(g.stock).amount
    if position > 0:
        print(f"当前持有 {position} 股农业银行")
    else:
        print("当前未持有农业银行")
    
    # 4. 根据持仓状态动态设定当日计划
    if position > 0:
        g.today_plan = "卖出价:3.2元"
    else:
        g.today_plan = "买入价:3.0元"
    print(f"今日交易计划:{g.today_plan}")
    print("==========================")


def handle_data(context, data):
    current_price = data[g.stock].close
    position = get_position(g.stock).amount
    
    # 空仓状态:价格达标买入
    if "买入价" in g.today_plan and position == 0:
        if current_price <= 3.0:
            order(g.stock, 100)
            print(f"价格 {current_price} 元,达到买入价,买入 100 股")
    
    # 持仓状态:价格达标卖出
    elif "卖出价" in g.today_plan and position > 0:
        if current_price >= 3.2:
            order(g.stock, -100)
            print(f"价格 {current_price} 元,达到卖出价,卖出 100 股")

适用说明

该写法兼容日线、分钟线等所有回测周期,同时支持实盘 / 模拟盘运行。将计划生成逻辑统一收敛到盘前函数,避免盘中重复计算,也便于每日日志复盘。

五、要点总结

before_trading_start 是 PTrade 策略开发中最基础的核心函数之一,核心价值可以归纳为三点:

  1. 职责解耦:盘前准备与盘中交易拆分,代码结构更清晰,维护成本更低
  2. 固定频率:每日仅执行一次,适合处理单日无需重复计算的参数与计划
  3. 状态自检:作为每日策略的健康检查入口,提前发现账户、持仓异常

下篇将继续讲解 before_trading_start 的高阶用法,包括动态标的池更新、风控参数批量计算、盘前数据预加载等进阶场景。

风险提示:本文仅为策略技术原理讲解,不构成任何投资建议。量化交易存在风险,回测结果不代表未来收益。

相关推荐
大海变好AI17 小时前
AIGC分层推理落地能否串联多工具完成自动化闭环
人工智能·python·自动化·aigc
二宝哥17 小时前
14.Python模块与包完全指南:从定义到实战
python
三声三视18 小时前
交互式用够了?用 Agent SDK 把 Claude 塞进 Python Web 服务
人工智能·python·ai·aigc·ai编程
zhanghaha131418 小时前
Python语言基础:4_数据类型转换
java·前端·python
larance18 小时前
机器学习特征预处理之标准化/归一化
开发语言·python·机器学习
tokenova18 小时前
Python 多模型统一调用封装类,一套代码兼容 GPT/Claude/Grok
python
Patrick在香港19 小时前
Python实战:用数据分析拆解一场AI大会——WAIC 2026参展企业画像、议题演变与城市格局
人工智能·python·数据挖掘·数据分析·ai编程
weixin_4713830320 小时前
01Python基础
python
小猴子爱上树20 小时前
TikTok Shop视频自动翻译工具实战教程
人工智能·python·音视频·机器翻译