问题描述
比如我运行某个多因子策略,买入并持有50只股票,有一天我不想运行了,点了"关闭交易"这个按钮,这个时候之前策略持有的50只股票还在吗?是自动给卖出,还是需要手动一个一个卖出?如果是手动卖出的话就麻烦了,50只股票呢!
解决方案
首先需要特别说明的是,根据 JoinQuant 官方公告,一创聚宽已于 2023-12-29 停止维护,聚宽目前没有提供任何形式的实盘及交易通道服务。以下解答主要针对 JoinQuant 平台上的模拟交易环境。
点击“关闭交易”会自动清仓吗?
不会自动清仓。
当您在 JoinQuant 平台上点击“关闭交易”或停止运行某个模拟交易策略时,系统仅仅是停止了该策略代码的继续执行。您账户中当前持有的股票(例如那 50 只股票)依然会保留在您的模拟账户中,系统不会自动帮您卖出。
如何避免手动一个一个卖出?
如果您不想手动去卖出这 50 只股票,最简单的方法是在您决定“关闭交易”之前,修改一下策略代码,让策略帮您执行一键清仓,等清仓完成后,您再点击“关闭交易”。
一键清仓代码示例
您可以将策略的 handle_data 或 market_open 函数临时修改为以下清仓逻辑:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 每天开盘时运行清仓函数
run_daily(clear_all_positions, time='09:30')
def clear_all_positions(context):
# 获取当前账户中所有的持仓标的
positions = context.portfolio.positions
# 如果没有持仓,直接返回
if len(positions) == 0:
log.info("当前无持仓,无需清仓。")
return
# 遍历所有持仓并卖出
for security in positions:
# 检查是否有可卖出的仓位(避免停牌或T+1限制导致报错)
if positions[security].closeable_amount > 0:
# 使用 order_target 将目标持仓设为 0,即全部卖出
order_target(security, 0)
log.info("执行清仓,卖出: %s" % security)
else:
log.info("标的 %s 当前无可用可卖仓位(可能受T+1或停牌限制)。" % security)
操作步骤:
- 在模拟交易运行界面,点击**“替换代码”**(或暂停后修改代码)。
- 将上述清仓代码替换掉您原来的交易逻辑。
- 让策略在下一个交易日开盘时运行一次,系统会自动遍历您的 50 只股票并下达卖出指令。
- 查看交易日志,确认所有股票都已成功卖出(注意 T+1 规则,当天买入的股票当天无法卖出)。
- 确认空仓后,您就可以放心地点击**“关闭交易”**了。