期权量化学习(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)

浙公网安备 33010602011771号