本文为 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 策略开发中最基础的核心函数之一,核心价值可以归纳为三点:
- 职责解耦:盘前准备与盘中交易拆分,代码结构更清晰,维护成本更低
- 固定频率:每日仅执行一次,适合处理单日无需重复计算的参数与计划
- 状态自检:作为每日策略的健康检查入口,提前发现账户、持仓异常
下篇将继续讲解 before_trading_start 的高阶用法,包括动态标的池更新、风控参数批量计算、盘前数据预加载等进阶场景。
风险提示:本文仅为策略技术原理讲解,不构成任何投资建议。量化交易存在风险,回测结果不代表未来收益。