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
[907.5, 914.0]
available_cash = 100000 amount = [round(available_cash / margin[i]) for i in range(len(margin))] amount
[110.0, 109.0]
如果客户为商品互换交易的买方(多头),则当标的价格下降时
$$ 维持保证金=初始保证金 +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
(907.5, 937.5)
回测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
[100000.0, 100000.0]
回测context.portfolio.subportfolios子账户信息中positions_value字段,表示持有合约以当前市价计值的价值
positions_value = [df.iloc[i,0] * 10 * 1 for i in range(df.shape[0])] #下单1手 positions_value
[18150.0, 18280.0]
若客户没有持仓,则风险度为0;若客户满仓,则风险度为100%;
若风险度大于100%,则客户已经穿仓了,要被期货公司强行平仓。
正常情况下客户的风险度在0-100%之间,风险度越大,说明客户面临的风险也就越大(当然期货公司面临的风险也就越大)
risk_ratio = [margin[i] / total_value[i] for i in range(len(margin))] risk_ratio
[0.009075, 0.00914]
当会员、客户出现下列情形之一时,交易所有权对其持仓进行强行平仓:
(一)会员结算准备金余额小于零,并未能在规定时限内补足的;
(二)非期货公司会员和客户持仓量超出其限仓规定的;
(三)因违规受到交易所强行平仓处罚的;
(四)根据交易所的紧急措施应予强行平仓的;
(五)其他应予强行平仓的。
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) #期货持仓量
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
借花(感恩节)献佛 感恩回顾
美股再次暴跌,但黄金却无动于衷
移动端课程