import pandas as pd
import numpy as np
df = get_price('C9999.XDCE',end_date='2019-03-08', frequency='1d', count=2)
df
初始保证金¶
期货以保证金的方式进行交易,计算方式如下,不同的期货品种对应不同的交易单位和保证金比率,需要查找后对应计算
在回测中可以用context.portfolio.subportfolios.margin 查看
购买一手玉米期货的价格¶
$$每手价格 = (价格+滑点)* 合约乘数 * 保证金比率$$slippage = 0
ratio = 0.05
margin = [(df.iloc[i,0] + slippage)* 10 * ratio for i in range(df.shape[0])]
margin
能购买的期货数量¶
available_cash = 100000
amount = [round(available_cash / margin[i]) for i in range(len(margin))]
amount
维持保证金¶
如果客户为商品互换交易的买方(多头),则当标的价格下降时
$$ 维持保证金=初始保证金 +MAX\{0,(开仓名义价值-持仓名义价值)\} $$
若客户为商品互换交易的卖方(空头),则当标的价格上升时
$$ 维持保证金=初始保证金 + MAX\{0,(持仓名义价值 –开仓名义价值)\} $$
# 如 2019-03-07 开多仓价格为 1831,2019-03-08 开盘价为1828
initial_position = df.loc['2019-03-07','close'] * 10 * 1
hold_position = df.loc['2019-03-08','open'] * 10 * 1
sustain_margin = margin[0] + max(0,initial_position - hold_position)
margin[0],sustain_margin
可用资金¶
回测context.portfolio.subportfolios子账户信息中available_cash字段,代表可以继续补足保证金或建仓的资金
总资产¶
回测context.portfolio.subportfolios子账户信息中total_value字段,包括现金, 保证金(期货)、仓位(股票)的总价值, 可用来计算收益
$$ 总资产 = 可用资金 + 已经投入的保证金 $$total_value = [margin[i] + (available_cash -margin[i]) for i in range(len(margin))]
total_value
持仓价值¶
回测context.portfolio.subportfolios子账户信息中positions_value字段,表示持有合约以当前市价计值的价值
$$ 持仓价值 = 合约市价 * 合约乘数 * 建仓数量 $$positions_value = [df.iloc[i,0] * 10 * 1 for i in range(df.shape[0])] #下单1手
positions_value
风险度¶
$$ 风险度 = 持仓保证金 / 客户权益 $$
若客户没有持仓,则风险度为0;若客户满仓,则风险度为100%;
若风险度大于100%,则客户已经穿仓了,要被期货公司强行平仓。
正常情况下客户的风险度在0-100%之间,风险度越大,说明客户面临的风险也就越大(当然期货公司面临的风险也就越大)
risk_ratio = [margin[i] / total_value[i] for i in range(len(margin))]
risk_ratio
强制平仓制度¶
当会员、客户出现下列情形之一时,交易所有权对其持仓进行强行平仓:
(一)会员结算准备金余额小于零,并未能在规定时限内补足的;
(二)非期货公司会员和客户持仓量超出其限仓规定的;
(三)因违规受到交易所强行平仓处罚的;
(四)根据交易所的紧急措施应予强行平仓的;
(五)其他应予强行平仓的。
get_extras('futures_sett_price', cf,end_date='2019-03-08', df=True, count=10)
#期货结算价
get_extras('futures_positions', cf,end_date='2019-03-08', df=True, count=10)
#期货持仓量