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

  

posted @ 2021-04-29 14:44  徐海建  阅读(433)  评论(0编辑  收藏  举报