CTP接口之保证金率手续费率查询中我们已经讲过如何查询保证金率和手续费率,这一篇再详细讲一下根据费率计算相应的保证金,为最终资金权益等的计算做铺垫。

一、保证金计算公式

保证金的计算公式如下:
保证金 = 按手数保证金费*手数+按金额保证金率*金额*手数*合约乘数=(按手数保证金费+按金额保证金率*金额*合约乘数)*手数
按照API中的字段即是:
多头保证金=(LongMarginRatioByVolume + LongMarginRatioByMoney * Price *VolumeMultiple )* Volume
空头保证金类似。
这个公式中按手数保证金费和按金额保证金率可以通过ReqQryInstrumentMarginRate查询得到;合约乘数可以通过ReqQryInstrument查询得到;手数是涉及到计算到的手数。那就只剩下一个问题,用什么金额去计算?

二、保证金价格类型

用什么金额去计算客户的保证金,对于昨仓统一使用昨结算价计算,对于今仓,在期货公司后台是可以设置的。客户也可以通过ReqQryBrokerTradingParams(请求查询经纪公司交易参数)查询得到设置的类型。查询示例如下:

qryField = api.CThostFtdcQryBrokerTradingParamsField()
qryField.BrokerID="8000"
qryField.InvestorID="012345"
qryField.CurrencyID = "CNY"
tradeapi.ReqQryBrokerTradingParams(qryField,0)

在该查询的回调结果中查看MarginPriceType枚举值:

def OnRspQryBrokerTradingParams(self, 
    pBrokerTradingParams: 'CThostFtdcBrokerTradingParamsField', 
    pRspInfo: 'CThostFtdcRspInfoField', 
    nRequestID: 'int', bIsLast: 'bool') -> "void":    
    if pBrokerTradingParams is not None:                            
        print(f"MarginPriceType:{pBrokerTradingParams.MarginPriceType}")

枚举值列表如下:

///昨结算价
#define THOST_FTDC_MPT_PreSettlementPrice '1'
///最新价
#define THOST_FTDC_MPT_SettlementPrice '2'
///成交均价
#define THOST_FTDC_MPT_AveragePrice '3'
///开仓价
#define THOST_FTDC_MPT_OpenPrice '4'

可见计算保证金中用到的价格类型有4种。

下面我们举例说明,设au2106昨结算价为391.74,查询合约得到合约乘数为1000,查询保证金率得到LongMarginRatioByMoney为0.08,LongMarginRatioByVolume为0.0,ShortMarginRatioByMoney为0.08,ShortMarginRatioByVolume为0.0。

三、保证金的计算

01 以昨结算价计算为例

目前simnow即采用昨结算价计算保证金。如果上述查询返回得到参数MarginPriceType为1,则说明CTP后台使用昨结算价计算保证金。
此时假设以396.16报买开1手,未成交,CTP会冻结保证金,账户的可用资金会减少。这时,
冻结保证金=(按手数保证金费+按金额保证金率*昨结算价*合约乘数)*手数=(0.08*391.74*1000)*1=31339.20。
经过一段时间 ,该买开仓以396.16成交,此时客户有1手多头持仓,相应的冻结保证金减少,增加占用保证金。这时,
冻结保证金=0占用保证金=(按手数保证金费+按金额保证金率*昨结算价*合约乘数)*手数=(0.08*391.74*1000)*1=31339.20。
在整个交易日内,au2106合约的行情最新价格上上下下不停变化,这时客户该合约上的持仓盈亏也不断变化,但是这1手占用的保证金因为是用昨结算价计算的,昨结算价不变,占用保证金也不变。
等到第二个交易日,该合约有新的结算价时,占用保证金才发生相应的变化。

02 其他价格类型

如果上述查询返回得到参数MarginPriceType为2,则说明CTP后台是以行情中最新价计算保证金的。
这时冻结保证金和占用保证金均是使用最新 价,而且会随着最新价的更新而动态变化。其他的价格类型也是类似计算,按成交均价算则是按照行情里面的均价更新,按开仓价算则是冻结时用报单价,成交后用成交价计算。
只有在最新价和成交均价这两种情况下今仓的保证金值才会随着行情波动而更新,昨仓的保证金值一直是用昨结算价计算得到,不会改变。

四、保证金计算其他注意项

01 保证金优惠

为了增加资金可用率,交易所都有一定的保证金优惠政策。例如上期所的品种大额单边保证金优惠,是指同一品种内所有的合约按多空分别累计保证金,然后实际只收大额一边的保证金,因为同品种多空有一定风险对冲,同时收两边保证金过于保守。

举例:

客户总资金为200,000,此时au2106多头占用保证金100,000,au2102空头占用保证金80,000,根据品种大单边优惠规则,CTP后台实际算占用保证金为100,000,也就是说客户现在可用资金为200,000-100,000=100,000。
这时客户又成交1手au2104的空头,占用保证金为30,000,总的空头占用保证金为110,000,大于多头的100,000。所以CTP后台实际占用保证金为110,000,客户可用资金为200,000-110,000=90,000。
品种是否采用大额单边保证金算法可以根据查合约ReqQryInstrument请求得到返回中的MaxMarginSideAlgorithm来判断。当下的大额单边保证金占用多少,可以通过ReqQryInvestorProductGroupMargin查询得到。
除了上期所品种内的大额单边保证金优惠外,中金所还有跨品种的大额单边保证金优惠,例如对股指类期货:沪深300股指期货、上证50股指期货和中证500股指期货这三个的跨品种双向持仓,按照交易保证金单边较大者收取交易保证金;对国债类期货也实施跨品种单向大边保证金制度。

大商所郑商所对普通合约还是按照双边收取保证金,但对于标准套利合约只收两个保证金中较高的,大商所盘中申请组合成功也有大边保证金优惠。

02 保证金率调整

保证金率在整个合约存在过程中并不是一直不变,常见的调整保证金情况有:

  • 节假日前为了规避国际市场的风险调整保证金;
  • 单边市出现停板情况时调整保证金;
  • 出现极端风险或市场震荡时调整保证金;
  • 持仓量达到一定数量是交易所调整保证金;
  • 临近交割月调整保证金;
  • 交易所规定的其他情况。

03 市价单保证金计算

对于市价单,在计算保证金冻结时,使用涨跌停价计算,计算占用保证金时,按照价格类型采用相应的价格计算。