真格量化学习

真格量化学习使用

期权的量化回测

引入必须的库:

from PoboAPI import *
import datetime
import time
import numpy as np

初始化参数设定 以50为例

def OnStart(context) :
    print("I\'m starting...")
    #设定一个全局变量品种,本策略交易50ETF期权
    g.code = "510050.SHSE"    #标的代码 
    #订阅实时数据,用于驱动OnQuote事件
    SubscribeQuote(g.code)
    #订阅日线级别K线数据,用于驱动OnBar事件
    SubscribeBar(g.code, BarType.Day)
    #登录交易账号,需在主页用户管理中设置账号,并把回测期权替换成您的账户名称
    context.myacc = None
    if "回测期权" in context.accounts :
        print("登录交易账号[回测期权]")
        if context.accounts["回测期权"].Login() :
            context.myacc = context.accounts["回测期权"]

获取交易合约
方法1:

#自定义函数, 用于获取当月虚值一档的认购和认沽期权            
def Getop(code):
    #获取实时行情
    dyndata = GetQuote(code)
    #获取最新价
    now1 = dyndata.now
    #获取虚值一档价格
    now50 = round(now1,1) + 0.05 #以0.05为单位,具体以期权合约为准
    #获取当前时间
    cutime = GetCurrentTime()
    #获取当月期权到期时间
    #若当前时间处于当月15号之后,则到期月份向后推一个月
    if cutime.day >15 and cutime.month<12:
        tim = cutime.month + 1
        month_time = datetime.datetime(month=tim, year=cutime.year,day = 20)
    #若当前时间处于12.15之后,则取下一年的1.20为到期时间
    elif cutime.day >15 and cutime.month==12:
        tim = 1
        yea = cutime.year + 1
        month_time = datetime.datetime(month=tim, year=yea,day = 20)
    #若当前时间处于上半月,则取当前时间
    else:
        month_time = cutime
    #获取当月虚值一档的认购和认沽期权
    atmopc = GetAtmOptionContract(code,month_time,now50,0)
    atmopp = GetAtmOptionContract(code,month_time,now50,1)
            #返回获取到的认购认沽
    return atmopc,atmopp

方法2:

#每天行情初始化的,获取当前的50etf对应的平值期权
def OnMarketQuotationInitialEx(context, exchange,daynight):
    #过滤掉非上交所的信号
    if exchange != 'SHSE':
        return
    #获取期权标的
    g.biaodi = '510050.SHSE'
    klinedata = GetHisData2(g.biaodi,BarType.Day)
    lastclose = klinedata[-1].close
    #获取当月平价认购期权
    g.atmoc = GetAtmOptionContract(g.biaodi,0,lastclose+0.1,0)
    g.atmop = GetAtmOptionContract(g.biaodi,0,lastclose-0.1,1)
    #订阅日K线用来驱动onbar事件
   
    SubscribeBar(g.atmoc,BarType.Day)

核心是以下公式

atmop = optioncode = GetAtmOptionContractByPos( "ru1906.SHFE", "now", -5, 1, None)

在这里插入图片描述
获得多日标的的数据并处理

g.biaodi = '510050.SHSE'
klinedata = GetHisData2(g.biaodi,BarType.Day,count=60)
#print(klinedata)
#20日均线入场价
MA = GetIndicatorAsDF("MA",g.biaodi,params={
    
    60},bar_type = BarType.Day)
#print(MA.head())
close_20= MA.iloc[-1,4]

如何根据特殊条件选择期权合约

g.atmoc = GetAtmOptionContract(g.biaodi,0,close_20,0) #特定条件下的看涨合约

计算历史波动率

b = CreateCalcObj()
cutime = GetCurrentTime() #获取当前时间
option.EndDate = cutime.date() #获取当前日期
option.Count=30
klinedata = GetHisData(g.code, BarType.Day, option)
klist = []
while i<len(klinedata):
    klist.append(klinedata[i].close)
    i+=1
if len(klist)>0:
    Kl = np.array(klist, dtype=np.double)
c=b.GetVolatility(Kl)

计算隐含波动率
在这里插入图片描述

def stime(op):
    #获取合约信息  
    info1 = GetContractInfo(op)
    #获取该合约的行权到期日
    kill = info1['行权到期日']
    #获取当前时间
    cutime = GetCurrentTime()
    #获取当前时间的日期
    c = cutime.date()
    #计算当前日期与行权到期日相差天数
    n = (kill - c).days
    print(n)
    #返回合约截至到期剩余天数
    return n

dyndata = GetQuote(g.code)
#获取标的最新价
now1 = dyndata.now
#获取合约
opcode1 =  GetAtmOptionContractByPos( g.code, "now", 0, 1, None )
#获取持仓合约的最新价
dyn1 = GetQuote(str(opcode1))
#获取持仓合约的行权价格和到期日
info1 = GetContractInfo(str(opcode1))
pr1 = info1['行权价格']
ki1 = info1['行权到期日']
#计算合约截至目前剩余天数
sy = stime(opcode1)
#计算历史波动率
b = CreateCalcObj()
cutime = GetCurrentTime() #获取当前时间
option.EndDate = cutime.date() #获取当前日期
option.Count=30
klinedata = GetHisData(g.code, BarType.Day, option)
klist = []
while i<len(klinedata):
    klist.append(klinedata[i].close)
    i+=1
if len(klist)>0:
    Kl = np.array(klist, dtype=np.double)
c=b.GetVolatility(Kl)

Imp= b.GetImpliedVolatility(0,1,now1,pr1,c,0.03,sy/365.0,dyn1)

猜你喜欢

转载自blog.csdn.net/qq_26742269/article/details/109514536