问题描述
我想把模拟盘里的资金调整一下,在不关闭模拟策略的情况下怎么改模拟资金呢?谢谢
解决方案
在 JoinQuant (聚宽) 平台上,如果您希望在不关闭当前模拟盘的情况下调整模拟资金,可以通过结合使用 after_code_changed 回调函数和 inout_cash 资金调整函数来实现。
核心原理
after_code_changed(context):模拟盘在每天的交易时间结束后会休眠,第二天开盘时会恢复。如果在恢复时发现策略代码发生了修改,系统会在恢复时自动执行一次这个函数。这非常适合用来在运行中途修改模拟盘状态。inout_cash(cash, pindex=0):用于账户转入或转出资金。正数为入金,负数为出金。当日的出入金从当日开始记入成本,用于计算收益。
具体操作步骤
第一步:修改策略代码
在您的策略代码中,添加或修改 after_code_changed 函数,在其中调用 inout_cash。
例如,如果您想给模拟盘增加 100,000 元,请在代码末尾添加以下内容:
def after_code_changed(context):
# 增加 100,000 元资金
inout_cash(100000, pindex=0)
log.info("已成功追加资金 100,000 元,当前可用资金为:", context.portfolio.available_cash)
如果您想减少 50,000 元,则传入负数:
def after_code_changed(context):
# 减少 50,000 元资金
inout_cash(-50000, pindex=0)
log.info("已成功转出资金 50,000 元,当前可用资金为:", context.portfolio.available_cash)
第二步:保存策略并等待生效
修改代码并保存后,不需要做其他操作。等待第二天模拟盘开盘前(系统从休眠中恢复时),系统检测到代码变更,就会自动执行 after_code_changed 函数,完成资金的调整。
第三步:清理代码(重要!)
在资金调整成功生效(第二天)后,强烈建议您再次修改代码,将 inout_cash 这行代码注释掉或删除。否则,如果您未来因为其他原因再次修改代码,触发了 after_code_changed,系统会再次执行出入金操作,导致资金计算错误。
def after_code_changed(context):
# 资金调整已完成,注释掉以防重复执行
# inout_cash(100000, pindex=0)
pass
注意事项
- 收益计算:使用
inout_cash进行出入金后,当日的出入金会记入成本,系统会自动调整收益率的计算基数(即本金会包含当日出入金金额),因此不会导致收益率曲线出现不合理的暴涨或暴跌。 - 多仓位支持:如果您使用了
set_subportfolios设置了多个子账户,可以通过修改pindex参数(如pindex=1)来指定给哪个子账户进行出入金。