问题描述
解决方案
根据PTrade API文档及A股市场规则,关于股票、可转债和ETF的下单价格精度(小数点位数)及最小交易数量的规定如下:
1. 下单价格精度(小数点保留位数)
在PTrade中,使用限价单委托(如 order 函数的 limit_price 参数)时,必须严格遵守以下价格精度,否则会导致委托失败:
| 交易品种 | 价格保留位数 | 最小价差 | 示例价格 |
|---|---|---|---|
| 股票 (Stocks) | 2位 | 0.01 | 15.88 |
| 可转债 (Convertible Bonds) | 3位 | 0.001 | 118.555 |
| ETF基金 | 3位 | 0.001 | 2.456 |
| LOF基金 | 3位 | 0.001 | 1.002 |
特别注意:
用户在使用 order() 或 order_market()(保护限价)时,务必对传入的价格参数进行四舍五入处理(例如使用 Python 的 round(price, 2) 或 round(price, 3)),以符合上述精度要求。
2. 最小交易数量(单位)
在回测和实盘交易中,最小下单单位(通常称为“一手”)如下:
| 交易品种 | 最小买入单位 | 说明 |
|---|---|---|
| 股票 (Stocks) | 100 股 | 买入必须是100的整数倍。卖出时,若余额不足100股(零股),需一次性卖出。 |
| ETF基金 | 100 股 | 买入必须是100的整数倍。 |
| 可转债 (Convertible Bonds) | 10 张 | 1手 = 10张。买入必须是10的整数倍。 |
PTrade回测环境的特殊校验:
- 回测模式: 系统会对
amount进行严格校验。股票/ETF/LOF 最小下单数量为 100,可转债为 10。如果下单数量低于此数值,回测引擎可能会拒绝该订单或报错。 - 交易模式: 接口本身不做强制校验,直接报送至柜台,但如果不符合交易所规则(如买入非100的倍数),柜台会拒单。
代码处理示例
在策略代码中,建议使用 round 函数处理价格,使用整除逻辑处理数量:
def handle_data(context, data):
# 示例:股票下单
stock_code = '600570.SS'
price = data[stock_code]['close']
# 股票价格保留2位小数
limit_p = round(price * 1.01, 2)
# 股票数量取整100的倍数
amount = int(10000 / limit_p / 100) * 100
order(stock_code, amount, limit_price=limit_p)
# 示例:ETF/可转债下单
etf_code = '510300.SS'
etf_price = data[etf_code]['close']
# ETF/可转债价格保留3位小数
etf_limit_p = round(etf_price * 1.01, 3)
order(etf_code, 100, limit_price=etf_limit_p)
Q&A
Q1: 如果我在PTrade中对股票下单时,价格传入了3位小数(如10.555)会发生什么?
A1: 委托会失败。PTrade文档明确指出,务必对入参价格的小数点位数进行处理,否则会导致委托失败。股票必须保留2位小数。
Q2: 卖出股票时,如果持仓只剩50股,我可以使用 order 函数卖出吗?
A2: 可以。虽然买入必须是100股的整数倍,但卖出时允许卖出零股(不足100股的部分)。在回测中,如果持仓不足100股,通常建议使用 order_target(security, 0) 来清仓。
Q3: 可转债的最小价差是0.001吗?
A3: 是的。根据PTrade文档,可转债、ETF、LOF的最小价差均为0.001元,因此价格需要保留3位小数。