数据精度问题导致交易决策错误怎么解决?
/
问题描述
解决方案
在ptrade量化交易平台中,不同交易品种的价格精度(小数点位数)是不同的。如果在下单时(特别是限价单)传入了错误精度的价格,会导致柜台拒单,从而引发委托失败或交易决策错误。
1. ptrade各交易品种的价格精度要求
根据ptrade API文档,不同品种的价格精度规定如下:
- 股票:小数点后 2 位(如 10.01)
- 可转债、ETF、LOF、国债:小数点后 3 位(如 100.001)
- 股指期货:小数点后 1 位(如 3800.2)
- ETF期权:小数点后 4 位(如 0.0012)
2. 常见引发错误的场景
- 使用
order()函数并传入limit_price(限价单)时。 - 使用
order_market()函数并传入limit_price(市价委托保护限价,如科创板)时。 - 通过计算得出的价格(如均线价格、滑点计算后的价格)往往包含多位小数,直接下单会报错。
3. 解决方案与代码示例
在将价格传入下单函数前,务必使用 Python 的 round() 函数对价格进行截断处理。
示例:股票限价单精度处理
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 假设通过某种计算得出一个买入价格
calc_price = data[g.security]['close'] * 0.987654
# 股票价格需要保留2位小数
limit_price = round(calc_price, 2)
# 正确下单
order(g.security, 100, limit_price=limit_price)
log.info("以限价 %s 委托买入 %s" % (limit_price, g.security))
示例:ETF限价单精度处理
def initialize(context):
g.etf = '510050.SS'
set_universe(g.etf)
def handle_data(context, data):
calc_price = data[g.etf]['close'] * 0.99123
# ETF价格需要保留3位小数
limit_price = round(calc_price, 3)
order(g.etf, 1000, limit_price=limit_price)
4. 总结
在编写ptrade策略时,养成在下单前对价格进行 round(price, n) 处理的习惯,是避免因数据精度导致交易失败的关键。建议在策略初始化时,根据交易标的类型,定义好对应的精度变量,以便在全局统一处理。