欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → portfolio对象的持仓变化问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有3212人关注过本帖树形打印复制链接

主题:portfolio对象的持仓变化问题

帅哥哟,离线,有人找我吗?
无极无名
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:273 积分:365 威望:0 精华:1 注册:2011/4/13 11:57:13
portfolio对象的持仓变化问题  发帖心情 Post By:2020/11/15 16:29:26 [显示全部帖子]

def handle_bar(context):  
    print('新的一天开始了')  
    portfolio = get_portfolio(context.s1,0)#读取portfolio
    print('当前空头持仓为%d'%portfolio.sell_quantity)
    print('当前多头持仓为%d'%portfolio.buy_quantity)
    if close[-1]>sg[-1] and close[-2]<=sg[-2]:
        print('符合平空开多')
        if portfolio.sell_quantity>0:
            print('有空头持仓,平空')
            buy_close(context.s1,"market", volume=portfolio.sell_quantity,serial_id = 1)#空头平仓
            portfolio = get_portfolio(context.s1,0)#平空之后读portfolio
            print('买平后空头持仓为%d'%portfolio.sell_quantity)#输出显示空头持仓已经变为0
        if portfolio.buy_quantity == 0:
    print('无多头持仓,开多') 
            buy_open(context.s1, "market", volume=1,serial_id = 2)#多头开仓
            portfolio = get_portfolio(context.s1,0)#开多后读portfolio
            print('多开后多头持仓为%d'%portfolio.buy_quantity)#输出显示多头持仓依然为零,不应该为1吗?
   
    if close[-1]<xg[-1] and close[-2]>=xg[-2]:
        if portfolio.buy_quantity>0:
            print('有多头持仓,平多')
            sell_close(context.s1,"market", volume=portfolio.buy_quantity,serial_id = 3)
            portfolio = get_portfolio(context.s1,0)
            print('平多后多头持仓为%d'%portfolio.buy_quantity)
        if portfolio.sell_quantity == 0:
            print('无空头持仓,开空')   
            sell_open(context.s1, "market", volume=1,serial_id = 4)
            portfolio = get_portfolio(context.s1,0)
            print('开空后空头持仓为%d'%portfolio.sell_quantity)
    print('当天结束了')

def after_trading(context):
    portfolio = get_portfolio(context.s1,0)
    print('收盘空头%d'%portfolio.sell_quantity)
    print('收盘多头%d'%portfolio.buy_quantity)#盘后显示多头持仓为1
    pass

上文是平仓反手代码片段,在handle_bar(context)中,平仓指令发出,持仓马上归零,但是反手开仓指令发出后,持仓不能正确显示,依然为零,必须要在after_trading(context)中,才能正确显示为1.
请教这是机制问题,还是我的代码有问题?

 回到顶部
帅哥哟,离线,有人找我吗?
无极无名
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:273 积分:365 威望:0 精华:1 注册:2011/4/13 11:57:13
  发帖心情 Post By:2020/11/15 19:44:42 [显示全部帖子]

我是日线级别回测,handle_bar每天执行一次我的测试结果,如果是平仓语句,持仓马上就会发生变化,这个似乎是虚拟持仓变化,跟是否成交没关系。但是对于开仓语句,在之后handle_bar中任何位置GET_PORTFOLIO,都不会有持仓变化。只有在当日AFTER_TRADING方法中GET_PORTFOLIO,持仓才会会发生变化。
所以问题一,PORTFOLIO对象中的持仓是虚拟持仓,还是实际持仓,回测和实盘有何区别?
问题二:无论是虚拟持仓还是实际持仓,开仓和平仓语句之后的持仓变化时机是不同的,如上文所述,这个我反复测试过,难以理解。

 回到顶部
帅哥哟,离线,有人找我吗?
无极无名
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:273 积分:365 威望:0 精华:1 注册:2011/4/13 11:57:13
  发帖心情 Post By:2020/11/16 0:00:34 [显示全部帖子]

但是平仓语句之后,持仓为什么马上就变了呢?

 回到顶部
帅哥哟,离线,有人找我吗?
无极无名
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:273 积分:365 威望:0 精华:1 注册:2011/4/13 11:57:13
  发帖心情 Post By:2020/11/24 17:16:56 [显示全部帖子]

谢谢各位老师的回答!我能不能自建一个变量跟踪虚拟持仓,并在新K产生时进行初值传递,就像图表的HOLDING一样?


 回到顶部