如何写策略(python)
一个简单的策略
平台支持您在本地编写策略代码,在策略初始化时先进行数据缓存以提高策略运行效率,缓存的数据是可以与其他投研平台共享的。在成功将数据缓存到本地后,即可实现代码无需提交到平台也可以完整执行策略,保证您策略的私密性。
先来看一个简单的A股买卖策略。主要是体现如何下单的,当没有持仓时就进行买入操作,当有持仓时,就进行卖出平仓操作。更多策略请看策略示例。
from xquant import *
if __name__ == '__main__':
config = {
"user": "SDK-User", # 从客户端管理平台获取(必填)
"token": "SDK-Token", # 从客户端管理平台获取(必填)
"instance_id": "ID", # 从客户端管理平台获取(必填)(仿真交易则选择模拟盘ID)
"login_endpoint": "https -h prx-01.upoem1.com -p 443", # 登录地址(默认)
"initialize": {
"symbols": ["000001.SZ"], # symbols里设置单个股票或者其他有效的标的
#####设置所需k线类型,interval可以选取1分钟,5分钟,15分钟,30分钟,60分钟,日k,count为提前缓存的数目
'bars': [
{
'interval': "1day",
'count': 100,
'match':True
}
],
#####仅回测生效的项(选填)
"backtest": {
"start_date": 20180717, # 回测开始日期
"end_date": 20190721, # 回测结束日期
"back_test_upload_day": 20, #回测结果上传时间间隔(天)
"cash": {
"CS": 10000000, # 设置A股账户初始资金 CF:"期货" HK:"港股"
}
},
######设置手续费
"commission": 0.0002,
}
}
xquant.run_quant(config)
def on_before_market_open(api, date_now):
# 设置今天关注的股票,如果股票池中只有一只股票,则全部关注即可;股票池中股票过多时,需要先选股在设置部分关注以提高运行效率
api.set_focus_symbols(api.get_symbol_pool())
def on_bar(api, bar):
symbol_positions = api.get_symbol_positions() # 获取持仓标的信息
if symbol_positions:
api.target_position(symbol=bar.symbol, qty=0) # 平仓
else:
api.target_position(symbol=bar.symbol, qty=1000) # 市价下单
完整的策略工程
配置config文件(必选)
python 和 C++ 统一使用json格式的配置
以下是配置文件详细说明, python中可以直接把配置写在代码中,方便调试, 正式部署时请使用统一的配置文件,方便维护
config = {
#####登录地址配置
"login_endpoint": "https -h prx-01.upoem1.com -p 443", #登录地址
#####基础数据下载地址(选填)
#"bar_broker": "xxxxxxxxx", #基础数据下载地址
#####用户信息配置
"user": "xxxxxxxxx", # 用户名
"token": "xxxxxxxxx", # token见web端
"instance_id": "xxxxxxxxx", # 策略ID,在web端新建
#####日志配置(选填)
#"console": False,
#"logpath":"xxxxxxxxx", #日志输出目录
#"loglevel": "DEBUG", #日志级别
#####数据下载配置(选填)
#"cache" :"file:://xxx", #数据下载目录
#缓存模式默认为 file://db_cache
#可选模式为 1. 文件模式:file://db_cache 2. 本地全局模式:socket://12306/db_cache2 3. 远程模式: none
"initialize": {
#####标的池设置
# symbol_sets里设置标的集合, 如此处的000300.SH指的就是沪深300的所有标准合约(选填)
# symbols 里设置标的集合
# 注意:symbols和symbol_sets不能全部为空
#"symbol_sets": ["000300.SH"],
"symbols":["601166.SH","000656.SZ"],
#####fields缓存的因子(选填)
#"fields": ["NET_PROFIT", "PB", "PE", "PS", "PE_TTM"],
#k线类型,interval可以选取1min,5min,15min,30min,60min,1day,count为提前缓存的数目,match为是否撮合的k线
'bars': [
{
'interval': '1day',
'count': 100,
'match': True
},
],
#####日内K线回调时间段(选填) 将只在指定时间段以interval周期回调on_bar或on_handle_date ('match'为True有效)
#"match_time_range": [("09:31", "09:32"),("14:40", "14:41")],
#####k线回调模式 group_only:只响应on_handle_data single_only:只响应on_bar both:则两个回调同时响应
"mode": "single_only",
######设置手续费
"commission": 0.0003,
######设置最大下单比例(占资产)
#"order_volume_ratio": 1.0,
#####仅回测生效的项(选填)
"backtest": {
"start_date": 20140717, # 回测开始日期
"end_date": 20140721, # 回测结束日期
"back_test_upload_day": 20, #回测结果上传时间间隔(天)
"cash": {
"CS": 10000000, # 设置A股账户初始资金
"CF": 1000000 # 设置期货账户初始资金
}
},
#####仅模拟盘实盘生效的项
"realtime": {
"before_market_open_time": "08:50", #开盘事件响应时间
"before_market_close_time": "15:55", #收盘事件响应时间(日K回调时间)
"force_before_market_open": 1, #策略启动时响应on_before_market_open
"force_quote_callback": 1, #强制响应on_quote
"group_timeout": 10000, #设置group模式下的组播, 等待多少ms则强制响应, 默认为5000ms
"timer_cycle": 1000 #设置on_timer响应时间(ms),为0则不响应on_timer, 默认情况下不回调on_timer
},
#####仅模拟盘实盘生效的项(设置行情源)
"markets": [
{
"marketname":"CS",
"adaptor":"AccessMarketDataAdaptor",
"endpoint": "tcp -h 124.70.133.149 -t 60000 -p 40003 -e 0"
},
],
#####仅模拟盘实盘生效的项(设置交易源)
"trades":[
{
"endpoint":"tcp -h 124.70.133.149 -t 60000 -p 15154 -e 0", #交易服务地址
"account":"xxxxxxxxx", #资金账号(从柜台获取)
"token": "xxxxxxxxxxxxxxxxxx", #资金账号Token(从柜台获取)
"adaptor":"EventDownAdaptor", #交易服务类型
"initcash":100000, #策略初始资金
"marketname":"CS", #市场类型
}
],
}
}
on_initialize-初始化(可选)
在策略运行前,用来进行初始化各项运行参数,若在config
配置中已设置初始化参数initialize
,则此步骤可省略。
initialize在策略启动后只会调用一次, 在策略运行过程中, 只会拉取相关的数据. 因此在实现策略过程中, 尽量只设置自己需要的数据, 避免拉取太多数据, 这有助于提高策略运行的性能。
函数示例:
def on_initialize(api):
"""
初始化
:param api:
:return:
"""
pass
on_before_market_open-盘前运行(必选)
每个交易日回测/模拟前要做的操作,选标的和进行盘前下单操作,必须实现!
函数示例:
def on_before_market_open(api, date_now):
# 必要:获取当个交易日需关注的股票
# 设置今天关注的股票,如果股票池中只有一只股票,则全部关注即可;股票池中股票过多时,需要先选股在设置部分关注以提高运行效率
api.set_focus_symbols(api.get_symbol_pool())
盘中运行(必选)
根据初始化参数mode来选择响应on_bar
和on_handle_data
,为group_only, 则只响应on_handle_data; 为single_only, 则只响应on_bar; 为both, 则两个回调同时响应 。
on_bar-K线响应回调
创建实例时设置撮合周期,Bar产生时会调用。为了提高效率,只有在关注列表中和有持仓的标的才会响应行情回调。
函数示例:
def on_bar(api, bar):
pass
on_handle_data-数据到齐响应回调
针对某一周期的bar数据,搜集齐后再统一响应回调,time_now为当前周期的时间戳。
函数示例:
def on_handle_data(api, time_now):
pass
on_terminate-运行终止(可选)
回测状态下,系统最后会将回测结果在这里输出,仅回测时响应
函数示例:
#策略终止时响应;回测运行终止时会调用一次, exit_info返回值为终止消息
def on_terminate(api, exit_info):
pass
on_timer-定时器(可选)
仅仿真交易时(模拟盘)响应
函数示例:
def on_timer(api):
pass
on_order_update-订单状态更新回调(可选)
订单状态更新时会响应一次,OrderUpdate为订单详情。
函数示例:
def on_order_update(api, order):
pass
交易函数
set_focus_symbols-设置关注的标的池-盘前
**盘前支持**,只能在on_before_market_open函数中调用,且必须调用。只有在此函数中进行设置的标的和当前持仓的标的才会在on_bar、on_handle_data函数中进行行情响应。若不设置关注的且不在持仓的标的不会在此三个回调事件中响应,并且获取不到该标的当天的K线。 **注:set_focus_symbols 如果多次使用,则只会记录最后一条的设置;前面的设置将会被覆盖**函数原型:
set_focus_symbols(symbols)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbols | list | 是 | 标的列表 |
返回值:无
示例:
def on_before_market_open(api, date_now):
...
api.set_focus_symbols(['000001.SZ'])
...
get_focus_and_position_symbols-获取关注的和持仓的标的
函数原型:
get_focus_and_position_symbols()
参数:无
返回值:标的列表
示例:
def on_before_market_open(api, date_now):
...
api.get_focus_and_position_symbols()
...
target_position-目标仓位数量下单
- 调整标的仓位,即根据需要进行下撤单,无直接操作下单接口
函数原型:
target_position(symbol, qty, price,price_type = "",side='long', remark='')
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | string | 是 | 策略中的标的代码 |
qty | int | 是 | 目标仓位 |
price | double | 是 | 下单价格 |
price_type | string | 否 | 价格类型 支持以下下单模式,可缺省为空, 部成部撤:FAK 当日有效限价单:DAY 立即全部成交否则自动撤销:FOK |
side | string | 否 | 多空方向,支持方向为多/空,默认为多。 多:long 空:short |
remark | string | 否 | 下单原因说明,填写后可以在客户端管理平台展示 |
返回值: orderID 作为对此条下单操作的标识。
示例:
# 以11元限价单买入000001.CS,目标仓位为100股
api.target_position (symbol="000001.SZ", qty=100, price=11)
# 以市价单卖出000001股票至持仓为0,remark里的描述会在web交易信息里体现
api.target_position (symbol="000001.SZ", qty=0, price=11, remark="卖出平仓")
target_percent-按比例下单
函数原型:
target_percent(symbol, percent, price,price_type= "",side='long', remark="")
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | string | 是 | 策略中的标的代码 |
percent | double | 是 | 交易量为占总资产的比例 |
price | double | 是 | 下单价格 |
price_type | string | 否 | 价格类型 支持以下下单模式,可缺省为空, 部成部撤:FAK 当日有效限价单:DAY 立即全部成交否则自动撤销:FOK |
side | string | 否 | 多空方向,支持方向为多/空,默认为多。 多:long 空:short |
remark | string | 否 | 下单原因说明,填写后可以在客户端管理平台展示 |
返回值:类型为str的订单id ,订单id作为对此条下单操作的标识
示例:
# 以11元限价单买入总资产的20%
api.target_position("000001.SZ", 0.2 ,11)
cancel_order-撤单
函数原型:
cancel_order(symbol, side="long", remark="")
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 策略中的标的代码 |
side | str | 否 | 多空方向,支持方向为多/空,默认为多。 多:long 空:short |
remark | str | 否 | 撤单原因说明,填写后可以在客户端管理平台展示 |
示例:
#撤销股票000001.SZ的挂单
api.cancel_order(symbol="000001.SZ", remark="撤销挂单")
#撤销期货rb1901.SHF的空头挂单
api.cancel_order(symbol="rb1901.SHF", side='short')
get_symbol_pool-获取当前标的池所有标的
函数原型:
get_symbol_pool()
参数:无
返回值:返回symbol的list
示例:
# 获取当前标的池中所有的标的(关注的上证50成分股)
[In]:
api.get_symbol_pool()
[Out]:
[600000.SH,600009.SH,600016.SH,600028.SH,600030.SH,600031.SH,600036.SH,600048.SH,600050.SH,600104.SH,600196.SH,600276.SH,600309.SH,600519.SH,600547.SH,600585.SH,600588.SH,600690.SH,600703.SH,600745.SH,
600837.SH,600887.SH,601012.SH,601066.SH,601088.SH,601138.SH,601166.SH,601186.SH,601211.SH,601236.SH,601288.SH,601318.SH,601319.SH,601328.SH,601336.SH,601398.SH,601601.SH,601628.SH,601658.SH,601668.SH,
601688.SH,601816.SH,601818.SH,601857.SH,601888.SH,601988.SH,601989.SH,603160.SH,603259.SH,603993.SH]
get_symbol_position-获取单个标的仓位信息
函数原型:
get_symbol_position(symbol, side='long')
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 标的代码 |
side | str | 否 | 多空方向,支持方向为多/空,默认为多。 多:long 空:short |
返回值:策略的标的持仓-SymbolPosition对象。
示例:
#获取股票000001.CS仓位信息
symbolposition = api.get_symbol_position (symbol="000001.SZ")
#获取期货IF1809.CF多仓的仓位信息
symbolposition = api.get_symbol_position (symbol="IF1809.CFE", side='long')
#获取期货IF1809.CF空仓的仓位信息
symbolposition = api.get_symbol_position (symbol="IF1809.CFE", side='short')
get_symbol_positions-获取所有持仓标的仓位信息
函数原型:
get_symbol_positions()
参数:无
返回值:list结构,元素为策略的标的持仓-SymbolPosition对象。
- SymbolPosition结构体
属性 | 类型 | 说明 |
---|---|---|
position_side | str | 持仓方向。 |
symbol | str | 标的。 |
pos_qty | float | 持仓数量,不包括挂单的仓位。 |
pos_daily_qty | float | 当日开仓的持仓数量,不包括挂单的仓位。 |
pos_price | float | 持仓均价。 |
pos_high | float | 持仓以来最高价。 |
pos_low | float | 持仓以来最低价。 |
pos_time | long | 开仓时间(时间戳)。 |
pos_ur_pnl | float | 仓位总浮动盈亏。 |
available_qty | float | 今日可平仓数量。 |
daily_ur_pnl | float | 今日浮动盈亏,现价-昨收价(结算价-期货),每日结算清零。 |
pos_trade_date | int | 持仓交易日(20170101)。 |
pos_margin | float | 仓位占用保证金。 |
pos_market_value | float | 仓位市值。 |
pos_daily_overall_pnl | float | 当日盈亏 |
示例:
#获取所有标的的仓位信息
positions = api.get_symbol_positions()
get_account-获取标的或者市场所属账户信息
- 获取标的所属账号信息,由于账号获取是异步的,所以下完单立即获取账户数据会有延迟。
函数原型:
get_account(symbol=None, market='CS')
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 否 | 标的代码,可缺省,但不能同时和市场一起缺省,若都不缺省以market为准 |
market | str | 否 | 市场,可选值有A股市场/期货市场/指数市场/港股市场 A股市场:CS 期货市场:CF 指数市场:IDX 港股市场:HK |
返回值:标的所属证券的市场账号信息,Account结构。
- Account结构体
属性 | 类型 | 说明 |
---|---|---|
id | str | 账户 id(userId-market) |
market | str | 市场 |
currency | str | 账户币种(CNY) |
daily_pnl | float | 当天盈亏 - 清算时候清零 |
ur_last_pnl | float | 浮动盈亏 - 按最后价算 |
all_time_pnl | float | 盈亏 |
cash_deposited | float | 存入现金(所有加入的现金) |
cash_available | float | 可用现金 |
cash | float | 现金 |
unit_value | float | 账户基金价值 |
margin | float | 现金分红 |
bonus | float | 持仓占用资金 |
market_value | float | 持仓市值 |
tot_assets | float | 总资产 |
total_commission | float | 总手续费 |
示例:
# 用标的获取A股账号的信息
account = api.get_account(symbol='000001.SZ')
# 用市场获取A股账号的信息
account = api.get_account(market='CS')
# 同时填入标的和市场时,返回通过市场获取的账号信息
account = api.get_account(symbol='000001.SZ', market='CS')
get_overall_position-获取标的汇总仓位
- 由于多个策略可以共享账户资金,因此可能会存在多个策略中都持有某个标的的情况,账户中会将多个策略中标的信息进行汇总。本函数用来获取某个标的在账户中汇总后的仓位信息。
函数原型:
get_overall_position(symbol)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 标的代码 |
返回值:该标的在其所属账户中的总仓位信息,OverallPosition对象结构。
- OverPosition结构体
属性 | 类型 | 说明 |
---|---|---|
account_id | str | 账户ID |
symbol | str | 合约 |
buy_price | float | 加权平均买价(开仓/平仓所有数据加权平均) |
sell_price | float | 加权平均卖价 |
buy_qty | float | 买数量 |
sell_qty | float | 卖数量 |
last_ur_pnl | float | 最后成交价算的盈亏(以OpenPosition计算) |
long_available_qty | float | 多仓可以平仓数量(计算出来) |
short_available_qty | float | 空仓可以平仓数量(计算出来) |
long_qty | float | 多仓数量 |
short_qty | float | 空仓数量 |
long_price | float | 多仓开仓均价 |
short_price | float | 空仓开仓均价 |
long_last_ur_pnl | float | 多仓浮动盈亏 |
short_last_ur_pnl | float | 空仓浮动盈亏 |
long_margin | float | 多仓占用保证金 |
short_margin | float | 空仓占用保证金 |
long_market_value | float | 多仓持仓市值 |
short_market_value | float | 空仓持仓市值 |
示例:
#获取账户下000001.CS的汇总仓位信息
position = api.get_overall_position(symbol="000001.SZ") # 获取000001.CS仓位信息
get_strategy_pnl-获取策略盈亏信息
函数原型:
get_strategy_pnl()
参数:无
返回值:策略盈亏信息,StrategyPnL对象结构
- StrategyPnL结构体
属性 | 类型 | 说明 |
---|---|---|
id | float | 策略ID。 |
overall_pnl | float | 策略盈亏。 |
ur_pnl | float | 策略的浮动盈亏。 |
daily_pnl | float | 策略的当日盈亏=当日浮动盈亏+当日平仓盈亏,结算时清零。 |
total_commission | float | 策略总手续费 |
示例:
# 获取策略盈亏信息
strategy_pnl = api.get_strategy_pnl()
# 获取策略总盈亏字段数据
overall_pnl = strategy_pnl.overall_pnl
交易日期函数
- 交易日期各类接口中参数 trade_date为非必填项,默认为配置文件或客户端管理平台中设置的回测区间内时间
get_trade_day_interval-取交易日间隔数
- 获取某时间区间交易日数,起止时间只能是回测区间内的
函数原型:
get_trade_day_interval(start_date, end_date, symbol)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
start_date | int | 是 | 开始时间,格式为YYYYMMDD |
end_date | int | 是 | 结束时间,格式为YYYYMMDD |
symbol | str | 是 | 标的代码 |
返回值:返回值为交易日数
示例:
# 获取一段时间内的交易日数,包含所传起止日期
[In]:
api.get_trade_day_interval(start_date=20200810, end_date=20200817, symbol='000001.SZ')
[Out]:
6
get_prev_trade_date-取上一个交易日
- 获取上一个交易日期
函数原型:
get_prev_trade_date(trade_date=None, market='CS', symbol=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
trade_date | int | 否 | 交易日,格式为YYYYMMDD |
market | str | 否 | 市场代码,主要有股票CS和期货CF,不填默认返回A股市场的交易日 |
symbol | str | 否 | 标的代码 |
返回值:返回上一交易日的日期
示例:
# 获取当前(20200801)时间上一个交易日
[In]:
api.get_prev_trade_date()
[Out]:
20200731
get_next_trade_date-取下一个交易日
- 获取下一个交易日期
函数原型:
get_next_trade_date(trade_date=None, market='CS', symbol=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
trade_date | int | 否 | 开始时间,格式为YYYYMMDD |
market | str | 否 | 市场代码,主要有股票CS和期货CF,不填默认返回A股市场的交易日 |
symbol | str | 否 | 标的代码 |
返回值:返回下一交易日的日期
示例:
# 获取当前(20200801)时间下一个交易日
[In]:
api.get_next_trade_date()
[Out]:
20200804
get_prev_trade_dates-取前N个交易日
- 获取向前count个交易日的列表
函数原型:
get_prev_trade_dates(trade_date=None, count=1, market='CS')
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
trade_date | int | 否 | 开始时间,格式为YYYYMMDD |
count | int | 是 | 获取交易日个数 |
market | str | 否 | 市场代码,主要有股票CS和期货CF,不填默认返回A股市场的交易日 |
返回值:返回交易日列表
示例:
# 获取当前(20200801)时间前3个交易日
[In]:
api.get_prev_trade_dates(count=3)
[Out]:
[20200729, 20200730, 20200731]
get_next_trade_dates-取后N个交易日
- 获取向后count个交易日的列表
函数原型:
get_next_trade_dates(trade_date=None, count=1, market='CS')
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
trade_date | int | 是 | 开始时间,格式为YYYYMMDD |
count | int | 是 | 获取交易日个数 |
market | str | 否 | 市场代码,主要有股票CS和期货CF,不填默认返回A股市场的交易日 |
返回值:返回交易日列表
示例:
# 获取当前(20200801)时间后3个交易日
[In]:
api.get_next_trade_dates(count=3)
[Out]:
[20200804, 20200805, 20200806]
get_trade_dates-取某时间内交易日
- 指定起止日期,获取某个市场一段时间的交易日期
函数原型:
get_trade_dates(start_date, end_date, market='CS')
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
start_date | int | 是 | 开始时间(含当天),格式为YYYYMMDD |
end_date | int | 是 | 结束时间(含当天),格式为YYYYMMDD |
market | str | 否 | 交易市场,主要有股票CF和期货CF,不填默认返回A股市场的交易日 |
返回值:交易日list,日期格式YYYYMMDD,类型为int
示例:
# 获取一段时间内的交易日期,包含所传起止日期
[In]:
api.get_trade_dates(start_date=20200810, end_date=20200817)
[Out]:
[20200810, 20200811, 20200812, 20200813, 20200814, 20200817]
date_now-取当前交易日
- 获取当前的交易日期。回测情况下是回测历史当天,交易情况下是当前交易日。
函数原型:
date_now()
参数: 无
返回值:返回历史当天的交易日期,期货夜盘默认归为后一交易日
示例:
[In]:
api.date_now()
[Out]:
20200803
time_now-取当前交易时间
- 获取当前的交易时间。回测情况下是回测历史当天,交易情况下是当前交易日。
函数原型:
time_now()
参数: 无
返回值:返回历史当前的时间
示例:
[In]:
api.time_now()
[Out]:
2020-07-31 20:50:00
标的信息函数
- 交易日期各类接口中参数 trade_date为非必填项,默认为配置文件或客户端管理平台中设置的回测时间
get_ref_data-取标的信息
函数原型:
get_ref_data(symbol)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 标的代码 |
返回值:标的基本信息
示例:
[In]:
api.get_ref_data(symbol="000001.SZ")
[Out]:
{ "symbol": "000001.SZ", "market": "CS", "exchange": "SZ", "product_name": "", "currency": "CNY", "lot_size": 100, "name": "平安银行", "tplus": 1, "margin_rate": 1, "short_sellable": _false, "value_per_unit": 1, "price_tick": 0.01, "exchange_symbol": 000001, "is_standard": _true, "trade_market": CS", "list_date": 19910403, "last_trade_date": 0, "min_order_vol": 0 }
get_constituent_symbols-取成分股
- 获取股票指数或者行业板块的成分股数据。获取期货某品种当前可交易的标的数据。详见指数代码说明。
- 获取指数成分股权重数据 :get_table_data-表格类因子数据
函数原型:
get_constituent_symbols(symbol, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 指数代码、板块代码等 |
trade_date | int | 否 | 交易日,形式为YYYYMMDD,支持获取历史成分股信息,不填默认返回当天的数据 |
返回: 返回股票代码的list
示例1:
# 获取上证50成分股
[In]:
api.get_constituent_symbols(symbol='000016.SH')
[Out]:
['600000.SH', '600009.SH', '600016.SH', '600028.SH', '600030.SH', '600031.SH', '600036.SH', '600048.SH', '600050.SH', '600104.SH', '600196.SH', '600276.SH', '600309.SH', '600519.SH', '600547.SH', '600585.SH', '600588.SH', '600690.SH', '600703.SH', '600745.SH', '600837.SH', '600887.SH', '601012.SH', '601066.SH', '601088.SH', '601138.SH', '601166.SH', '601186.SH', '601211.SH', '601236.SH', '601288.SH', '601318.SH', '601319.SH', '601328.SH', '601336.SH', '601398.SH', '601601.SH', '601628.SH', '601658.SH', '601668.SH', '601688.SH', '601816.SH', '601818.SH', '601857.SH', '601888.SH', '601988.SH', '601989.SH', '603160.SH', '603259.SH', '603993.SH']
示例2
# 获取指定某天所有可交易标的
[In]:
api.get_constituent_symbols(symbol='CS.SET', trade_date=20210307)
[Out]:
['000001.SZ', '000002.SZ', '000004.SZ', '000005.SZ', '000006.SZ', '000007.SZ', '000008.SZ', '000009.SZ', '000010.SZ', '000011.SZ', '000012.SZ', '000014.SZ', '000016.SZ', '000017.SZ', '000019.SZ', '000020.SZ', ..., '688698.SH', '688699.SH', '688777.SZ', '688788.SH', '688819.SH', '688981.SH']
get_continuous_symbol-取连续合约标的
- 传入连续合约代码,获取对应的实际的标的代码。期货专用。
函数原型:
get_continuous_symbol(symbol, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 连续合约的代码,包括主力、次主力合约,当月、次月、下季、隔季连续合约 |
trade_date | int | 否 | 指定某个交易日,不填则默认为回测当天。形式为YYYYMMDD |
返回:连续合约对应的期货代码。
示例:
# 获取主力合约在某交易日对应的标准合约
[In]:
api.get_continuous_symbol(symbol='jmZ0.DCE')
[Out]:
jm2009.DCE
get_appointed_symbols-取某合约集合
- 获取指定合约集合,如主力合约集合,次主力合约集合。期货专用。
函数原型:
get_appointed_symbols(mode, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
mode | str | 是 | 指定合约的类型 Z0:主力合约;Z1:次主力合约 M0:当月连续;M1:下月连续;M3:下季连续;M6:隔季连续 |
trade_date | int | 否 | 交易日 ,形式为YYYYMMDD,不填默认返回当天的数据 |
返回: 返回指定合约列表
示例1:
# 获取20200803当天的所有主力合约
[In]:
api.get_appointed_symbols(mode='Z0')
[Out]:
['APZ0.CZC', 'CFZ0.CZC', 'CJZ0.CZC', 'CYZ0.CZC', 'FGZ0.CZC', 'ICZ0.CFE', 'IFZ0.CFE', 'IHZ0.CFE', 'JRZ0.CZC', 'LRZ0.CZC', 'MAZ0.CZC', 'OIZ0.CZC', 'PMZ0.CZC', 'RIZ0.CZC', 'RMZ0.CZC', 'RSZ0.CZC', 'SFZ0.CZC', 'SMZ0.CZC', 'SRZ0.CZC', 'TAZ0.CZC', 'TFZ0.CFE', 'TSZ0.CFE', 'TZ0.CFE', 'URZ0.CZC', 'WHZ0.CZC', 'ZCZ0.CZC', 'aZ0.DCE', 'agZ0.SHF', 'alZ0.SHF', 'auZ0.SHF', 'bZ0.DCE', 'bbZ0.DCE', 'buZ0.SHF', 'cZ0.DCE', 'csZ0.DCE', 'cuZ0.SHF', 'ebZ0.DCE', 'egZ0.DCE', 'fbZ0.DCE', 'fuZ0.SHF', 'hcZ0.SHF', 'iZ0.DCE', 'jZ0.DCE', 'jdZ0.DCE', 'jmZ0.DCE', 'lZ0.DCE', 'mZ0.DCE', 'niZ0.SHF', 'nrZ0.INE', 'pZ0.DCE', 'pbZ0.SHF', 'ppZ0.DCE', 'rbZ0.SHF', 'rrZ0.DCE', 'ruZ0.SHF', 'scZ0.INE', 'snZ0.SHF', 'spZ0.SHF', 'ssZ0.SHF', 'vZ0.DCE', 'wrZ0.SHF', 'yZ0.DCE', 'znZ0.SHF']
示例2:
# 获取当天(20200803)Y1的所有合约
[In]:
api.get_appointed_symbols(mode='Y1')
[Out]:
['eb2101.DCE', 'rr2101.DCE', 'sc2101.INE', 'CY2101.CZC', 'ru2101.SHF', 'ag2101.SHF', 'y2101.DCE', 'zn2101.SHF', 'sp2101.SHF', 'pp2101.DCE', 'CJ2101.CZC', 'al2101.SHF', 'jm2101.DCE', 'fb2101.DCE', 'cu2101.SHF', 'wr2101.SHF', 'v2101.DCE', 'AP2101.CZC', 'rb2101.SHF', 'SF2101.CZC', 'nr2101.INE', 'WH2101.CZC', 'jd2101.DCE', 'hc2101.SHF', 'fu2101.SHF', 'bb2101.DCE', 'bu2101.SHF', 'OI2101.CZC', 'cs2101.DCE', 'c2101.DCE', 'ss2101.SHF', 'pb2101.SHF', 'LR2101.CZC', 'SA2101.CZC', 'a2101.DCE', 'p2101.DCE', 'sn2101.SHF', 'ZC2101.CZC', 'eg2101.DCE', 'b2101.DCE', 'l2101.DCE', 'SM2101.CZC', 'SR2101.CZC', 'TA2101.CZC', 'RI2101.CZC', 'i2101.DCE', 'RM2101.CZC', 'j2101.DCE', 'UR2101.CZC', 'FG2101.CZC', 'MA2101.CZC', 'm2101.DCE', 'PM2101.CZC', 'ni2101.SHF', 'JR2101.CZC', 'CF2101.CZC']
is_suspend-是否停牌
判断标的当日是否停止交易。所传日期若为非交易日则返回True。
如若所传symbol是港股,所传日期是A股的交易日,而不是港股的交易日,返回值是True;
如若所传symbol是A股,所传日期是港股的交易日,而不是A股的交易日,返回值也是True;
函数原型:
is_suspend(symbol, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 策略中标的代码 |
trade_date | int | 否 | 交易日,形式为YYYYMMDD,可以查询历史上的状态,不填默认返回当天的数据 |
返回值:返回True表示停牌,返回False表示未停牌
示例:
# 判断000001.CS在20200803是否停牌
[In]:
api.is_suspend(symbol='000001.SZ')
[Out]:
False
is_ST-是否ST股
- 判断标的当日是否ST股
函数原型:
is_ST(symbol, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 策略中的证券代码 |
trade_date | int | 否 | 交易日,形式为YYYYMMDD,可以查询历史上的状态,不填默认返回当天的数据 |
返回值:返回True表示ST股,返回False表示非ST股
示例:
# 判断000001.CS在20200803是否为ST股
[In]:
api.is_ST(symbol='000001.SZ')
[Out]:
False
is_listed-是否上市
- 判断标的当日是否上市
函数原型:
is_listed(symbol, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str | 是 | 策略中的证券代码 |
trade_date | int | 否 | 交易日,形式为YYYYMMDD,可以查询历史上的状态,不填默认返回当天的数据 |
返回值:返回True表示上市,返回False表示未上市或者已退市
示例:
# 判断000001.CS在20200803是否上市
[In]:
api.is_listed(symbol='000001.SZ')
[Out]:
True
数据函数
get_bars_history-取历史K线数据
- 获取K线数据。模拟盘和实盘在on_handle_data 和 on_bar中获取当天的日K不是全日K线,是开盘时间到所设置的收盘时间的日K。
注意: 调用此api之前需在初始化initialize或者配置文件中设置所需的标的symbols和K线类型,否则可能取不到值。
函数原型:
get_bars_history(symbol, timespan, count=None, price_mode='pre', fields=None, skip_suspended=True)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbol | str(list) | 是 | 标的代码, str形式传单一标或以list形式传多个标的 |
timespan | str | 是 | k线类型,支持的K线类型有日K/一分钟K/五分钟K/十五分钟K/三十分钟K/小时K,对应的参数如下: 日K: 1day 一分钟K:1min 五分钟K:5min 十五分钟:15min 三十分钟:30min 小时K:60min |
count | int | 是 | 获取历史数据条数,超过缓存类型的返回空 |
price_mode | str | 否 | 单symbol取K线时只用设置复权模式: 前复权:pre 后复权:post 不复权:real |
fields | list | 否 | 可以选择的字段详见如下,不填则默认返回全部。 fields: "high", "low", "open", "close", "pre_close", "settle", "pre_settle", "volume", "turnover", "total_volume", "total_turnover", "position" |
skip_suspended | bool | 否 | 是否跳过停牌;True(前值填充),False(Nan值填充) |
返回值:行情数据 ,默认返回DataFrame格式。
示例1:
# 获取单个标的前复权日K线5支
[In]:
api.get_bars_history('000001.SZ', timespan='1day', count=5, price_mode='pre')
[Out]:
symbol trade_date time_stop high low open close \
0 000001.SZ 20191225 2019-12-25 15:00:00 16.56 16.24 16.45 16.30
1 000001.SZ 20191226 2019-12-26 15:00:00 16.48 16.32 16.34 16.47
2 000001.SZ 20191227 2019-12-27 15:00:00 16.93 16.43 16.53 16.63
3 000001.SZ 20191230 2019-12-30 15:00:00 16.63 16.10 16.46 16.57
4 000001.SZ 20191231 2019-12-31 15:00:00 16.63 16.31 16.57 16.45
pre_close settle pre_settle volume turnover total_volume \
0 16.40 0.0 0.0 41491798.0 6.796646e+08 41491798.0
1 16.30 0.0 0.0 37203386.0 6.103818e+08 37203386.0
2 16.47 0.0 0.0 104257472.0 1.741473e+09 104257472.0
3 16.63 0.0 0.0 97697031.0 1.603153e+09 97697031.0
4 16.57 0.0 0.0 70444225.0 1.154704e+09 70444225.0
total_turnover position suspend
0 6.796646e+08 0.0 0
1 6.103818e+08 0.0 0
2 1.741473e+09 0.0 0
3 1.603153e+09 0.0 0
4 1.154704e+09 0.0 0
示例2:
# 获取单个标的不复权5分钟线5支
[In]:
api.get_bars_history('000001.SZ', timespan='5min', count=5, price_mode='real')
[Out]:
symbol trade_date time_stop high low open close \
0 000001.SZ 20200916 2020-09-16 14:40:00 15.44 15.42 15.42 15.44
1 000001.SZ 20200916 2020-09-16 14:45:00 15.45 15.39 15.44 15.40
2 000001.SZ 20200916 2020-09-16 14:50:00 15.42 15.39 15.40 15.40
3 000001.SZ 20200916 2020-09-16 14:55:00 15.43 15.39 15.40 15.42
4 000001.SZ 20200916 2020-09-16 15:00:00 15.44 15.42 15.43 15.44
pre_close settle pre_settle volume turnover total_volume \
0 15.35 0.0 0.0 708868.0 10936144.0 67523720.0
1 15.35 0.0 0.0 1432800.0 22089152.0 68956520.0
2 15.35 0.0 0.0 751573.0 11581648.0 69708093.0
3 15.35 0.0 0.0 1251642.0 19293424.0 70959735.0
4 15.35 0.0 0.0 1281740.0 19786880.0 72241475.0
total_turnover position suspend
0 1.041917e+09 0.0 0
1 1.064006e+09 0.0 0
2 1.075588e+09 0.0 0
3 1.094881e+09 0.0 0
4 1.114668e+09 0.0 0
示例3:
# 获取多个标的指定交易日的5分钟k线,指定返回open与close字段
[In]:
api.get_bars_history(['000001.SH', '600000.SH'], timespan='5min', count=5, fields=['open', 'close'])
[Out]:
trade_date 000001.SZ 600000.SH
close 2020-09-16 14:40:00 20200916 15.44 9.85
2020-09-16 14:45:00 20200916 15.40 9.85
2020-09-16 14:50:00 20200916 15.40 9.85
2020-09-16 14:55:00 20200916 15.42 9.85
2020-09-16 15:00:00 20200916 15.44 9.86
open 2020-09-16 14:40:00 20200916 15.42 9.85
2020-09-16 14:45:00 20200916 15.44 9.85
2020-09-16 14:50:00 20200916 15.40 9.85
2020-09-16 14:55:00 20200916 15.40 9.85
2020-09-16 15:00:00 20200916 15.43 9.85
get_one_field-取单个因子数据
获取股票的基础属性、市值等信息,主要是序列类的因子数据。数据信息详见财务分析因子,财务数据,股东与股本,估值指标,波动率因子
调用此api之前需在初始化initialize中设置相关股票池和所需因子,否则可能取不到字段值
函数原型
get_one_field(field, symbols, start_date=None, end_date=None, count=None, strict=False)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
field | str | 是 | 因子名 |
symbols | list | 是 | 标的 |
start_date | int | 否 | 指定某个交易日,不填则默认其他方式返回 |
end_date | int | 否 | 指定某个交易日,不填则默认为回测上一交易日。形式为YYYYMMDD |
count | int | 否 | 指定从end_date往前count个交易日的时间段 |
strict | bool | 否 | 严格按报告期对齐,仅季频数据有效 |
返回:返回DataFrame格式
示例1:
# 获取多个标的在一段时间内PE
[In]:
api.get_one_field('PE', symbols=['000001.SZ', '600000.SH'], start_date=20190101, end_date=20190110)
[Out]:
trade_date 000001.SZ 600000.SH
0 20190102 6.804619 5.176437
1 20190103 6.871258 5.235139
2 20190104 7.219263 5.315187
3 20190107 7.211859 5.325860
4 20190108 7.152624 5.315187
5 20190109 7.359947 5.331197
6 20190110 7.478416 5.315187
示例2:
# 获取多个标的在20190120前5个交易日NET_PROFIT
[In]:
api.get_one_field('NET_PROFIT', symbols=['000001.SZ', '600000.SH'], end_date=20190120, count=5, strict=False)
[Out]:
trade_date 000001.SZ 600000.SH
0 20190114 2.045600e+10 4.366400e+10
1 20190115 2.045600e+10 4.366400e+10
2 20190116 2.045600e+10 4.366400e+10
3 20190117 2.045600e+10 4.366400e+10
4 20190118 2.045600e+10 4.366400e+10
get_field_one_day-取某天因子数据
获取股票的基础属性、市值等信息,主要是序列类的因子数据。获取股票的基础属性、市值等信息,主要是序列类的因子数据。数据信息详见财务分析因子,财务数据,股东与股本,估值指标,波动率因子
调用此api之前需在初始化initialize中设置相关股票池和所需因子,否则可能取不到字段值
函数原型
get_field_one_day(fields, symbols, trade_date=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fields | list | 是 | 因子名 |
symbols | list | 是 | 标的 |
trade_date | int | 否 | 指定某个交易日 |
返回:返回DataFrame格式
示例:
# 取某一个交易日多个标的多个因子数据
[In]:
api.get_field_one_day(['NET_PROFIT', 'PE'], symbols=['000001.SZ', '600000.SH'])
[Out]:
symbol NET_PROFIT PE
0 000001.SH 2.045600e+10 7.552460
1 000006.SH 5.453400e+08 8.852076
get_field_one_symbol-取单个标的因子数据
获取股票的基础属性、市值等信息,主要是序列类的因子数据。数据信息详见财务分析因子,财务数据,股东与股本,估值指标,波动率因子
调用此api之前需在初始化initialize中设置相关股票池和所需因子,否则可能取不到字段值
函数原型
get_field_one_symbol(fields, symbol, start_date=None, end_date=None, count=None, strict=False)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fields | list | 是 | 因子名 |
symbol | str | 是 | 标的 |
start_date | int | 否 | 指定某个交易日,不填则默认其他方式返回 |
end_date | int | 否 | 指定某个交易日,不填则默认为回测上一交易日。形式为YYYYMMDD |
count | int | 否 | 指定从end_date往前count个交易日的时间段 |
strict | bool | 否 | 严格按报告期对齐,仅季频数据有效 |
返回:返回DataFrame格式
示例1:
# # 按交易日范围取某个标的的多个因子数据
[In]:
api.get_field_one_symbol(['NET_PROFIT', 'REVENUE'], symbol='000001.SZ', start_date=20190101, end_date=20190110)
[Out]:
trade_date NET_PROFIT REVENUE
0 20190102 2.045600e+10 8.666400e+10
1 20190103 2.045600e+10 8.666400e+10
2 20190104 2.045600e+10 8.666400e+10
3 20190107 2.045600e+10 8.666400e+10
4 20190108 2.045600e+10 8.666400e+10
5 20190109 2.045600e+10 8.666400e+10
6 20190110 2.045600e+10 8.666400e+10
示例2:
# 按交易日个数取某个标的的多个因子数据
[In]:
api.get_field_one_symbol(['NET_PROFIT', 'PB'], symbol='000001.SZ', end_date=20190110, count=5)
[Out]:
trade_date PB NET_PROFIT
0 20190104 0.711673 2.045600e+10
1 20190107 0.710943 2.045600e+10
2 20190108 0.705103 2.045600e+10
3 20190109 0.725541 2.045600e+10
4 20190110 0.737220 2.045600e+10
get_table_data-取表格数据
获取表格类型的数据,如期货持仓排名系列数据主力跟踪,申万一级行业指数日K行情数据,指数成分股权重数据等
调用此api之前需在初始化initialize中设置相关股票池和所需因子,否则可能取不到字段值
由于表格类数据的数据量相对较大,因此只提供单标的单因子的数据取用接口
函数原型:
get_table_data(field, symbols, start_date=None, end_date=None, count=None, columns=None)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
symbols | list | 是 | 股票代码 |
field | str | 是 | 因子名 |
start_date | int | 否 | 指定某个交易日,不填则默认其他方式返回 |
end_date | int | 否 | 指定某个交易日,不填则默认为回测上一交易日。形式为YYYYMMDD |
count | int | 是 | 获取基于所传交易日往前推的N条数据(包含所传交易日当天) |
columns | list | 否 | 返回的字段;为空时,默认返回所有列,否则返回指定的列 |
返回:返回DataFrame格式
示例1:
# 获取rb1910.CF期货排名列表
[In]:
api.get_table_data("FUT_SHORT_RANK", "rb1910.SHF", end_date=20190110, count=1)
[Out]:
trade_date symbol volumeDiff volume rank name
0 20190110 rb1910.SHF 4373.0 13860.0 1 方正中期
1 20190110 rb1910.SHF 4287.0 13622.0 2 永安期货
2 20190110 rb1910.SHF -450.0 13612.0 3 国贸期货
3 20190110 rb1910.SHF 639.0 13342.0 4 国泰君安
4 20190110 rb1910.SHF 778.0 11696.0 5 东海期货
5 20190110 rb1910.SHF 275.0 10332.0 6 东证期货
6 20190110 rb1910.SHF -854.0 9313.0 7 海通期货
7 20190110 rb1910.SHF 83.0 9197.0 8 一德期货
8 20190110 rb1910.SHF -437.0 7078.0 9 大地期货
9 20190110 rb1910.SHF 3594.0 6718.0 10 中财期货
10 20190110 rb1910.SHF 172.0 5221.0 11 格林大华
11 20190110 rb1910.SHF -200.0 4652.0 12 南华期货
12 20190110 rb1910.SHF -142.0 4592.0 13 五矿经易
13 20190110 rb1910.SHF -13.0 4307.0 14 国投安信
14 20190110 rb1910.SHF 435.0 4267.0 15 华泰期货
15 20190110 rb1910.SHF -4096.0 4264.0 16 银河期货
16 20190110 rb1910.SHF -1478.0 4207.0 17 中信期货
17 20190110 rb1910.SHF 1.0 3777.0 18 宝城期货
18 20190110 rb1910.SHF 2.0 2955.0 19 鲁证期货
19 20190110 rb1910.SHF 37.0 2824.0 20 光大期货
示例2:
# 获取申万一级行业板块多个交易日的K线数据
[In]:
api.get_table_data("SW_MKT", "801010.PLA", start_date=20190110, end_date=20190115)
[Out]:
trade_date symbol preClose totalVolume totalTurnover close low open high
0 20190110 801010.PLA 2354.51 6.385033e+09 8.653306e+08 2356.07 2339.35 2353.78 2365.80
1 20190111 801010.PLA 2356.07 5.889354e+09 9.345046e+08 2365.73 2346.85 2347.15 2371.81
2 20190114 801010.PLA 2365.73 6.900767e+09 1.047818e+09 2366.05 2364.00 2366.54 2391.36
3 20190115 801010.PLA 2366.05 6.657991e+09 9.268652e+08 2369.36 2335.53 2363.71 2372.83
其他函数
get_dynamic_value-取动态运行参数
- 在客户端管理平台上创建策略时可以预先设置动态参数,在策略中可以通过此接口获取到该策略的动态参数信息。页面上对参数的改动可以立即反映在策略中。
函数原型:
get_dynamic_value(field)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
field | str | 是 | 客户端管理平台设置的参数名称 |
返回值: 参数值。根据预设的参数类型返回值类型。
示例:
# 获取当前策略high参数,需要在客户端端管理平台配置了名称为high的参数
api.get_dynamic_value('high')
get_define_data-取命令行参数
函数原型:
get_define_data(name, default_value, dtype)
参数:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | str | 是 | 命令行传入的名称 |
default_value | dtype | 否 | 默认值为空,类型和dtype一致 |
dtype | type | 是 | 类型,有str、int等 |
示例:
# 在命令行输入如下命令 python main.py --name=xquant --value=20,在策略里可以通过api.get_define_data()获取,形式如下:
[In]:
api.get_define_data(name='name', default_value='myname', dtype=str)
api.get_define_data(name='value', default_value=0, dtype=int)
[Out]:
上一个结果会获取到'xquant'
下一个结果获取到20
为了能动态的调整策略参数,可以通过命令行传入参数值,举例如下:
新建策略文件example.py,通过N条历史K线的收盘价的平均值和当前收盘价作比较进行下单,运行结束后调用on_terminate事件,将结果存储于result.txt文件中,代码如下:
from xquant import *
import time
def on_initialize(api):
print("on_initialize")
#获取命令行参数
api.bar_len = api.get_define_data('bar_len', 10, int)
...
创建一个用于批处理的文件batch.py,代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
# 调参, 来优化策略的参数
n_bar_lenth = [i for i in range(10, 20, 2)]
for l in n_bar_lenth:
args = ' --bar_len=' + str(l)
print args
status = subprocess.call("python strategy.py" + args, shell=True)
#运行会循环bar_len, 动态调整参数, 调用策略, 并在策略中保存最后的结果
通过运行batch.py文件,会循环调用main.py,K线条数分别是10、12、14、16、18,循环运行五次结果会存储在result-x-xxxxxx.obj文件中,通过对比几次运行结果的数据,来选择最优的参数,以上举例仅供参考。
send_custom_message-设置用户消息
- 设置用户自定义运行消息,会显示在界面上的日志中
函数原型:
send_custom_message(msg)
参数:
参数 | 类型 | 说明 |
---|---|---|
msg | str | 内容 |
返回值:无
log-日志输出
函数原型:
log.debug(msg) # DEBUG级别日志
log.info(msg) # INFO级别日志
log.error(msg) # ERROR级别日志
参数:
参数 | 类型 | 说明 |
---|---|---|
msg | str | 日志内容 |
返回值:日志打印的内容
示例:
日志打印的级别与config配置中的"loglevel"级别一一对应,即loglevel为info就调用log.info,loglevel为error就调用log.error输出日志。
api.get_prev_trade_date(trade_date) # 获取上一交易日
api.date_now() # 获取当前交易日
log.info("current tradedate {}, last tradedate {}".format(curr,prev)) # 打印当前交易日和上一交易日
log.info("current tradedate = {} ".format(curr)) # 打印当前交易日
策略打印日志注意事项:
1、尽量不要输出中文,不同的python环境,输出中文后,有可能出现莫名其妙的问题
2、选股、下单等依据数据的关键数据点,要用 log.info 输出日志,这样模拟盘会把日志输出到algo.python_main.log 这个文件里,回测的时候不会输出,因为回测日志级别默认是error,如果回测也想打印日志可以用log.error或者将config中的日志级别改成info(后者会影响回测速度);
3、更重要的数据,可以调用 api.send_custom_msg 把日志信息输出到web平台上,但是这个接口不要调用太多,有性能问题
数据结构
RefData-股票信息
属性 | 类型 | 说明 |
---|---|---|
symbol | str | 标的代码 |
exchange | str | 交易所及自定义类型后缀。SZ-深交所;SH上交所;DCE-大商所;SHFE-上期所;CZCE-郑商所;CFFEX-中金所;PLATE-板块;SET-证券集合 |
market | str | 品种名称。CS-股票;CF-期货;IDX-指数 |
currency | str | 币种 |
lot_size | float | 一手标的的数目 |
name | str | 标的默认名字 |
exchange_symbol | str | 交易所原始symbol名称 |
trade_market | str | 该标的对应的交易市场 |
max_order_vol | int | 最大委托数量 |
min_order_vol | int | 最小委托数量 |
list_date | int | 上市日 |
last_trade_date | int | 最后交易日 |
tplus | int | 成交T+n |
price_tick | float | 标的价格浮动最小单位值 |
is_expired | bool | 否已经过期的标的,比如退市,合约交割完毕 |
short_sellable | bool | 是否可以卖空 |
product_name | str | 品种名称 (期货专属) |
value_per_unit | int | 每单位价值(期货专属) |
margin_rate | float | 担保金比例%(期货专属) |
long_margin_rate | float | 多头担保金 0~1(期货专属) |
short_margin_rate | float | 空头担保金 0~1(期货专属) |
setting_margin_rate | float | 当前合约保证金比例,如何没有设置则以交易所最低为准 0~1(期货专属) |
is_standard | bool | 是否是交易所标准标的, 比如主力合约就不是(量化平台自己算的)(期货专属) |
Bar-K线数据
属性 | 类型 | 说明 |
---|---|---|
symbol | str | 标的代码。 |
trade_date | long | 交易日-年月日,格式为YYYYMMDD |
time_stop | long | bar对应的截止时间戳 (ms) |
timespan | long | K线的时间频率。 |
high | float | 交易日最高价。 |
low | float | 交易日最低价。 |
open | float | 交易日开盘价。 |
close | float | 交易日收盘价。 |
volume | float | KBar成交量。 |
turnover | float | KBar成交额。 |
total_volume | float | 累计成交量。 |
total_turnover | float | 累计成交额。 |
pre_close | float | 昨日收盘价。 |
position | float | 持仓。 |
settle | float | 结算价(期货)。 |
pre_settle | float | 昨结价(期货)。 |
suspended | bool | 无交易期间是否填充的(默认不填充)。 |
timestamp | str | 标准时间。 |
SymbolPosition-策略的标的持仓
某一个策略中某只标的的仓位信息。
属性 | 类型 | 说明 |
---|---|---|
position_side | str | 持仓方向。 |
symbol | str | 标的。 |
pos_qty | float | 持仓数量,不包括挂单的仓位。 |
pos_daily_qty | float | 当日开仓的持仓数量,不包括挂单的仓位。 |
pos_price | float | 持仓均价。 |
pos_high | float | 持仓以来最高价。 |
pos_low | float | 持仓以来最低价。 |
pos_time | long | 开仓时间(时间戳)。 |
pos_ur_pnl | float | 仓位总浮动盈亏。 |
available_qty | float | 今日可平仓数量。 |
daily_ur_pnl | float | 今日浮动盈亏,现价-昨收价(结算价-期货),每日结算清零。 |
pos_trade_date | int | 持仓交易日(20170101)。 |
pos_margin | float | 仓位占用保证金。 |
pos_market_value | float | 仓位市值。 |
pos_daily_overall_pnl | float | 当日盈亏 |
StrategyPnL-策略的盈亏信息
策略的整体盈亏信息。
属性 | 类型 | 说明 |
---|---|---|
id | float | 策略ID。 |
overall_pnl | float | 策略盈亏。 |
ur_pnl | float | 策略的浮动盈亏。 |
daily_pnl | float | 策略的当日盈亏=当日浮动盈亏+当日平仓盈亏,结算时清零。 |
total_commission | float | 策略总手续费 |
OverallPosition-账户的标的持仓
由于多个策略可以共享账户资金,因此可能会存在多个策略中都持有某个标的的情况,账户中会将多个策略中标的信息进行汇总。
属性 | 类型 | 说明 |
---|---|---|
account_id | str | 账户ID。 |
symbol | str | 标的代码。 |
buy_price | float | 加权平均买价。 |
sell_price | float | 加权平均卖价。 |
buy_qty | float | 买数量。 |
sell_qty | float | 卖数量。 |
last_ur_pnl | float | 最后成交价算的盈亏(以OpenPosition计算)。 |
long_available_qty | float | 多仓可以平仓数量(计算出来)。 |
short_available_qty | float | 空仓可以平仓数量(计算出来)。 |
long_qty | float | 多仓数量。 |
short_qty | float | 空仓数量。 |
long_price | float | 多仓开仓均价。 |
short_price | float | 空仓开仓均价。 |
long_last_ur_pnl | float | 多仓浮动盈亏。 |
short_last_ur_pnl | float | 空仓浮动盈亏。 |
long_margin | float | 多仓占用保证金。 |
short_margin | float | 空仓占用保证金。 |
long_market_value | float | 多仓持仓市值。 |
short_market_value | float | 空仓持仓市值。 |
Account-账户信息
属性 | 类型 | 说明 |
---|---|---|
id | str | 账户ID。 |
market | str | 市场。 |
currency | str | 账户币种。 |
daily_pnl | float | 当日盈亏=当日浮动盈亏+当日平仓盈亏,结算时清零。 |
ur_last_pnl | float | 浮动盈亏。 |
all_time_pnl | float | 平仓盈亏。 |
cash_deposited | float | 累积出入金。 |
cash_available | float | 可用现金。 |
cash | float | 现金。 |
unit_value | float | 账户基金价值。 |
margin | float | 现金分红。 |
bonus | float | 持仓占用资金。 |
market_value | float | 持仓市值。 |
tot_assets | float | 总资产。 |
total_commission | float | 总手续费。 |
OrderUpdate-订单更新信息
属性 | 类型 | 说明 |
---|---|---|
symbol | str | 标的代码。 |
side | str | 买卖方向。 |
position_side | str | 订单持仓方向。 |
position_effect | str | 订单开平仓标志。 |
qty | float | 委托量。 |
price | float | 委托价。 |
user_id | str | 用户id。 |
account_id | str | 账户id。 |
created | long | 委托创建日期。 |
id | str | 订单id。 |
trade_date | int | 交易日。 |
strategy_id | str | 所属策略id。 |
portfolio_id | str | 组合id。 |
commission | commission | 手续费。 |
trade_account | str | 交易账号。 |
external_order_id | str | SDK生成的ID-SDK。 |
order_type | str | 订单委托类型,市价或限价单。 |
order_status | str | 订单状态。 |
cum_qty | float | 已成量。 |
avg_px | float | 已成均价。 |
tif | str | 订单时间状态。 |
modified | long | 委托最后修改日期。 |
exec_type | str | 订单执行状态。 |
sub_strategy_name | str | 子策略名称。 |
StrategyExitInfo-策略结束信息
属性 | 类型 | 说明 |
---|---|---|
code | int | 退出代码 |
msg | str | 消息 |
result | BackTestResult | 回测结果 |
BackTestResult-回测最终结果
属性 | 类型 | 说明 |
---|---|---|
back_test_id | str | 回测ID |
annualized_return | float | 年化收益率 |
maximum_drawdown | float | 最大回撤 |
sharpe_ratio | float | 夏普比率 |
standard_annualized_return | float | 基准年化收益率 |
day_count | int | 回测天数 |
volatility | float | 策略波动率 |
strategy_return | float | 策略收益 |
ur_asset | float | 策略资产 |
quote_count | int | 回测行情数 |
cost_time | int | 回测耗时 |
win_ratio | float | 胜率 |
常量
position_side-持仓方向
- 类型str
值 | 说明 |
---|---|
long | 多仓 |
short | 空仓 |
position_effect-订单开平仓标志
- 类型str
值 | 说明 |
---|---|
open | 开仓 |
close | 平仓 |
close_today | 平今仓 |
close_pre | 平昨仓 |
side-买卖方向
- 类型str
值 | 说明 |
---|---|
buy | 买 |
sell | 卖 |
order_type-下单类型
- 类型string
值 | 说明 |
---|---|
1 | 市价单 |
2 | 限价单 |
order_status-订单状态
- 类型str
值 | 说明 |
---|---|
none | 空 |
new | 新单 |
partially_filled | 部分成交 |
filled | 全部成交 |
done_for_day | 今日完结 |
canceled | 撤销 |
replaced | 修改 |
pending_cancel | 正在撤销 |
stopped | 终止 |
rejected | 拒绝 |
suspended | 挂起 |
pending_new | 正在创建 |
calculated | 正在计算 |
expired | 过期 |
accepted_for_bidding | 正在接受交易 |
pending_replace | 正在修改 |
exec_type-订单执行状态
- 类型int
值 | 说明 |
---|---|
1 | 新单 |
2 | 部成 |
3 | 已成 |
4 | 今日完结 |
5 | 撤单 |
6 | 改单 |
7 | 正在撤单 |
8 | 终止 |
9 | 拒单 |
10 | 挂起 |
11 | 报单 |
12 | 正在计算 |
13 | 过期单 |
14 | 正在接受交易 |
15 | 正在改单 |
tif-订单时间状态
- 类型str
值 | 说明 |
---|---|
None | 未指定,如果不指定;则限价单默认为 DAY, 市价单默认为 FAK |
DAY | 订单在交易日内有效 |
FAK | 订单必须立即执行,不能被立即执行的部分将被取消 |
FOK | 订单必须被完全执行或者完全不执行 |
k线类型
- 类型str
值 | 说明 |
---|---|
1day | 日K |
1min | 1分钟K |
5min | 5分钟K |
15min | 15分钟K |
30min | 30分钟K |
60min | 60分钟K |