期权量化学习(3)——找到交易对象
简单来看,登陆账户并了解了账户信息后,我们就可以进行交易了;交易的前提是我们要以行情数据(事件)为基础。
行情初始化事件—OnMarketQuotationInitialEx(context, exchange, daynight)
触发时间,行情初始化时触发,一般夜盘交易所在晚上20点40分左右调用,白盘交易所在早上8点40左右调用。每个交易所的行情初始化是分开的。即每个交易所行情初始化时都会触发该事件。上交所、深交所、中金所因为没有夜盘不会在夜盘初始化时触发。
#每天行情初始化的,获取当前的豆粕期货主力合约作为标的,获取对应的平价期权 def OnMarketQuotationInitialEx(context, exchange,daynight): #过滤掉非大商所的信号 if exchange != 'DCE' or daynight!='night': return
print('登陆交易账户')
参数:
context:上下文信息对象
exchange:行情市场代码,表示此次初始化事件对应的是哪个交易所,交易所代码是全部大写组成,小写的话平台将不与识别
上交所-SHSE、深交所-SZSE、上期所-SHFE、大商所-DCE、郑商所-CZCE、中金所-CFFEX、上海能源中心-INE
daynight:夜盘或者日盘标志,表示此次初始化的是夜盘还是白盘,'night'表示夜盘,会在晚上20点40分左右行情初始化,'day'表示白盘,在早上8点40左右行情初始化
开盘事件OnExchangeOpen(context, accountname, exchangecode, productcode),市场开盘时调用(之前必须先登录账号)
收盘事件OnExchangeClose(context, accountname, exchangecode, productcode),市场收盘时调用(之前必须先登录账号)
#收盘后打印资金情况 def OnExchangeClose(context, accountname, exchangecode, productcode): if exchangecode == 'DCE': print ('收盘啦++++++++++++++++++++++') bal = context.myacc.AccountBalance print('资金余额: ' + str(bal.CashBalance)) print('昨日资金余额: ' + str(bal.CashBalanceYesterday)) print('当日手续费: ' + str(bal.DailyFee)) print('当日盈亏: ' + str(bal.CashBalance - bal.CashBalanceYesterday)) print('浮动盈亏: ' + str(bal.FloatingProfit)) print('可用保证金: ' + str(bal.AvailableMargin)) print('持仓占用保证金: ' + str(bal.FrozenMargin)) print('净资产: ' + str(bal.NetAssets)) print('动态权益: ' + str(bal.DynamicNetAssets)) print('风险度: ' + str(bal.RiskDegree))
品种主力合约—GetMainContract (ExchangeCode, VarietyCode, Type),用于查询某一品种的主力合约
#获取主力合约期权标的 g.biaodi = GetMainContract('DCE', 'm',20) print (g.biaodi)
常见的交易所代码以及品种代码: https://quant.pobo.net.cn/doc?name=api#%E9%99%84%E5%BD%95%E5%9B%9B-%E5%B8%B8%E8%A7%81%E7%9A%84%E4%BA%A4%E6%98%93%E6%89%80%E4%BB%A3%E7%A0%81%E4%BB%A5%E5%8F%8A%E5%93%81%E7%A7%8D%E4%BB%A3%E7%A0%81
查询交易所信息—GetExchangeInfo, 一个词典,包含id对应的交易所信息,字段有:代码、名称、简称
exchange = GetExchangeInfo('DCE') print(exchange)
获取标的K线——GetHisData2 (code, bar_type=BarType.Day, start_date=None, end_date=None, count=None, weight_type=0),
用于获取历史k线数据,其中有等号的参数是可不填的,等号后是默认值,与GetHisData主要区别是在写法上更简便。
klinedata = GetHisData2(g.biaodi, BarType.Day) lastclose = klinedata[-1].close print(lastclose) #收盘价
注意:与GetHisData类似,start_date/end_date/count三个参数只需要填写两个,如果不小心三个都填了,生效的将是start_date和count。
如果不填写,默认是从当前时间向前取1000条。
查询期权合约列表—GetOptionContracts (ObjectStockCode, ExcuteDate, Type,AdjustFlag),用于查询某期权标的对应的期权合约列表
查询期权标的列表—GetOptionObjects (ExchangeId),用于查询某交易所的期权标的列表
#获取期权 g.atmopc = GetAtmOptionContract(g.biaodi,None,lastclose,0) print (g.atmopc)
至此,我们已经找到要交易的对象了。
完整代码如下:
#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import * #开始时间,用于初始化一些参数 def OnStart(context) : context.myacc = None #登录交易账号 if context.accounts["回测期货"].Login() : context.myacc = context.accounts["回测期货"] #每天行情初始化的,获取当前的豆粕期货主力合约作为标的,获取对应的平价期权 def OnMarketQuotationInitialEx(context, exchange,daynight): # 过滤掉非大商所的信号 if exchange != 'DCE' or daynight!='night': return print('登陆交易账户') exchange = GetExchangeInfo('DCE') print(exchange) #获取主力合约期权标的 g.biaodi = GetMainContract('DCE', 'm',20) print (g.biaodi) klinedata = GetHisData2(g.biaodi, BarType.Day) lastclose = klinedata[-1].close print(lastclose) #获取期权 g.atmopc = GetAtmOptionContract(g.biaodi,None,lastclose,0) print (g.atmopc)