以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  高级功能研发区  (http://222.73.7.161/bbs/list.asp?boardid=5)
----  portfolio对象的持仓变化问题  (http://222.73.7.161/bbs/dispbbs.asp?boardid=5&id=183022)

--  作者:无极无名
--  发布时间:2020/11/15 16:29:26
--  portfolio对象的持仓变化问题
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.
请教这是机制问题,还是我的代码有问题?

--  作者:yukizzc
--  发布时间:2020/11/15 17:25:38
--  
你是回测还是实盘运行?
回测时候下单后不是立即成交的,如果你handle_bar只执行了一次,那么那一次下单后持仓是不会变化的

--  作者:马良
--  发布时间:2020/11/15 19:21:24
--  
无论是回测还是实盘都不可能下单后立马就能在持仓中体现的。 单子总有到交易所撮合交易的过程
[此贴子已经被作者于2020/11/15 19:21:57编辑过]

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

--  作者:yukizzc
--  发布时间:2020/11/15 21:05:11
--  
你日线执行一次自然会有这个问题,因为你日线程序相当于只执行一次
那么在执行下单动作后,马上输出持仓这个时候持仓是没有变化的。这个如果实盘你应该能理解
回测的话也一样,不同于图表策略那种回测,python这个回测他在下单瞬间是没有持仓的


你如果实盘的话,用固定间隔一直去执行程序,那么可能第一次执行下单,等后面几秒后执行时候持仓就会发生变化了

--  作者:无极无名
--  发布时间:2020/11/16 0:00:34
--  
但是平仓语句之后,持仓为什么马上就变了呢?
--  作者:yukizzc
--  发布时间:2020/11/16 10:20:02
--  

好像平仓后回测时候是当作立即成交,而开仓不是。

[此贴子已经被作者于2020/11/16 13:12:21编辑过]

--  作者:yukizzc
--  发布时间:2020/11/16 11:02:33
--  

原因其实是在于,你开仓后是成交了才算有持仓对不对?

但是你平仓时候,是不是你平仓后你的可用持仓其实就是没有了,而不需要说成交对不对??因为有冻结一说,就和你开仓后保证金冻结一个概念


--  作者:无为剑
--  发布时间:2020/11/16 12:26:07
--  
图片点击可在新窗口打开查看
--  作者:无极无名
--  发布时间:2020/11/24 17:16:56
--  
谢谢各位老师的回答!我能不能自建一个变量跟踪虚拟持仓,并在新K产生时进行初值传递,就像图表的HOLDING一样?