问题描述
大神们,如何利用聚宽的平台回测即时的持仓?现在策略都是要第二天才能看到前一天的交易操作。谢谢!
解决方案
您好!关于您提到的“第二天才能看到前一天的交易操作”,这其实是回测结果页面展示机制造成的误解。在聚宽的回测详情页中,图表和持仓列表确实是按天(每日收盘后)进行结算和展示的。但是,在您的策略代码内部,持仓信息是完全即时(根据您的回测频率)更新的。
如果您使用的是分钟回测或Tick回测,在盘中的每一分钟或每一个Tick,您都可以通过 context 对象获取到最新的、即时的持仓状态。
获取即时持仓的核心API
在策略运行过程中(如 handle_data 或 run_daily 指定的盘中函数内),您可以通过 context.portfolio.positions 来获取当前的即时持仓字典。
context.portfolio.positions:这是一个字典(dict),键(key)是标的代码(如 '000001.XSHE'),值(value)是Position对象,包含了该标的的详细持仓信息。
Position 对象的常用属性
当您拿到某个标的的 Position 对象后,可以查看以下即时信息:
total_amount: 总仓位(包含挂单冻结的仓位)。closeable_amount: 可卖出的仓位(T+1制度下,今天买入的明天才能卖出,此字段会自动处理)。price: 最新行情价格。value: 标的当前总价值(price * total_amount * 乘数)。avg_cost: 当前持仓成本(买入均价)。
代码示例:如何在盘中打印即时持仓
以下是一个在分钟回测中,每分钟打印当前即时持仓的示例:
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
g.security = '000001.XSHE'
# 每天 10:00 定时买入
run_daily(buy_stock, time='10:00')
# 每天 14:00 定时查看即时持仓
run_daily(check_position, time='14:00')
def buy_stock(context):
# 买入1000股
order(g.security, 1000)
log.info("10:00 下单买入 1000 股 %s" % g.security)
def check_position(context):
# 获取当前逻辑时间
current_time = context.current_dt
log.info("当前时间: %s, 开始检查即时持仓..." % current_time)
# 获取所有持仓
positions = context.portfolio.positions
if len(positions) > 0:
for stock in positions:
pos = positions[stock]
log.info("标的: %s, 总持仓: %d, 可卖仓位: %d, 最新价: %.2f, 持仓价值: %.2f" %
(stock, pos.total_amount, pos.closeable_amount, pos.price, pos.value))
else:
log.info("当前无持仓")
进阶技巧:如何在回测图表上看到盘中变化?
如果您希望在回测的图表上直观地看到盘中某个时刻的持仓变化,可以使用 record() 函数。record() 可以将您自定义的变量绘制在回测结果的图表中。
def handle_data(context, data):
# 记录平安银行的即时持仓数量
if '000001.XSHE' in context.portfolio.positions:
amount = context.portfolio.positions['000001.XSHE'].total_amount
else:
amount = 0
# 将持仓数量画在图表上
record(PA_Amount=amount)
总结:聚宽平台的底层撮合引擎是实时更新账户状态的。只要您的回测频率是分钟或Tick,您在代码中通过 context.portfolio 拿到的数据就是盘中即时的,完全可以基于这些即时数据进行复杂的盘中交易逻辑编写。