欢迎光临
专业期货策略平台

期权盒式套利-日线级别量化源代码下载

真格量化系统-期权盒式套利-日线级别量化源代码下载

#!/usr/bin/env python
# coding:utf-8
from PoboAPI import *
import datetime
import math
from copy import *

#开始时间,用于初始化一些参数
def OnStart(context) :
  print "I\'m starting..."
  #设置全局变量,作为是否已经平仓的标志
  g.close=True
  #设置开仓阈值
  g.threshold=1.5
  #获取当前期权的到期日列表
  last= GetOptionsLastDates('510050.SHSE')
  #获取特定到期日的期权列表
  call_oplist = GetOptionContracts('510050.SHSE',last[-1],0)
  put_oplist=GetOptionContracts('510050.SHSE',last[-1],1)
  g.code=[call_oplist[0],call_oplist[1],put_oplist[0],put_oplist[1]]
  print "当前套利期权组合初始化为"+str(g.code)
  SubscribeQuote(g.code[0])
  #登录期权账号
  if context.accounts.has_key("回测期权") :
    print "登录交易账号 回测期权"
    if context.accounts["回测期权"].Login() :
      context.myacc = context.accounts["回测期权"]
      
#实时行情事件
def OnQuote(context,code) :
  #print "调用到OnQuote事件"
  #如果当前持仓已平仓,寻找当前可进行套利的一组期权
  if g.close==True:
    #获取当前期权的到期日列表
    last= GetOptionsLastDates('510050.SHSE')
    #获取特定到期日的期权列表
    call_oplist = GetOptionContracts('510050.SHSE',last[-1],0)
    put_oplist= GetOptionContracts('510050.SHSE',last[-1],1)
    #获取期权的基本信息列表
    info=[]
    for op in call_oplist:
      info.append(GetContractInfo(op))
    #获取期权的行权价列表
    K=[]
    for i in info:
      K.append(i['行权价格'])
    #获取看涨期权当前最新价列表
    C=[]
    for op in call_oplist:
      C.append(GetQuote(op).now)
    #获取看跌期权当前最新价列表
    P=[]
    for op in put_oplist:
      P.append(GetQuote(op).now)
    #获取期权行权日
    T=last[-1]
    #获取当前交易日
    t=GetCurrentTradingDate('SHFE')
    #计算当前日距离到期日的时间,并换算成以年为单位
    time=float((T-t).days)/365.0
    #无风险利率设为0.04
    r=0.04
    code_list=[]
    spreads=[]
    #将列表可进行套利的期权加入code_list中,并将套利差加入spreads中
    for i in range(len(K)):
      for j in range(i+1,len(K)):
        K_all=(K[j]-K[i])*math.exp(-r*time)
        C_all=C[i]-C[j]
        P_all=P[j]-P[i]
        if C_all+P_all>= g.threshold*K_all or C_all+P_all<=-g.threshold*K_all:
          code_list.append([call_oplist[i],call_oplist[j],put_oplist[i],put_oplist[j]])
          spreads.append(abs(C_all+P_all))
    #如果code_list不为空,将套利差绝对值最大的期权组合保存到g.code中
    if code_list:
      UnsubscribeQuote(g.code[0])
      index=spreads.index(max(spreads))
      g.code=code_list[index]
      #print "套利期权组合更改为"+str(g.code)
      SubscribeQuote(g.code[0])
  #print "当前套利期权组合为"+str(g.code)
  #获取套利期权组合的基本信息
  info1=GetContractInfo(g.code[0])
  info2=GetContractInfo(g.code[1])
  #获取套利期权组合的行权价
  K1=info1['行权价格']
  K2=info2['行权价格']
  #获取套利期权组合的最新价
  dyndata1=GetQuote(g.code[0])
  dyndata2=GetQuote(g.code[1])
  C1=dyndata1.now
  C2=dyndata2.now
  dyndata3=GetQuote(g.code[2])
  dyndata4=GetQuote(g.code[3])
  P1=dyndata3.now
  P2=dyndata4.now
  #获取期权组合的到期日并转换为date格式
  T_int=info1['行权到期日']
  T_str=str(T_int)
  year=int(T_str[0:4])
  month=int(T_str[5:7])
  day=int(T_str[8:])
  T=datetime.date(year,month,day)
  #获取当前交易日
  t=GetCurrentTradingDate('SHFE')
  #计算当前日距离到期日的时间,并换算成以年为单位
  time=float((T-t).days)/365.0
  #无风险利率设为0.04
  r=0.04
  #计算K
  K=(K2-K1)*math.exp(-r*time)
  #计算C
  C=C1-C2
  #计算P
  P=P2-P1
  #获取期权组合的当前涨停价
  dyndata1=GetQuote(g.code[0])
  riselimit1=dyndata1.riselimit
  dyndata2=GetQuote(g.code[1])
  riselimit2=dyndata2.riselimit
  dyndata3=GetQuote(g.code[2])
  riselimit3=dyndata3.riselimit
  dyndata4=GetQuote(g.code[3])
  riselimit4=dyndata4.riselimit
  #获取期权组合的当前成交量
  trade1=dyndata1.volume
  trade2=dyndata2.volume
  trade3=dyndata3.volume
  trade4=dyndata4.volume
  price_type= PriceType(PbPriceType.Limit,limit_price_type=2,limit_price_offset=10)
  #若当前期权组合均可交易
  if trade1!=0 and trade2!=0 and trade3!=0 and trade4!=0:
    value = 0.8
    context.myacc.SetRiskDegreeMaxThreshold(value)
    isOver = context.myacc.IsRiskDegreeOverMax()
    if C+P>= g.threshold*K:
      if g.close==True:
        if isOver==False:
        #计算最佳下单量
          v1=context.myacc.GetValidVolume(g.code[0],BSType.SellOpen,riselimit1)
          v2=context.myacc.GetValidVolume(g.code[1],BSType.BuyOpen,riselimit2)
          v3=context.myacc.GetValidVolume(g.code[2],BSType.BuyOpen,riselimit3)
          v4=context.myacc.GetValidVolume(g.code[3],BSType.SellOpen,riselimit4)
          v=int(min(v1,v2,v3,v4))
        #卖出低执行价看涨期权
          QuickInsertOrder(context.myacc,g.code[0],'sell','open',price_type,v/4)
        #买入高执行价看涨期权
          QuickInsertOrder(context.myacc,g.code[1],'buy','open',price_type,v/4)
        #买入低执行价看跌期权
          QuickInsertOrder(context.myacc,g.code[2],'buy','open',price_type,v/4)
        #卖出高执行价看跌期权
          QuickInsertOrder(context.myacc,g.code[3],'sell','open',price_type,v/4)
          print "开仓成功"
          g.close=False
    elif C+P<=-g.threshold*K:
      if g.close==True:
        if isOver==False:
        #计算最佳下单量
          v1=context.myacc.GetValidVolume(g.code[0],BSType.BuyOpen,riselimit1)
          v2=context.myacc.GetValidVolume(g.code[1],BSType.SellOpen,riselimit2)
          v3=context.myacc.GetValidVolume(g.code[2],BSType.SellOpen,riselimit3)
          v4=context.myacc.GetValidVolume(g.code[3],BSType.BuyOpen,riselimit4)
          v=int(min(v1,v2,v3,v4))
        #买入低执行价看涨期权
          QuickInsertOrder(context.myacc,g.code[0],'buy','open',price_type,v/4)
        #卖出高执行价看涨期权
          QuickInsertOrder(context.myacc,g.code[1],'sell','open',price_type,v/4)  
        #卖出低执行价看跌期权
          QuickInsertOrder(context.myacc,g.code[2],'sell','open',price_type,v/4)  
        #买入高执行价看跌期权
          QuickInsertOrder(context.myacc,g.code[3],'buy','open',price_type,v/4)  
          print "开仓成功"
          g.close=False
      #当C+P的值在g.threshold*K和-g.threshold*K之间,平掉所有持仓
    else:
      for c in g.code:
        option = PBObj()
        option.contract = c
        pos = context.myacc.GetPositions(option)
        for p in pos:
          if p.bstype.BuySellFlag=="0":
            QuickInsertOrder(context.myacc,c,'sell','close',price_type,p.volume)
          if p.bstype.BuySellFlag=="1":
            QuickInsertOrder(context.myacc,c,'buy','close',price_type,p.volume)
      g.close=True
  #若g.code中期权已到期
  if T==t:
    #平仓掉g.code中的持仓
    for c in g.code:
      option = PBObj()
      option.contract = c
      pos = context.myacc.GetPositions(option)
      for p in pos:
        if p.bstype.BuySellFlag=="0":
          QuickInsertOrder(context.myacc,c,'sell','close',price_type,p.volume)
        if p.bstype.BuySellFlag=="1":
          QuickInsertOrder(context.myacc,c,'buy','close',price_type,p.volume)
        print "到期强制平仓"
    #重新初始化g.code中的交易资产
    last= GetOptionsLastDates('510050.SHSE')
    call_oplist = GetOptionContracts('510050.SHSE',last[-1],0)
    put_oplist=GetOptionContracts('510050.SHSE',last[-1],1)
    UnsubscribeQuote(g.code[0])
    g.code=[call_oplist[0],call_oplist[1],put_oplist[0],put_oplist[1]]
    #print "当前套利期权已到期,重新初始化为"+str(g.code)
    SubscribeQuote(g.code[0])
    g.close=True
    
0 0 vote
Article Rating
Click to rate this post!
[Total: 0 Average: 0]
赞(0) 打赏
未经允许不得转载:A期客 » 期权盒式套利-日线级别量化源代码下载
订阅
提醒
guest
0 评论
Inline Feedbacks
View all comments

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

0
Would love your thoughts, please comment.x
()
x