问题描述
/
解决方案
在ptrade量化交易平台中,**研究环境(Research)和回测环境(Backtest)**有着截然不同的定位和底层架构。理解它们的区别,就能明白为什么在研究环境中无法调用order等下单函数。
1. 回测与研究环境的核心区别
- 研究环境(Research):
- 定位:主要用于数据获取、数据分析、因子挖掘、模型训练和策略逻辑的初步验证。它类似于一个交互式的Jupyter Notebook环境。
- 运行机制:线性执行代码,没有时间轴的推进概念。你可以自由地调用历史行情(如
get_history、get_price)和财务数据(如get_fundamentals)进行静态分析。
- 回测环境(Backtest):
- 定位:用于验证交易策略在历史真实市场环境下的表现,评估策略的收益率、回撤等绩效指标。
- 运行机制:基于事件驱动框架。它拥有一个模拟的撮合引擎和时间轴,代码会按照设定的频率(日线或分钟线)在特定的时间点(如
initialize、before_trading_start、handle_data)被系统自动触发执行。
2. 为什么研究环境无法调用 order 下单函数?
根据ptrade API文档,order、order_target、order_value等交易相关函数,其使用场景明确标注为“仅在回测、交易模块可用”。原因如下:
- 缺乏撮合引擎:
order函数的作用是将委托单发送给撮合引擎。研究环境是一个纯粹的数据分析环境,底层并没有挂载模拟撮合引擎,因此无法处理订单的撮合、成交和滑点计算。 - 缺乏账户上下文(Context):在回测和交易中,所有的下单操作都会影响账户的资金和持仓。这些信息存储在
context.portfolio对象中。研究环境没有账户的概念,也没有context对象来记录可用资金(cash)和持仓(positions),因此无法进行买卖操作。 - 缺乏时间轴推进:下单操作需要明确的“当前时间”来确定委托价格和成交价格。回测环境通过
handle_data(context, data)按周期推进时间,而研究环境是静态的,没有“当前交易日/分钟”的动态概念。
3. API 使用场景总结
在编写ptrade代码时,请务必注意API文档中注明的使用场景:
- 仅回测/交易可用:
order系列下单函数、cancel_order、get_open_orders、get_position、set_universe、initialize、handle_data等。 - 研究、回测、交易均可用:数据获取类函数,如
get_price、get_history、get_fundamentals、get_stock_info、get_trading_day等。
开发建议:标准的量化开发流程是,先在研究环境中调用get_price等接口获取数据,完成策略逻辑的推演和指标计算;确认逻辑无误后,将核心逻辑迁移到回测环境的handle_data函数中,结合context和order函数进行动态的历史回测。