3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)平台上进行回测时,如果发现 context.portfolio.total_value(账户总权益)始终保持初始资金不变,通常是因为策略在回测期间没有产生任何实际的成交。总权益等于可用资金加上持仓价值,如果没有买入任何标的,总权益自然不会随市场波动而改变。
以下是导致该问题的常见原因及排查方法:
这是最常见的原因。您的策略代码中可能包含了某些买入条件(例如:均线金叉、MACD突破等),但在您设定的回测时间段内,这些条件从未被满足。
log.info("准备下单"),查看日志中是否有该输出。如果没有,说明逻辑判断条件过严或有误。即使代码执行到了 order 系列函数,订单也可能因为各种原因未能成交:
context.portfolio.available_cash。after_trading_end 或 handle_data 中打印订单状态:orders = get_orders()
for order_id, order in orders.items():
log.info("订单状态: %s, 未成交原因: %s" % (order.status, order.filled))
如果您硬编码了股票代码(如 g.security = '000001'),但忘记加后缀(正确的应为 '000001.XSHE'),系统会找不到该标的,导致下单失败(通常日志会有 Warning 提示)。
如果您只在 initialize 函数中打印了 context.portfolio.total_value,那么它只会输出一次初始资金。initialize 在整个回测中只运行一次。
handle_data 或 run_daily 调用的定时函数中打印总权益:def handle_data(context, data):
log.info("当前总权益: %f" % context.portfolio.total_value)
虽然这通常不会导致总权益完全不变,但可能会导致买入数量计算异常,进而影响成交。建议在 initialize 中始终开启真实价格模式:
set_option('use_real_price', True)
总结建议:请重点检查回测日志(Log)中的 Warning 信息,聚宽系统通常会在下单失败(如资金不足、停牌、涨跌停)时输出黄色的警告日志。通过分析日志,您可以快速定位是逻辑未触发还是订单被拒。