问题描述
回测运行失败,错误码:2 错误信息:可用资源不足,请稍后在创建。
解决方案
在 ptrade 量化平台进行策略回测时,遇到 “错误码:2 错误信息:可用资源不足,请稍后在创建” 的报错,通常是因为服务器当前计算资源(CPU或内存)已被占满,或者您的策略本身消耗了过多的系统资源。以下是详细的原因分析与解决方案:
一、 错误原因分析
- 服务器处于高峰期:在交易日的特定时段(如盘中、刚收盘后的 15:00-16:00),大量用户同时提交回测任务,导致券商或平台的服务器资源池满载。
- 策略内存占用过大(OOM):您的策略代码在运行过程中一次性加载了过多的数据,导致分配给该回测任务的内存超限,被系统强制终止。
- 死循环或逻辑缺陷:代码中存在无限循环或不断累加的全局变量(如向
g.xxx列表中不断append数据而不清理),导致资源耗尽。
二、 解决方案与优化建议
1. 错峰提交回测任务
最直接的解决方法是稍后再试。建议避开交易日的高峰时段,选择在夜间或周末提交耗时较长、计算量大的回测任务。
2. 缩减回测范围
如果只是为了验证策略逻辑是否正确,不需要一次性跑完几年的全市场数据:
- 缩短回测时间:将回测时间从几年缩短为几个月或几个星期。
- 缩小股票池:在
set_universe()中仅放入几只代表性股票进行测试,而不是全市场(如get_Ashares())几千只股票。
3. 优化数据获取接口(核心)
不合理地使用 get_history 或 get_price 是导致资源不足的常见原因。
- 避免一次性获取超大数据:不要在
handle_data中每次都获取过去几千天的分钟级数据。 - 按需获取:只获取策略计算所需的最小数据量。例如,计算 5 日均线,只需
count=5,不要取count=100。
错误示例(极易导致资源不足):
def handle_data(context, data):
# 每次都获取全市场所有股票过去1000天的日线数据,内存瞬间爆炸
all_stocks = get_Ashares()
hist = get_history(1000, '1d', 'close', security_list=all_stocks)
正确示例(按需获取):
def handle_data(context, data):
# 仅获取当前股票池中股票过去5天的数据
hist = get_history(5, '1d', 'close', security_list=g.security)
4. 优化全局变量(g 对象)的使用
在 ptrade 中,g 对象会被持久化保存。如果向 g 中的字典或列表不断添加数据而不删除,内存会随着回测天数的增加而线性增长。
- 定期清理:在
after_trading_end或before_trading_start中清理过期不需要的缓存数据。 - 使用私有变量:如果某些变量不需要被框架持久化保存,可以在初始化时以
__开头命名(如g.__temp_data),这样框架在落地持久化信息时会跳过它,减轻 IO 和内存压力。
5. 避免高频调用耗时接口
- 财务数据接口
get_fundamentals建议在before_trading_start或通过run_daily定时调用,不要在分钟级或 tick 级的handle_data中频繁调用。
三、 总结
遇到“可用资源不足”时,首先尝试等待几分钟后重试或缩短回测区间。如果问题依然频繁出现,请务必审查代码中的 get_history 调用频率和数据量,以及全局变量 g 的内存管理。如果确认代码已极度优化但仍无法运行,建议联系所属券商的 ptrade 技术支持,确认是否可以提升账户的资源配额。