真格量化学习使用
期权的量化回测
引入必须的库:
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)