掘金社区

请问cash对象中净收益pnl是如何计算得到的?Pinned highlighted

juejin 发表在掘金2 2020-09-24 11:01:52

掘金2
132
7
0

可以提供计算公式么?
在手续费为0的情况下,为什么在on_bar方法被调用时,order_volume执行后,立即查看pnl,发现nav已经和cum_inout不一样了,这个nav和pnl是怎么计算得到的呢?
考虑了印花税和交易费的情况下,得到的净收益值也远小于从cash对象中读取到的值('pnl': -2.9999732971191406)。附上cash对象和data对象值的变化:

  • 购买前cash:

{'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'nav': 1000000.0, 'available': 1000000.0, 'cum_inout': 1000000.0, 'created_at': datetime.datetime(2020, 9, 1, 9, 0, tzinfo=tzfile('PRC')), 'account_name': '', 'currency': 0, 'pnl': 0.0, 'fpnl': 0.0, 'frozen': 0.0, 'order_frozen': 0.0, 'balance': 0.0, 'market_value': 0.0, 'cum_trade': 0.0, 'cum_pnl': 0.0, 'cum_commission': 0.0, 'last_trade': 0.0, 'last_pnl': 0.0, 'last_commission': 0.0, 'last_inout': 0.0, 'change_reason': 0, 'change_event_id': '', 'updated_at': None}

  • order_volume之后返回的data值:

[{'strategy_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'cl_ord_id': '000000000', 'symbol': 'SHSE.600000', 'side': 1, 'position_effect': 1, 'position_side': 1, 'order_type': 2, 'status': 3, 'price': 10.319999694824219, 'order_style': 1, 'volume': 100, 'value': 1031.9999694824219, 'percent': 0.0010319999694824219, 'target_volume':
100, 'target_value': 1031.9999694824219, 'target_percent': 0.0010319999694824219, 'filled_volume': 100, 'filled_vwap': 10.319999694824219, 'filled_amount': 1031.9999694824219, 'created_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'account_name': '', 'order_id': '', 'ex_ord_id': '', 'algo_order_id': '', 'order_business': 0, 'order_duration': 0, 'order_qualifier': 0, 'order_src': 0, 'ord_rej_reason': 0, 'ord_rej_reason_detail': '', 'stop_price': 0.0, 'filled_commission': 0.0}]

  • 购买后cash

{'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'nav': 999997.0000267029, 'pnl': -2.9999732971191406, 'fpnl': -2.9999732971191406, 'frozen': 1031.9999694824219, 'available': 998968.0000305176, 'cum_inout': 1000000.0, 'cum_trade': 1031.9999694824219, 'last_trade': 1031.9999694824219, 'created_at': datetime.datetime(2020, 9, 1, 9, 0, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'account_name': '', 'currency': 0, 'order_frozen': 0.0, 'balance': 0.0, 'market_value': 0.0, 'cum_pnl': 0.0, 'cum_commission': 0.0, 'last_pnl': 0.0, 'last_commission': 0.0, 'last_inout': 0.0, 'change_reason': 0, 'change_event_id': ''}

评论: 7
  • fpnl是浮动盈亏,是指按照(当天收盘价-买入价)*数量 得到的。pnl是净收益,用(fpnl-交易费用)得到的。fpnl不为0说明当天收盘价已经不等于你买入时的价格了,所以产生了浮动盈亏。由于设置手续费为0,所以买入股票后的pnl和fpnl相同。

    2020-09-24 16:27:07
  • @四两 这个是回测得到的,代码如下:

            print("购买前净值:",context.account().cash.nav)
            my_volume=100
            data=order_volume(symbol=bar['symbol'], volume=my_volume, price=0, side=OrderSide_Buy,
                         order_type=OrderType_Market, position_effect=PositionEffect_Open, account='xxxxx')
            print("购买后净值:",context.account().cash.nav)
    

    上述结果找不到了,我把运行结果再贴一份上来,和之前的值有出入:

    SHSE.600000

    bar

    {'symbol': 'SHSE.600000', 'eob': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'bob': datetime.datetime(2020, 9, 1, 9, 30, tzinfo=tzfile('PRC')), 'open': 10.3100004196167, 'close': 10.319999694824219, 'high': 10.359999656677246, 'low': 10.300000190734863, 'volume': 15899151, 'amount': 164136461.0, 'pre_close': 0.0, 'position': 0, 'frequency': '3600s', 'receive_local_time': 1600917994.9685555}

    myCash

    {'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'nav': 1000000.0, 'available': 1000000.0, 'cum_inout': 1000000.0, 'created_at': datetime.datetime(2020, 9, 1, 9, 0, tzinfo=tzfile('PRC')), 'account_name': '', 'currency': 0, 'pnl': 0.0, 'fpnl': 0.0, 'frozen': 0.0, 'order_frozen': 0.0, 'balance': 0.0, 'market_value': 0.0, 'cum_trade': 0.0, 'cum_pnl': 0.0, 'cum_commission': 0.0, 'last_trade': 0.0, 'last_pnl': 0.0, 'last_commission': 0.0, 'last_inout': 0.0, 'change_reason': 0, 'change_event_id': '', 'updated_at': None}

    购买前净值: 1000000.0

    购买后净值: 999996.0000038147

    ********** data-begin **********

    [{'strategy_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'cl_ord_id': '000000000', 'symbol': 'SHSE.600000', 'side': 1, 'position_effect': 1, 'position_side': 1, 'order_type': 2, 'status': 3, 'price': 10.329999923706055, 'order_style': 1, 'volume': 100, 'value': 1032.9999923706055, 'percent': 0.0010329999923706056, 'target_volume':

    100, 'target_value': 1032.9999923706055, 'target_percent': 0.0010329999923706056, 'filled_volume': 100, 'filled_vwap': 10.329999923706055, 'filled_amount': 1032.9999923706055, 'created_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'account_name': '', 'order_id': '', 'ex_ord_id': '', 'algo_order_id': '', 'order_business': 0, 'order_duration': 0, 'order_qualifier': 0, 'order_src': 0, 'ord_rej_reason': 0, 'ord_rej_reason_detail': '', 'stop_price': 0.0, 'filled_commission': 0.0}]

    ********** data-end **********

    股票代码: SHSE.600000 购买时间: 2020-09-01 10:30:00+08:00 购买数量: 100 购买价格: 10.329999923706055 收盘价格: 10.319999694824219

    postions

    [{'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'symbol': 'SHSE.600000', 'side': 1, 'volume': 100, 'volume_today': 100, 'vwap': 10.329999923706055, 'amount': 1032.9999923706055, 'fpnl': -3.9999961853027344, 'cost': 1032.9999923706055, 'available': 100, 'available_today': 100, 'created_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'account_name': '', 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}]

    mycash

    {'account_id': '91b78f0d-ecec-11ea-b795-0a0027000003', 'nav': 999996.0000038147, 'pnl': -3.9999961853027344, 'fpnl': -3.9999961853027344, 'frozen': 1032.9999923706055, 'available': 998967.0000076294, 'cum_inout': 1000000.0, 'cum_trade': 1032.9999923706055, 'last_trade': 1032.9999923706055, 'created_at': datetime.datetime(2020, 9, 1, 9, 0, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')), 'account_name': '', 'currency': 0, 'order_frozen': 0.0, 'balance': 0.0, 'market_value': 0.0, 'cum_pnl': 0.0, 'cum_commission': 0.0, 'last_pnl': 0.0, 'last_commission': 0.0, 'last_inout': 0.0, 'change_reason': 0, 'change_event_id': ''}

    这里的购买价格我取了data中的Price=10.329999923706055,当时市价我选取了收盘价=10.319999694824219,这样计算fpnl=(10.319999694824219-10.329999923706055)*100=-1.0000228881835938,这与-3.9999961853027344的值也不符合,不知道哪里出了问题?不吝赐教

    2020-09-24 16:39:10
  • @juejin 0_1600937206985_40ce927f-9469-4809-ab9d-f2e3024d8333-image.png
    202年9月1号SHSE.600000的收盘价是10.29,这样的话浮动盈亏就是(10.29-10.329999923706055)*100=-3.9999992刚好差不多对上了。

    2020-09-24 16:50:46
  • @四两 非常感谢大神的回答,我这个回测时间是如下设置的(bar的获取频率设置为1小时):

        run(strategy_id='91b78f0d-ecec-11ea-b795-0a0027000003',
            filename=os.path.basename(__file__),
            mode=MODE_BACKTEST,
            token='b436e1ef68cc168fc5d1d82957e2cd4d990856e6',
            backtest_start_time='2020-09-01 09:00:00',
            backtest_end_time='2020-09-01 12:00:00',
            backtest_commission_ratio=0.0000)
    

    回测的购买价都是按照当日的收盘价计算的么?我原本以为是按照bar收到时间(这里就是datetime.datetime(2020, 9, 1, 10, 30, tzinfo=tzfile('PRC')))的close价格计算的。这样的话,一天之内的回测岂不是没有意义的?

    2020-09-25 10:00:14
  • @juejin 回测时交易的结算价是下一个bar的开盘价,如图:
    0_1601004142510_e0cb5de0-9a42-4fff-be67-19b0d60f5b04-image.png
    浮动盈亏应该是按照当天的结算价计算的(估计要是按照下个bar计算,计算量可能比较大比较复杂?)

    2020-09-25 11:23:42
  • @四两 如果按当天收盘价计算的话,那在当天进行的交易都是和实际情况不符的,回测得到的模型用到实盘上,岂不是也是不合适的

    2020-09-25 12:25:43
  • @juejin 不然自己算一下吧😬

    2020-09-25 15:39:32

Looks like your connection to 掘金量化社区 - 量化交易者的策略交流学习社区 was lost, please wait while we try to reconnect.