Ptrade(恒生量化交易平台)
Ptrade 是恒生电子开发的专业量化交易平台。策略运行在券商服务器(内网)上,低延迟执行。采用事件驱动的Python策略框架。
⚠️ 需要券商开通Ptrade权限。策略运行在券商云端——无法访问外网。不能pip安装,仅可使用内置第三方库。
支持的市场和业务类型
回测支持:
- 1. 普通股票交易(单位:股)
- 可转债交易(单位:张,T+0)
- 融资融券担保品买卖(单位:股)
- 期货投机交易(单位:手,T+0)
- LOF基金交易(单位:份)
- ETF基金交易(单位:份)
实盘交易支持:
- 1. 普通股票交易(单位:股)
- 可转债交易(T+0)
- 融资融券交易(单位:股)
- ETF申赎、套利(单位:份)
- 国债逆回购(单位:份)
- 期货投机交易(单位:手,T+0)
- ETF基金交易(单位:份)
默认支持Level2十档行情。部分券商提供免费L2逐笔数据。
价格精度规则
0.001 | 3 |
| LOF / ETF | 0.001 | 3 |
| 国债逆回购 | 0.005 | 3 |
| 股指期货 | 0.2 | 1 |
| 国债期货 | 0.005 | 3 |
| ETF期权 | 0.0001 | 4 |
⚠️ 使用 limit_price 下单时,价格必须符合正确的小数精度,否则订单将被拒绝。
股票代码格式
- - Shanghai: INLINECODE1
- Shenzhen: INLINECODE2
- Index:
000300.SS (CSI 300)
策略生命周期(事件驱动)
CODEBLOCK0
策略执行频率
| 模式 | 频率 | 执行时间 |
|---|
| 日线 | 每日一次 | 回测: 15:00, 实盘: 14:50(可配置) |
| 分钟 |
每分钟一次 | 每根分钟K线收盘时 |
|
Tick | 每3秒 | 9:30–14:59,通过
tick_data 或
run_interval |
时间参考
| 阶段 | 时间 | 可用函数 |
|---|
| 盘前 | 9:30之前 | INLINECODE6 , INLINECODE7 |
| 盘中 |
9:30–15:00 |
handle_data,
run_daily,
run_interval,
tick_data |
|
盘后 | 15:30 |
after_trading_end,
run_daily(time='15:10') |
初始化设置函数(仅在initialize中使用)
股票池与基准
CODEBLOCK1
手续费与滑点(仅回测)
CODEBLOCK2
定时任务
CODEBLOCK3
策略参数(可从UI配置)
CODEBLOCK4
数据函数
get_history — 获取最近N根K线
CODEBLOCK5
CODEBLOCK6
get_price — 按日期范围查询
CODEBLOCK7
CODEBLOCK8
⚠️ get_history and get_price cannot be called concurrently from different threads (e.g., when run_daily and handle_data execute simultaneously).
get_snapshot — 实时行情快照(仅实盘)
CODEBLOCK9
getgearprice — 盘口深度(仅实盘)
CODEBLOCK10
Level2数据(需L2权限)
CODEBLOCK11
股票与参考数据
基本信息
CODEBLOCK12
可转债数据
CODEBLOCK13
财务数据
CODEBLOCK14
CODEBLOCK15
⚠️ Rate limit: Max 100 calls per second, max 500 records per call. Add sleep for batch queries.
交易日历
CODEBLOCK16
交易函数
order — 按数量买卖
CODEBLOCK17
order_target — 调仓到目标数量
CODEBLOCK18
order_value — 按金额买入
CODEBLOCK19
ordertargetvalue — 调仓到目标金额
CODEBLOCK20
order_market — 市价单类型(仅实盘)
CODEBLOCK21
⚠️ Shanghai stocks require limit_price when using order_market. Convertible bonds are not supported.
ordertick — Tick触发下单(仅在tickdata中使用)
CODEBLOCK22
cancel_order — 撤单
CODEBLOCK23
新股申购
CODEBLOCK24
盘后固定价格委托
CODEBLOCK25
ETF操作
CODEBLOCK26
查询函数
持仓查询
CODEBLOCK27
委托查询
CODEBLOCK28
账户信息(通过context)
CODEBLOCK29
融资融券
交易操作
CODEBLOCK30
查询操作
CODEBLOCK31
期货交易
交易操作
CODEBLOCK32
查询与设置(回测)
CODEBLOCK33
内置技术指标
CODEBLOCK34
工具函数
CODEBLOCK35
通知函数
CODEBLOCK36
全局对象与上下文
CODEBLOCK37
持久化机制
Ptrade automatically serializes and saves the g object using pickle after before_trading_start, handle_data, and after_trading_end execute. On restart, initialize runs first, then persisted data is restored.
Custom persistence example:
CODEBLOCK38
⚠️ IO objects (open files, class instances) cannot be serialized. Use g.__private_var (double underscore prefix) for non-serializable objects.
策略示例
示例1:集合竞价追涨停
CODEBLOCK39
示例2:Tick级别均线策略
CODEBLOCK40
示例3:双均线策略
CODEBLOCK41
示例4:盘后逆回购 + 新股申购
CODEBLOCK42
订单状态码
待报 |
| 2 | 已报 |
| 5 | 部分成交 |
| 6 | 全部成交(回测) |
| 7 | 部分撤单 |
| 8 | 全部成交(实盘) |
| 9 | 废单 |
| a | 已撤 |
使用技巧
- - Strategies run on broker intranet servers — no external network access, cannot
pip install. - Use
g (global object) to persist variables across functions. Variables prefixed with __ will not be persisted. - Built-in third-party libraries include: pandas, numpy, talib, scipy, sklearn, etc.
- INLINECODE30 execution frequency depends on strategy period setting (tick/1m/5m/1d, etc.).
- Backtest and live trading use the same code —
set_commission/set_slippage only take effect in backtesting. - Always add exception handling (
try/except) in trading strategies to prevent unexpected termination. - INLINECODE34 and
get_price cannot be called concurrently from different threads. - When using limit orders, ensure price decimal precision matches the asset type.
- When multiple strategies run concurrently, callback events are independent of each other.
- Use
get_research_path() for file I/O (CSV, pickle files). - Documentation: https://ptradeapi.com
- QMT API Documentation: http://qmt.ptradeapi.com
进阶示例
Tick级量价策略 — 大单跟踪
CODEBLOCK43
ETF套利策略 — 溢价/折价监控与交易
CODEBLOCK44
可转债T+0日内交易策略
CODEBLOCK45
定时任务综合策略 — 盘前选股 + 盘中交易 + 盘后总结
CODEBLOCK46
多策略并行 — MACD + KDJ双信号确认
CODEBLOCK47
🤖 AI Agent 高阶使用指南
对于 AI Agent,在使用该量化/数据工具时应遵循以下高阶策略和最佳实践,以确保任务的高效完成:
1. 数据校验与错误处理
在获取数据或执行操作后,AI 应当主动检查返回的结果格式是否符合预期,以及是否存在缺失值(NaN)或空数据。
- * 示例策略:在通过 API 获取数据框(DataFrame)后,使用
if df.empty: 进行校验;捕获 Exception 以防网络或接口错误导致进程崩溃。
2. 多步组合分析
AI 经常需要进行宏观经济分析或跨市场对比。应善于将当前接口与其他数据源或工具组合使用。
- * 示例策略:先获取板块或指数的宏观数据,再筛选成分股,最后对具体标的进行深入的财务或技术面分析,形成完整的决策链条。
3. 构建动态监控与日志
对于交易和策略类任务,AI 可以定期拉取数据并建立监控机制。
- * 示例策略:使用循环或定时任务检查特定标的的异动(如涨跌停、放量),并在发现满足条件的信号时输出结构化日志或触发预警。
社区与支持
由 大佬量化 维护 — 量化交易教学与策略研发团队。
微信客服: bossquant1 · Bilibili · 搜索 大佬量化 — 微信公众号 / Bilibili / 抖音
Ptrade(恒生量化交易平台)
Ptrade 是恒生电子开发的专业量化交易平台。策略运行在券商服务器(内网)上,低延迟执行。采用事件驱动的Python策略框架。
⚠️ 需要券商开通Ptrade权限。策略运行在券商云端——无法访问外网。不能pip安装,仅可使用内置第三方库。
支持的市场和业务类型
回测支持:
- 1. 普通股票交易(单位:股)
- 可转债交易(单位:张,T+0)
- 融资融券担保品买卖(单位:股)
- 期货投机交易(单位:手,T+0)
- LOF基金交易(单位:份)
- ETF基金交易(单位:份)
实盘交易支持:
- 1. 普通股票交易(单位:股)
- 可转债交易(T+0)
- 融资融券交易(单位:股)
- ETF申赎、套利(单位:份)
- 国债逆回购(单位:份)
- 期货投机交易(单位:手,T+0)
- ETF基金交易(单位:份)
默认支持Level2十档行情。部分券商提供免费L2逐笔数据。
价格精度规则
0.001 | 3 |
| LOF / ETF | 0.001 | 3 |
| 国债逆回购 | 0.005 | 3 |
| 股指期货 | 0.2 | 1 |
| 国债期货 | 0.005 | 3 |
| ETF期权 | 0.0001 | 4 |
⚠️ 使用 limit_price 下单时,价格必须符合正确的小数精度,否则订单将被拒绝。
股票代码格式
- - 上海: 600570.SS
- 深圳: 000001.SZ
- 指数: 000300.SS (沪深300)
策略生命周期(事件驱动)
python
def initialize(context):
必需 — 启动时调用一次。用于设置股票池、基准和定时任务。
g.security = 600570.SS
set_universe(g.security)
def beforetradingstart(context, data):
可选 — 开盘前调用。
回测模式:每个交易日8:30执行。
实盘模式:首次启动立即执行,之后每天9:10执行(默认,券商可配置)。
log.info(盘前准备)
def handle_data(context, data):
必需 — 每根K线触发。
日线模式:每天14:50执行一次(默认)。
分钟模式:每分钟K线收盘时执行。
data[sid]提供:open, high, low, close, price, volume, money。
current_price = data[g.security][close]
cash = context.portfolio.cash
def aftertradingend(context, data):
可选 — 收盘后15:30调用。
log.info(交易日结束)
def tick_data(context, data):
可选 — 盘中每3秒触发一次(9:30-14:59,仅实盘)。
必须使用order_tick()在此函数中下单。
data格式:{股票代码: {order: DataFrame/None, tick: DataFrame, transcation: DataFrame/None}}
for stock, d in data.items():
tick = d[tick]
price = tick[last_px] # 最新价
bid1 = tick[bid_grp][1] # 买一 [价格, 数量, 笔数]
ask1 = tick[offer_grp][1] # 卖一 [价格, 数量, 笔数]
log.info(f{stock}: {price}, 涨停价={tick[uppx]}, 跌停价={tick[downpx]})
# Level2字段(需L2权限,否则为None):
order_data = d[order] # 逐笔委托
trans_data = d[transcation] # 逐笔成交
def onorderresponse(context, order_list):
可选 — 订单状态变化时触发(比get_orders更快)。
orderlist是字典列表,包含:entrustno, stock_code, amount, price,
businessamount, status, orderid, entrusttype, entrustprop, errorinfo, ordertime。
for o in order_list:
log.info(f订单 {o[stockcode]}: 状态={o[status]}, 成交={o[businessamount]}/{o[amount]})
def ontraderesponse(context, trade_list):
可选 — 成交时触发(比get_trades更快)。
tradelist是字典列表,包含:entrustno, stockcode, businessamount,
businessprice, businessbalance, businessid, status, orderid, entrustbs, businesstime。
注意:status=9表示废单。
for t in trade_list:
direction = 买入 if t[entrust_bs] == 1 else 卖出
log.info(f{direction} {t[stockcode]}: {t[businessamount]}@{t[business_price]})
策略执行频率
| 模式 | 频率 | 执行时间 |
|---|
| 日线 | 每日一次 | 回测: 15:00, 实盘: 14:50(可配置) |
| 分钟 |
每分钟一次 | 每根分钟K线收盘时 |
|
Tick | 每3秒 | 9:30–14:59,通过 tick
data 或 runinterval |
时间参考
| 阶段 | 时间 | 可用函数 |
|---|
| 盘前 | 9:30之前 | beforetradingstart, rundaily(time=09:15) |
| 盘中 |
9:30–15:00 | handledata, run
daily, runinterval, tick_data |
|
盘后 | 15:30 | after
tradingend, run_daily(time=15:10) |
初始化设置函数(仅在initialize中使用)
股票池与基准
python
def initialize(context):
set_universe([600570.SS, 000001.SZ]) # 必需:设置股票池
set_benchmark(000300.SS) # 回测基准指数
手续费与滑点(仅回测)
python
def initialize(context):
# 设置手续费:买入0.03%,卖出0.13%(含印花税),按成交金额计算,最低5元
setcommission(PerTrade(buycost=0.0003, sellcost=0.0013, unit=perValue, mincost=5))
set_slippage(FixedSlippage(0.02)) # 固定滑点0.02元
setvolumeratio(0.025) # 日成交量最大成交比例
setlimitmode(0) # 0=按成交量比例限制,1=按固定数量限制
定时任务
python
def initialize(context):
# run_daily:每天指定时间执行函数
rundaily(context, mymorning_task, time=09:31)
rundaily(context, myafternoon_task, time=14:50)
# run_interval:每N秒执行一次函数(仅实盘,最小3秒)
runinterval(context, mytick_handler, seconds=10)
策略参数(可从UI配置)
python
def initialize(context):
# 设置可从Ptrade UI动态修改的参数,无需修改代码
set_parameters(
context,
ma_fast=5, # 快线均线周期
ma_slow=20, # 慢线均线周期
position_ratio=0.95 # 仓位比例
)
数据函数
get_history — 获取最近N根K线
python
gethistory(count, frequency=1d, field=close, securitylist=None, fq=None, include=False, fill=nan, is_dict=False)
python
获取最近20个交易日的OHLCV数据
df = get_history(20, 1d, [open, high, low, close, volume], 600570.SS, fq=pre)
K线周期:1m, 5m, 15m, 30m, 60m, 120m, 1d, 1w/周线, mo/月线, 1q/季线, 1y/年线
fq复权:None(不复权),pre