# 快速开始 # 欢迎使用Auto-Trader Python Toolbox(以下简称atrader) AT提供一系列基于Python实现数据查询,账户信息查询,交易下单,策略回测,实盘交易,止盈止损等功能。atrader使用SDK方式,用户只需要安装atrader,就可以在自己习惯的IDE中进行策略编写 以下内容中带有"▲" 的表示为只能在`策略结构`中使用,**无法在命令行中使用** 如以下的内容无法解决您的问题,可以通过[社区](https://www.digquant.com.cn/forum.php?mod=forumdisplay&fid=3)告诉我们,谢谢 ### atrader 的安装 ### atrader已经成为[PyPI](https://pypi.python.org/)中的项目,安装好Python后,您可以通过在cmd(<font size=2>[如何打开cmd](https://jingyan.baidu.com/article/3aed632e79d388701180916d.html)</font>)中输入`pip install atrader`安装atrader,开始您的Python量化交易之路。<font color=red size=2>注意:目前atrader仅支持64位版本(x64)的Python 3.5x ,Python 3.6x 和 Python 3.7x</font> ### atrader 的使用 ### atrader完全使用SDK的方式,用户使用时可以使用任意的IDE,包括Pycharm,NoteBook,VScode,Sublime等等常用的Python IDE进行Python策略的编写。<font color=red>当您使用atrader时,需要保持Auto-Trader客户端保持打开且正常登陆。</font> ### API的使用结构 ### ![](https://bpstoragenormal.blob.core.chinacloudapi.cn/digquant/api_document/api_document/atrader+Python+API.png) # 快速创建我的策略 # ### 数据事件驱动策略 ### ---------- 以下的代码片段是一个非常典型的数据事件驱动例子,订阅螺纹钢主连,策略每15分钟刷新一次,每次刷新将下单一手螺纹钢 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): # 设置初始资金为100万 set_backtest(initial_cash=1000000) def on_data(context: Context): # 买入开仓,市价委托 order_volume(account_idx=0, target_idx=0, volume=1, side=1, position_effect=1, order_type=2) if __name__ == '__main__': run_backtest(strategy_name='example_test', file_path='数据驱动.py', target_list=['shfe.rb0000'], frequency='min', fre_num=15, begin_date='2018-01-01', end_date='2018-06-30') ``` 整个策略需要4个步骤: 1. 设置初始化 [init函数](#init) 2. 设置数据事件 [on_data函数](#on_data) ,执行下单操作 3. 策略入口 [run_backtest](#run_backtest) 处订阅螺纹钢,并以 15min 的频率进行回测 4. 执行策略 ### 注册时间序列策略 ---------- 在策略初始化执行 [`init 函数`](#init) 时,指定特定频率的数据进行注册,所有策略入口处定义的标的都会准备该频率的数据 [`on_data 函数`](#on_data) 在策略刷新时,可以获得该频率的数据,并且可以请求一定历史长度的数据,构建数据滑窗 以下是一个简单的例子,订阅浦发银行,在 15min 刷新的频率下,注册 1min 频率的数据,并通过 [`get_reg_kdata`](#get_reg_kdata) 调用该数据 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): # 设置初始资金为100万 set_backtest(initial_cash=1000000) # 注册1min的数据 reg_kdata(frequency='min', fre_num=1) def on_data(context: Context): # context.reg_kdata根据注册的先后顺序标记,0代表第一个注册的频率,为1min # 获取 1min 注册的数据,并获取50个最新的1min数据,并以dataframe的形式输出 df_min = get_reg_kdata(reg_idx=context.reg_kdata[0], length=50, df=True) print(df_min) if __name__ == '__main__': run_backtest(strategy_name='example_test', file_path='时间序列.py', target_list=['sse.600000'], frequency='min', fre_num=15, begin_date='2018-01-01', end_date='2018-06-30') ``` 整个策略需要4个步骤: 1. 设置初始化 [init函数](#init) ,注册 1min 的频率 2. 设置数据事件 [on_data函数](#on_data) ,通过 `get_reg_kdata` 调用数据 3. 策略入口 [run_backtest](#run_backtest) 处订阅浦发银行,并以 15min 的频率进行回测 4. 执行策略 ### 多标的多周期策略 ---------- 通过订阅多个标的,注册不同周期的频率数据,可以实现多个标的多个周期的策略框架 以下是一个简单的例子,订阅铁矿石主连和螺纹钢主连,以15min的频率进行刷新,注册 1min 和 1day 频率的数据,在on_data中分别取铁矿石和螺纹钢不同频率,不同长度的数据,构建不同的数据滑窗 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): # 设置初始资金为100万 set_backtest(initial_cash=1000000) # 注册1min的数据 reg_kdata(frequency='min', fre_num=1) # 注册1day的数据 reg_kdata(frequency='day', fre_num=1) def on_data(context: Context): # context.reg_kdata根据注册的先后顺序标记,0代表第一个注册的频率,为1min # 获取第一个标的,即铁矿石主连,50个最新 1min 注册的数据,并以dataframe的形式输出 df_min = get_reg_kdata(reg_idx=context.reg_kdata[0], target_indices=[0], length=50, df=True) # 同时获取铁矿石和螺纹钢,20个最新的1day数据,并以dataframe的形式输出 df_day = get_reg_kdata(reg_idx=context.reg_kdata[1], target_indices=[0, 1], length=20, df=True) print(df_min) print(df_day) if __name__ == '__main__': target_list = ['dce.i0000', 'shfe.rb0000'] run_backtest(strategy_name='example_test', file_path='多标的多周期.py', target_list=target_list, frequency='min', fre_num=15, begin_date='2018-01-01', end_date='2018-06-30') ``` 整个策略需要4个步骤: 1. 设置初始化 [init函数](#init) ,注册 1min 和 1day 的频率 2. 设置数据事件函数 [on_data函数](#on_data) ,通过 [`get_reg_kdata`](#get_reg_kdata) 调用数据,其中不同频率通过 [`context.reg_kdata`](#context.reg_kdata) 以顺序作区分,通过 [`get_reg_kdata`](#get_reg_kdata) 可以指定获取数据的标的以及数据长度 3. 策略入口 [run_backtest](#run_backtest) 处订阅铁矿石和螺纹钢,并以 15min 的频率进行回测 4. 执行策略 ### 使用默认账户进行回测 ---------- 在回测模式中,用户不需要指定账户(也不能使用多个账户)进行回测,所有下单,资金查询等操作都使用索引号为0的账户即可 以下是一个简单的回测例子,入口处无须指定账户,持仓查询,资金查询,下单都用索引号为0的账户 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): # 设置初始资金为100万 set_backtest(initial_cash=1000000) def on_data(context: Context): # 获取账户的持仓情况 positions = context.account(account_idx=0).positions # 获取账户的资金情况 cash = context.account(account_idx=0).cash # 买入开仓,市价委托 order_volume(account_idx=0, target_idx=0, volume=1, side=1, position_effect=1, order_type=2) if __name__ == '__main__': run_backtest(strategy_name='example_test', file_path='使用默认账户回测.py', target_list=['shfe.rb0000'], frequency='min', fre_num=15, begin_date='2018-01-01', end_date='2018-06-30') ``` ### 使用多个账户实时交易 ---------- 若策略需要对多个账户进行交易下单,可以通过下单时,使用不同的索引号进行对指定账户下单 以下是一个简单的多账号下单例子,在策略入口处定义多个账户(通过名称作区分),分别为`'acc_stock'和'acc_future'`,对应的索引号分别为0和1。如在下单或者查询函数中,`account_idx=0` 即对应`'acc_stock'`这个账户 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): pass def on_data(context: Context): # 获取第一个账户‘acc_stock’的持仓情况 positions_0 = context.account(0).positions # 获取第二个账户‘acc_future’的持仓情况 positions_1 = context.account(1).positions # 利用股票账户对浦发银行进行下单,市价委托,买入开仓 order_volume(account_idx=0, target_idx=0, volume=100, side=1, position_effect=1, order_type=2) # 利用期货账户对股指期货下单,市价委托,买入开仓 order_volume(account_idx=1, target_idx=1, volume=1, side=1, position_effect=1, order_type=2) if __name__ == '__main__': target_list = ['sse.600000', 'cffex.if0000'] account_list = ['acc_stock', 'acc_future'] run_realtrade(strategy_name='example_test', file_path='多个账户交易.py', target_list=target_list, account_list=account_list, frequency='min', fre_num=15, begin_date='2018-01-01') ``` 注意: 1. 账户的名称是通过AT客户端的账户管理设置 2. 多个账户交易只有在实时交易中才支持 3. 账户索引号的顺序根据入参时,账户列表的索引号顺序决定,可以在策略结构中通过 [`context.account_list`](#context.account_list) 获取 ### 回测模式和实时模式 ---------- atrder里面策略运行提供两种模式,回测模式(backtest)和实时模式(realtrade),对应两个API,分别是 [run_backtest](#run_backtest) 和 [run_realtrade](#run_realtrade) **回测模式** 回测模式中使用的是系统的默认账户,指定开始时间和结束时间,并且可以[`init`](#init)函数中,通过[` set_backtest `](#set_backtest)设定初始资金,手续费,保证金率等等 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): # 设置初始资金为100万,期货交易手续费为交易所的1.1倍,股票交易手续费为万分之2,保证金率为交易所1.1倍 set_backtest(initial_cash=1000000, future_cost_fee=1.1, stock_cost_fee=2, margin_rate=1.1) def on_data(context: Context): pass if __name__ == '__main__': run_backtest(strategy_name='example_test', file_path='回测模式.py', target_list=['shfe.rb0000'], frequency='min', fre_num=15, begin_date='2018-01-01', end_date='2018-06-30') ``` **实时模式** 实时模式中使用的必须是模拟账户或者实盘账户,模拟账户在AT客户端上可以直接设置,账户根据账户名称进行匹配跟踪,当实时行情被推送,就会执行[` on_data `](#on_data)函数。实时模式不能对手续费等进行设置,按照服务器端设定进行交易。实时模式需要指定开始日期,作为准备数据的时间边界。 ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): pass def on_data(context: Context): pass if __name__ == '__main__': run_realtrade(strategy_name='example_test', file_path='实时模式.py', target_list=['shfe.rb0000'], account_list=['account1'], frequency='min',fre_num=15, begin_date='2018-01-01') ``` ### 提取数据研究 ---------- 如果只想提取数据作研究所用,无需实时数据驱动策略,不用通过策略结构逻辑,在AT运行的前提下,直接使用查询类的函数就可以获取。<font color=red size=2>注意:数据的提取与账户的权限有关</font> ```python from atrader import * data = get_kdata(target_list=['sse.600000'], frequency='day', fre_num=1, begin_date='2018-01-01', end_date='2018-06-30') ``` 整个过程包括两个步骤: 1. 打开AT客户端并正常登陆 2. 调用数据查询函数 ### 构建多因子模型 ---------- atrader里内嵌了大量经过清洗的因子数据(具体见<a href="https://www.digquant.com.cn/d.php?mod=data&action=view&tag=bp_factor" target="_blank">因子介绍</a>),用户可以通过因子名直接调用 以下是一个基本的多因子策略,在[` init `](#init)函数中注册了`'PE','PB','MA10'`三个因子,并在[` on_data `](#on)data中获取注册的因子情况 ```python # *_*coding:utf-8 *_* from atrader import * from atrader.enums import * def init(context: Context): # 注册三个因子,PE,PB,MA10 reg_factor(factor=['PE', 'PB', 'MA10']) def on_data(context: Context): # 获取注册的因子数据 data = get_reg_factor(reg_idx=context.reg_factor[0], df=True) print(data) if __name__ == '__main__': # 获取上证50的成分股 target = get_code_list('sz50') target = list(target['code']) run_backtest(strategy_name='example_test', file_path='构建多因子模型.py', target_list=target, frequency='day', fre_num=1, begin_date='2018-06-01', end_date='2018-06-30') ``` 整个策略需要4个步骤: 1. 设置初始化 [init函数](#init) ,根据<a href="https://www.digquant.com.cn/d.php?mod=data&action=view&tag=bp_factor" target="_blank">因子名称</a>注册因子 2. 设置数据事件 [on_data函数](#on_data) ,通过 get_reg_facotr 获取注册的因子数据 3. 策略入口 [run_backtest](#run_backtest) 订阅上证50指数的成分股,并以 1day 的频率进行回测 4. 执行策略 ### 获取回测完策略的绩效 ### ---------- atrader中提供专门的API,可以让用户在策略回测完后,提取回测绩效报告的字段。提取回测策略的绩效报告需要依赖回测策略的ID,策略回测的ID可以通过两种方式获得: **回测语句完成后返回策略ID** ```python target_list = ['CZCE.FG000', 'SHFE.rb0000'] # 设置回测标的 frequency = 'min' # 设置刷新频率 fre_num = 1 # 设置刷新频率 begin_date = '2017-06-01' # 设置回测初始时间 end_date = '2017-09-01' # 设置回测结束时间 fq = 1 # 设置复权方式 strategy_id = run_backtest('海龟', '海龟.py', target_list=target_list, frequency=frequency, fre_num=fre_num,begin_date=begin_date, end_date=end_date, fq=fq) ``` 代码解析: 1. 通过回测入口函数 [`run_backtest`](#run_backtest) 运行回测后返回策略ID 1. 只有回测完成才会返回策略ID;回测中断,回测发生错误都不会返回策略ID **回测后获取AT里的策略列表** ```python get_strategy_id() ``` 返回 ```python [{'strategy_name': '海龟', 'strategy_id': '6489313123860738085'}] ``` 代码解析: 1.[`get_strategy_id`](#get_strategy_id) 获取的策略ID是当前AT客户端中,策略回测页面存在,并且可以提取绩效报告的策略ID 2.当AT客户端中策略回测中策略的Tab被关闭,或者AT重启后,策略ID失效 3.通过此方式不必依赖策略回测入口函数 [`run_backtest`](#run_backtest) 获取策略ID 4.只有回测成功,回测结束,绩效计算完成的策略才会返回策略ID **通过策略ID获取回测的绩效报告信息字段** 以下代码是通过策略ID获取策略回测报告信息 ```python result = get_performance = ('6488216908083490844') ``` 1.回测完成但是绩效没有计算完毕的策略获取绩效报告字段会返辉空的dict 2.策略ID可以通过上面两种方式获取 # 策略程序框架 # <span id="structure"></span> ## atrader策略结构 ## atrader Python API的**策略结构**包含三个部分: * [策略程序初始化](#策略程序初始化) * [数据处理](#数据处理) * [自建函数](#自建函数) 绝大多数策略只要定义好[策略程序初始化](#策略程序初始化)和[数据处理](#数据处理)两个部分即可实现其逻辑,因此常见的策略代码中,策略结构只有这两部分。有些逻辑比较复杂的策略还会有[自建函数](#自建函数),详见[策略使用用户自建的函数](#高级应用2)。 <font color=red size=2>注意:本文档提及的所有带有“▲”标记的API都只能在策略结构内使用,而不能在Python命令行或者策略结构代码块以外使用。不带有“▲ ”标记的API不受此限制,可在策略结构内外使用。</font> <span id="策略程序初始化"></span> ### 策略程序初始化 ### ---------- 策略程序初始化是指通过 [init函数](#init函数) 初始化策略,每次策略启动时都会先执行初始化的操作,且只会执行一次,通过初始化的操作,可以完成以下的几个操作: **<font size=3>- 定义全局变量</font>** 通过创建 [context](#context) 包含的属性定义全局变量。如 context.m 可以在不同函数之间调用 **<font size=3>- 设定回测细节</font>** 通过 [set_backtest](#set_backtest) 可以设定回测的手续费率,保证金率,滑点以及市价单,限价单成交的位置 **<font size=3>- 注册行情数据</font>** 通过 [reg_kdata](#reg_kdata) 注册指定频率的数据 **<font size=3>- 注册BP因子数据</font>** 通过 [reg_facotr](#reg_factor) 根据BP因子名称注册因子 **<font size=3>- 使用非策略结构里的数据查询函数</font>** 通过[非策略结构数据查询](#数据查询)函数获取历史数据 **<font size=3>- 注册外部数据和自建函数</font>** <font size=2 color=orange>(高阶应用)</font> 通过 [reg_userdata](#reg_userdata) 和 [reg_userindi](#reg_userindi) 实现外部数据和自建函数的注册 <span id="数据处理"></span> ### 数据处理 ### ---------- 数据处理是指根据 [策略入口](#run_backtest) 处指定的 [刷新频率](#刷新频率) 进行策略刷新时,执行的函数,通过 [on_data](#on_data函数) 实现策略主体逻辑,可以完成以下几个操作: **<font size=3>- 获取注册数据</font>** 通过 [获取注册数据](#reg_kdata) 获取注册的行情数据,因子数据,自建函数和外部数据等,加入到策略整体逻辑的构建中 **<font size=3>- 获取账户资金和持仓信息</font>** 通过 [context.account().cash](#cash) 以及 [context.account().position()](#position) 或者 [context.account.positions](#positions) 分别获取账户的资金和持仓信息 **<font size=3>- 下单交易</font>** 通过 [交易函数](#交易函数) 进行下单交易以及订单状况查询 <span id="构建自建函数"></span> ### 自建函数 ### ---------- 构建自建函数和一般策略里调用外部函数不一样,这里构建的自建函数,需要依赖行情数据在不同的回测时间返回不同的结果,通过atrader特有的回测结构,可以让自建函数与注册数据同时在策略初始化阶段准备好,无须在策略刷新运行后再反复调用该函数,从而提升回测速度。<font size=2 color=red>这部分属于高阶应用,普通用户无须使用</font> <span id="策略入口"></span> ## 策略入口 ## ### 策略入口函数 ### ---------- [run_backtest](#run_backtest) 和 [run_realtrade](#run_realtrade) 对应于两种模式的策略入口,分别为回测和实时交易(包括模拟交易和实盘交易)(<font size=2 color=red>实时交易暂不支持</font>),只有在提取数据做研究,不用形成策略回测时不用使用策略入口函数 **<font size=3>- 刷新频率</font>** [刷新频率](#刷新频率) 是atrader策略架构的核心,决定了策略以什么样的频率执行 [on_data](#on_data函数) 函数 ,是控制多品种,多周期策略的时间轴的核心要素 **<font size=3>- 标的资产</font>** 策略入口需要定义需要使用的标的资产,atrader会在策略启动之后,进入策略初始化之前,按照刷新频率将标的资产的行情数据提前准备好,大幅节省回测准备数据的时间 **<font size=3>- 交易账户</font>**<font size=2 color=red>(实时交易专用)</font> 实时交易时,策略入口需要指定需要使用的实时交易账户 ## 重要概念 ## ### code — 标的代码 ---------- atrader中对于交易标的有唯一的识别码 **code** 格式为:**交易所市场代码.标的代码**,如浦发银行的**code**为:`'sse.600000'` **<font size=3>交易所代码</font>** 目前atrader支持6家交易所以及上海国际能源交易中心,代码缩写如下: <font size=2 color=red>注意:市场代码不严格区分大小写</font> |市场中文名| 市场代码| | - | :-: | |上交所| sse| |深交所| szse| |中金所| cffex| |上期所 |shfe| |大商所 |dce| |郑商所 |czce| |上海国际能源交易中心 |ine| **<font size=3>证券标的代码</font>** 交易标的代码只交易所给出的交易标的代码,包括股票、期货、期权、指数、基金、行业等代码。 具体的代码请参考各个交易所给出的证券标的代码定义 ### 运行模式 ---------- 策略运行支持两种模式,实时模式和回测模式<font size=2 color=red>(实时模式暂不支持)</font>,分别对应两个不同API,用户在使用时需要选择 **<font size=3>实时模式</font>**<font size=2 color=red>(实时模式暂不支持)</font> 实时行情服务器推送的实时行情,只在交易时段提供,可以根据账户类型使用模拟账户进行模拟交易,或者使用实盘账户进行真实交易 **<font size=3>回测模式</font>** 注册指定时段,指定交易代码,指定数据类型的行情,行情服务器将按照指定条件全速回放对应的行情数据,适用于策略回测阶段,快速验证策略的绩效是否符合预期。 为了更好完成回测,atrader提供了让回测更细化的设定函数[`set_backtest`](#set_backtest) ,可以对滑点,手续费率,保证金率,初始资金以及限价单市价单的成交方式进行设定,实现更加精准回测,杜绝未来函数。 <span id="context"></span> ### context — 上下文对象 ---------- context是策略运行过程中的上下文对象,该对象将在您的策略中在不同的函数之间传递 context对象里包含了很多系统生成的属性,从此之外,用户也可以根据自己的需求,自定义无限多种属性 <span id="context.account_list"></span> #### context.account_list — 账户列表 获取策略入口处定义的账户名以及账户的类型,<font color=red>回测没有该属性</font>。 **函数原型:** context.account_list **返回值:** |类型|说明| | - | :-: | |dict|账户名和账户类型| **示例** context.account_list **返回** {'Acc1':'股票', 'Acc2':'期货'} <span id="context.target_list"></span> **<font size=3>context.target_list — 获取标的列表</font>** 获取策略入口处定义的标的列表 **函数原型:** context.target_list **返回值:** |类型|说明| | - | :-: | |list(str)|标的代码列表| **示例:** context.target_list **返回:** [‘sse.600000’,’szse.300021’] <span id="context.backtest_setting"></span> #### context.backtest_setting — 获取回测的设定参数 获取回测模式中,通过[` set_backtest `](#set_backtest)设定的回测细节参数情况,<font color=red>实时模式没有该属性</font>. **函数原型:** context.backtest_setting **返回值:** |类型|说明| | :- | :- | |dict|回测设定参数名以及值| **示例:** context.backtest_setting **返回:** ```python {'initial_cash': 1000000,'cost_fee_future': 1.0,'cost_fee_stock': 2.5,'margin_rate': 1.0,'rate': 0.02,'slide_price': 0.0,'price_loc': 1,'deal_type': 0,'limit_type': 0} ``` <span id="context.account"></span> #### context.account — 账户信息 通过这个函数可获取指定账户的资金信息和持仓信息 **函数原型:** context.account(account_idx=0) **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx|int|账户索引号 **返回值:** 返回类型为 [account - 账户对象](#account) **示例:** ```python # 获取索引号为0的账户的资金情况 context.account(account_idx=0).cash ``` **返回值:** |类型|说明| | - | :-: | |dataframe|[资金对象](#cash)| <span id="context.now"></span> **<font size=3>context.now — 当前时间</font>** 实时模式返回当前本地时间, 回测模式返回当前回测时间 **函数原型:** context.now **返回值:** |类型|说明| | :- | :- | |datetime.datetime|当前时间| **示例:** context.now **返回值:** 2018-06-08 13:45:00 <span id="context.reg_kdata"></span> **<font size=3>context.reg_kdata — 记录K线的注册</font>**<font size=2 color=blue>(系统用对象)</font> 由[reg_kdata](#reg_kdata)生成,记录在context当中,记录注册的K线数据频率数据,通过[get_reg_kdata](#get_reg_kdata)获取注册的K线频率时,作为参数之一 **函数原型:** context.reg_kdata **返回值:** |类型|说明| | :- | :- | |ndarray|记录已注册的K线数据,用序列号代表不同的K线频率注册,从0开始| **示例:** ```python def init(context: Context): # 注册行情数据 reg_kdata(frequency='min', fre_num=5) reg_kdata(frequency='day', fre_num=1) def on_data(context: Context): # 获取注册的行情数据 # 索引号0对应reg_kdata的使用顺序,即为5min的注册频率 data0 = get_reg_kdata(reg_idx=reg_kdata[0]) # 索引号1对应reg_kdata的使用顺序,即为1day的注册频率 data = get_reg_kdata(reg_idx=reg_kdata[1]) ``` <span id="context.reg_factor"></span> #### context.reg_factor — 记录因子的注册 与`context.reg_kdata`类似 <span id="context.reg_userindi"></span> #### context.reg_userindi — 记录用户自建函数的注册 与`context.reg_kdata`类似,具体使用见[高级使用](#高级应用2) <span id="context.reg_userdata"></span> #### context.reg_userdata — 记录用户外部数据的注册 与`context.reg_kdata`类似,具体使用见[高级使用](#高级应用1) ## 重要参数 ## <span id="刷新频率"></span> ### 策略刷新频率和K线注册频率 ### ---------- atrader在数据处理上面提供了完全开放的时间序列处理方式,基于自主研发的数据处理框架,让用户在处理多周期、多标的时更加清晰,也让策略内跟踪止盈止损更加方便和直接。因此在atrader的策略框架里,形成了两个K线数据的频率,分别为<font color=red>**策略刷新频率**</font>和<font color=red>**K线注册频率**</font> **<font size=3>策略刷新频率</font>** 在回测模式的入口函数[`run_backtest`](#run_backtest)以及实时模式的入口函数 [`run_realtrade`](#run_realtrade) <font size=2 color=red>(实时模式暂不支持)</font>中, 函数中的参数`frequency`和`fre_num`,代表的是策略的刷新频率。其实际含义是策略程序触发的频率,策略程序在接收到刷新数据设定的频率数据之后,就会启动策略逻辑。 **示例:** ```python # 按照15分钟的频率运行回测 run_backtest(strategy_name='example_test', file_path='test.py', target_list=target, frequency='min', fre_num=15, begin_date='2018-06-01', end_date='2018-06-30') ``` **<font size=3>K线注册频率</font>** K线数据注册是指用户通过函数[`reg_kdata`](#reg_kdata)实现的操作,这里注册的数据频率可以让用户在策略中通过[`get_reg_kata`](#get_reg_kdata)获取已经注册的K线频率,构建数据滑窗,加入到策略逻辑中,用于生成策略信号 **示例:** ```python # 行情注册,15分钟的K线和日的K线 reg_kdata(frequency='min', fre_num=5) reg_kdata(frequency='day', fre_num=1) ``` **<font size=3>策略刷新频率和K线注册频率的规则对比</font>** 在atrader的极速回测框架中,策略刷新频率和K线注册频率两者之间存在着一定的关联,K线注册的数据是依赖于策略刷新频率的数据合成的,所以两者的频率有一定的规则要求。总结为<font color=red>K线注册频率不能高于策略刷新频率</font> 1. 频率的高低定义的规则为,tick数据频率最高,min次之,然后是day,week和month 2. 该规则只适用于频率,和频数无关,即1min的数据和5min的数据同属于min频率的数据,不受这个规则影响 |策略刷新频率 |K线注册频率 |是否合法| | - | :-: |:-:| |1 min |5 min |√| |1 min |1 day |√| |5 min |1 min |√| |30 min |1 day |√| |1 day |1 min |x| |1 day |60 min |x| |1 day |1 day |√| ### account_idx — 账户句柄索引 常出现在[账户资金查询](#context.account),[账户持仓查询](#context.account),[交易下单](#交易函数)以及[止盈止损](#止盈止损)的操作中,作为函数参数,代表使用那个账户进行交易的索引号,其索引号和入口函数中account_list的顺序有关。 <font size=2 color=red>其中,回测模式不需要指定账户,使用系统默认的回测账户,所以其索引号都为0</font> **示例:** ```python # 获取索引号为0的账户的资金情况 cash = context.account(account_idx=0).cash ``` ### target_idx和target_indi — 标的资产索引 ---------- 适用于策略结构中,常出现在[获取注册K线数据](#get_reg_kdata),[获取注册因子数据](#get_reg_factor),[交易下单](#交易函数),以及[仓位信息查询](#context.account)中,其索引号和入口函数中target_list的顺序有关。 target_idx表示只接受单个标的索引号,target_indi表示接受以list或者tuple的方式以多个标的入参。 **示例:** ```python # 获取索引号为0的标的持仓情况 context.account().position(target_idx=0) # 获取标的索引号为0,1,2的K线注册数据 data0 = get_reg_kdata(reg_idx=context.reg_kdata[0], target_indi=[0, 1, 2]) ``` ## 交易数据对象 ## 在atrader中,交易类数据分为以下几个对象: - account - 账户对象 - cash - 资金对象 - position - 持仓对象(只记录当前有持仓的标的) - positions - 全部持仓对象(针对入口定义的标的记录) - order - 委托对象 - execution - 成交对象 - orderstop - 止盈止损对象 <span id="account"></span> ### account - 账户对象 ---------- |属性|类型|说明| |:-|:-|:-| |name| str|账户名称,回测账户的名称为‘default’| |account_idx| int |context.account_list里的账户索引,回测账户为0| |account_type| int |账户类型,取值参考[ACCOUNT_TYPE](#ACCOUNT_TYPE),回测账户为None| |cash| dataframe |[资金对象](#cash)| |position(target_idx='',side=0)| dataframe |[持仓对象](#position),默认全部持仓,[side](#POSITIONSIDE)可以缩小搜索范围,若当前没有持仓,则返回None| |positions| dataframe |[全部持仓对象](#positions)| <span id="cash"></span> ### cash - 资金对象 ---------- |属性|类型|说明| |:-|:-|:-| |currency |str |计价货币 |valid_cash |float |可用资金 |available_cash |float |可取资金 |market_value|float |持仓市值 |margin |float |持仓占用保证金 |order_frozen |float |下单冻结 |total_asset |float |总资产(轧差计算) |total_value |float |动态市值权益 |holding_pnl |float |持仓盈亏 |realized_pnl |float |平仓盈亏 |daily_pnl |float| 当日盈亏 |daily_cost| float |当日手续费 |cum_cashflow |float |累计出入金 |last_amount |float |上一笔交易的交易金额 |last_realized_pnl |float| 上一笔的平仓盈亏 |last_cost |float |上一笔的手续费 |last_cash_flow|float |上一次的出入金金额 |change_reason |int |资金变动原因,取值参考[CASHCHANGREASON](#CASHCHANGREASON) <span id="position"></span> ### position - 持仓对象 ---------- position对象只记录当前有持仓的标的,若当前没有持仓,则为None |属性|类型|说明| |:-|:-|:-| |account_name |str| 账户名称 |account_idx |int |账户索引号,见[context.account_list](#context.account_list) |code |str |标的代码 |target_idx |int |标的索引号,见[context.target_list](#context.target_list) |side |int |持仓方向,取值参考[POSITIONSIDE](#POSITIONSIDE) |volume |int |总持仓数量 |volume_today |int |今开仓数量 |fpnl |float |持仓浮动盈亏 |zpnl |float |逐笔盈亏 |holding_cost |float |持仓均价 |cost |float |开仓均价 |amount |float |持仓金额 `volume * holding_cost * 合约乘数` |holding_value |float |持仓市值 `volume * price * 合约乘数` |available |int |可平仓位数量 |available_today |int |可平今仓位数量 |price |float |当前价格 |created |datetime.datetime |建仓时间 |updated |datetime.datetime |最近仓位变更时间 |order_frozen |int |挂单冻结仓位数量 |order_frozen_today |int |挂单冻结今仓仓位数量 |margin |float |占用保证金金额 |change_reason |int |最近一次仓位变动原因,取值参考[POSITIONCHANGEREASON](#POSITIONCHANGEREASON) <span id="positions"></span> ### positions - 全部标的持仓对象 ---------- positions对象,会根据策略入口定义的标的显示所有标的的持仓情况 |属性|类型|说明| |:-|:-|:-| |account_name |str |账户名称 |account_idx |int |账户索引号,见[context.account_list](#context.account_list) |code |str |标的代码 |target_idx |int |标的索引号,见[context.target_list](#context.target_list) |volume_long |int |多头总持仓数量 |volume_short |int |空头总持仓数量 |volume_today_long |int |多头今开仓位数量 |volume_today_short |int |空头今开仓位数量 |fpnl _long |float |多头持仓的浮动盈亏 |fpnl_ short |float |空头持仓的浮动盈亏 |zpnl _long |float |多头持仓的逐笔盈亏 |zpnl _short |float |空头持仓的逐笔盈亏 |holding_cost_long |float |多头持仓均价 |holding_cost_short |float |空头持仓均价 |cost_long |float |多头开仓均价 |cost_short |float |空头开仓均价 |amount_long |float |多头持仓金额 `volume_long * holding_cost_long * 合约乘数` |amount_short |float |空头持仓金额 `volume_short * holding_cost_short * 合约乘数` |holding_value_long |float |多头持仓市值 `volume_long * price * 合约乘数` |holding_value_short |float |空头持仓市值 `volume_short * price * 合约乘数` |available_long |int |多头可平仓位数量 |available_short |int |空头可平仓位数量 |available_today_long |int |多头可平今仓位数量 |available_today_short |int |空头可平今仓位数量 |price |float |当前价格 |created_long |datetime.datetime |多头首次建仓时间,没有仓位则为NaT |created_short |datetime.datetime |空头建仓时间,没有仓位则为NaT |updated |datetime.datetime |最近仓位变更时间,没有仓位则为NaT |order_frozen_long |int |多头挂单冻结仓位数量 |order_frozen_short |int |空头挂单冻结仓位数量 |order_frozen_today_long |int |多头挂单冻结今仓仓位数量 |order_frozen_today_short |int |空头挂单冻结今仓仓位数量 |margin_long |float |多头持仓占用保证金金额 |margin_short |float |空头持仓占用保证金金额 |change_reason |int |最近一次仓位变动原因,取值参考[POSITIONCHANGEREASON](#POSITIONCHANGEREASON) <span id="order"></span> ### order - 委托对象 ---------- |属性|类型|说明| |:-|:-|:-| |account_name |str |账户名称 |account_idx |int |账户索引号,见[context.account_list](#context.account_list) |order_id |int |委托单ID |order_id_broker |int |柜台返回的委托单id,回测时为None |code |str |标的代码 |target_idx |str |标的索引号,见[context.target_list](#context.target_list) |side |int |买卖方向取值参考[ORDERSIDE](#ORDERSIDE) |position_effect |int |开平标志,取值参考[ORDERPOSITIONEFFECT](#ORDERPOSITIONEFFECT) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |source |int |委托来源,取值参考[ORDERSOURCE](#ORDERSOURCE) |status |int |委托状态,取值参考[ORDERSTATUS](#ORDERSTATUS) |rej_reason |int |委托拒绝原因,取值参考[ORDERREJREASON](#ORDERREJREASON) |price |float |委托价格 |volume |int |委托数量 |value |float |委托金额 |filled_volume |int |已成交的数量 |filled_average |float |已成交的均价 |filled_amount |float |已成交的金额,`filled_average * filled_volume * 合约乘数 * 保证金率` |created |datetime.datetime |委托单生成的时间 |updated |datetime.datetime |最近订单状态更新的时间 <span id="execution"></span> ### execution - 成交对象 ---------- |属性|类型|说明| |:-|:-|:-| |account_name |str |账户名称 |account_idx |int |账户索引号,见[context.account_list](#context.account_list) |order_id |int |委托单ID |order_id_broker |int |柜台返回的委托单id,回测时为None |trade_id |int |成交单ID |code |str |标的代码 |target_idx |int |标的索引号,见[context.target_list](#context.target_list) |position_effect |int |开平标志,取值参考[EXECUTIONPOSITIONEFFECT](#EXECUTIONPOSITIONEFFECT) |side |int |买卖方向,取值参考[EXECUTIONSIDE](#EXECUTIONSIDE) |price |float |委托成交价格 |volume |int |委托成交量 |amount |float |委托金额 |created |datetime.datetime |成交创建时间 <span id="order_stop"></span> ### orderstop - 止盈止损对象 ---------- |属性|类型|说明| |:-|:-|:-| |account_name |str| 账户名称 |account_idx |int |账户索引号,见[context.account_list](#context.target_list) |stop_order_id |int |止盈止损单ID |code |str |标的代码 |order_id |int |订单ID,止盈止损单触发形成委托单ID |target_idx |int |标的索引号,见[context.target_list](#context.target_list) |target_order_id |int |标的订单的委托ID |stop_point |float |止损止盈的距离 ,`目标订单的成交价-trigger_price` |execute_status |int |执行状态,取值参考[ORDERSTOPEXECTYPE](#ORDERSTOPEXECTYPE) |trigger_price |float |触发价 |open |float |开仓价 |stop_type |int |止盈止损单类型,取值参考[ORDERSTOP_STOP_TYPE](#ORDERSTOP_STOP_TYPE) |trailing_price |float |追踪价 |trailing_point |float |追踪点差 |trailing_high |float |追踪最高价 |trailing_low |float |追踪最低价 |created_time |datetime.datetime |创建时间 |trigger_time |datetime.datetime |触发时间 # API介绍 # ## 基本函数 ## <span id="init函数"></span> ### init - 策略初始化函数 ### ---------- 初始化策略,在策略启动后会自动执行。在这里可以完成以下的操作: 1. 数据注册。包括行情数据,因子数据,用户自建函数,以及用户数据的注册(<font color=orange size=2>用户自建函数和用户数据,见[高级应用])</font> 2. 全局变量的定义。在策略中需要使用的参数,在init函数里定义 3. 回测细节设定 4. 历史数据查询。init函数里支持用户使用普通的历史数据查询API **函数原型:** init(context) **参数:** |参数名|类型|说明 |:-|:-|:-| |context|[context对象](#context)|上下文对象 **示例:** ```python def init(context): # 注册5分钟行情 reg_kdata(frequency='min',fre_num=5') # 注册15分钟行情 reg_kdata(frequency='min',fre_num=15') # 注册BP因子'PE' reg_factor(factor=['PE']) # 获取浦发银行的K线数据 context.pfyh = get_kdata(code='SSE.600000',frequency='min',fre_num=5, begin_date='2018-03-01',end_date='2018-04-30') # 自定义两个变量 context.m = 10 context.n = 20 ``` **注意:** 1. <font color=red size=3>` init 函数 `</font>里不能执行下单等交易函数 2. <font color=red size=3>` init 函数 `</font>不能设置返回值 <span id="on_data函数"></span> ### on_data - 事件推送事件 ### ---------- **函数原型:** on_data(context) **参数:** |参数名|类型|说明 |:-|:-|:-| |context|[context对象](#context)|上下文对象 **示例:** ```python def on_data(context: Context): # 获取注册的行情数据 # 索引号0对应reg_kdata的使用顺序,即为5min的注册频率 data0 = get_reg_kdata(reg_idx=context.reg_kdata[0]) print('data0如下', data0) # 获取账户的资金情况 cash = context.account(account_idx=0).cash print('cash如下', cash) # 下单操作 order_volume(0, 0, 1, 1, 1, 2) ``` **输出:** ```python {0: target_idx time open high low close volume amount open_interest 0 0 2018-01-02 09:01:00 3801 3809 3798 3800 73946 2.8121e+09 2.5278e+06} currency valid_cash available_cash market_value margin order_frozen total_asset total_value holding_pnl realized_pnl daily_pnl daily_cost cum_cashflow last_amount last_realized_pnl last_cost last_cash_flow change_reason CNY 1e+07 0 0 0 0 1e+07 1e+07 0 0 0 0 0 0 0 0 0 0 ``` **注意:** 1. <font color=red size=3>` on_data 函数 `</font>不能执行注册数据的命令 2. <font color=red size=3>` on_data 函数 `</font>会根据[策略入口](#run_backtest)处定义的<font color=red size=3>` target_list `</font>和<font color=red size=3>` frequency `</font>以及<font color=red size=3>` fre_num `</font>,决定以怎样的频率来执行 on_data 函数 <span id="run_backtest"></span> ### run_backtest - 策略回测入口函数 ### ---------- **函数原型:** run_backtest(strategy_name='', file_path='', target_list=(), frequency='day', fre_num=1, begin_date='', end_date='', fq=0) **参数:** |参数名|类型|说明 |:-|:-|:-| |strategy_name|str|策略名 |file_path|str|策略文件路径 |target_list|tuple or list|标的资产列表 |frequency|str|策略刷新频率,仅支持以下频率:'min','day','week','month',默认为'day' |fre_num|int|策略刷新频数,仅支持如下规则:'day','week','month'仅支持1,默认为1 |begin_date|str or datetime.datetime|回测开始日期,使用'yyyy-mm-dd'格式,或者%Y-%m-%d格式 |end_date|str or datetime.datetime|回测结束日期,使用'yyyy-mm-dd'格式,或者%Y-%m-%d格式 |fq|int|复权类型,取值参考[FQ](#FQ),默认为不复权 **示例:** ```python run_backtest(strategy_name='example_test', file_path='test.py', target_list=['sse.600000'], frequency='min',fre_num=15, begin_date='2018-06-01', end_date='2018-10-19') ``` **注意:** 1. <font color=red size=3>` strategy_name `</font>会出现在AT的回测页面中,用于方便用户对不同策略进行区分 2. <font color=red size=3>` file_path `</font> 指具体运行的策略文件的具体路径,需要带文件的后缀名,如策略文件名为test,则需要填写为test.py 3. 回测模式中不需要指定账户,回测账户支持混合品种(股票和期货)的交易和绩效分析 <span id="run_realtrade"></span> ### run_realtrade - 实时模式入口### ---------- **函数原型:** run_realtrade(strategy_name='', file_path='', account_list=(), target_list=(), frequency='min', fre_num=1, begin_date='', fq=0) **参数:** |参数名|类型|说明 |:-|:-|:-| |strategy_name|str|策略名 |file_path|str|策略文件路径 |account_list|tuple or list|标的资产列表 |target_list|tuple or list|标的资产列表 |frequency|str|策略刷新频率,仅支持以下频率:'min','day',默认为'min' |fre_num|int|策略刷新频数,仅支持如下规则:'day'仅支持1,默认为1 |begin_date|str or datetime.datetime|准备数据的开始日期,使用'yyyy-mm-dd'格式,或者%Y-%m-%d格式 |fq|int|复权类型,取值参考[FQ][FQ](#FQ),默认为不复权 **示例:** ```python run_realtrade(strategy_name='example_test', file_path='test.py', account_list=('account_1'), target_list=('sse.600000'), frequency='min', fre_num=1, begin_date='2018-09-01', fq=0) ``` **注意:** 1. <font color=red size=3>` strategy_name `</font>会出现在AT的实时交易的页面中,用于方便用户对不同策略进行区分 2. <font color=red size=3>` file_path `</font> 指具体运行的策略文件的具体路径,需要带文件的后缀名,如策略文件名为test,则需要填写为test.py 3. 实时模式中必须要指定账户,账户的添加在AT的账户管理中完成,通过账户名作为区分 ## 回测设定 ## <span id="set_backtest"></span> ### set_backtest - 回测细节设定 ### ---------- (在init函数中使用)设置回测的细节 **函数原型:** set_backtest(initial_cash=1000000, future_cost_fee=1.0, stock_cost_fee=2.5, margin_rate=1.0, slide_price=0.0, price_loc=1, deal_type=0, limit_type=0) **参数:** |参数名|类型|说明 |:-|:-|:-| |inintial_cash|int|初始资金,默认为10000000 |future_cost_fee|float|期货手续费倍数,默认1.0 |stock_cost_fee |float|股票手续费(单位:万分之),默认2.5,即万分之2.5 |margin_rate|float|保证金倍数,默认1.0 |slice_price|float|滑点百分比,0.01表示滑点为1% |price_loc|int|市价单成交位置,默认为1,0- 当前bar收盘价;1-下一个bar开盘价;2-下一个bar第二个tick;n-下一个bar第n个tick |deal_type|int|市价单成交类型,默认为0,0-成交;1-对方最优价;2-己方最优价 |limit_type|int|限价单成交方式,默认为0,0-直接成交;1-下一个bar内没有该价格时,撤单处理 **返回值:** None **示例:** ```python set_backtest(initial_cash=1000000, future_cost_fee=1.0, stock_cost_fee=2.5, margin_rate=1.0, slide_price=0.0, price_loc=1, deal_type=0, limit_type=0) ``` **注意:** 1. <font color=red size=3>` future_cost_fee `</font>针对的倍数是普通期货账户的手续费率而言,该数字不能小于0.0 2. <font color=red size=3>` stock_cost_fee `</font>是直接的费率 3. <font color=red size=3>` margin_rate `</font>保证金倍数,针对的是普通期货账户的保证金率而言,该数字不能小于0.0 4. <font color=red size=3>` slice_price `</font>滑点百分比,表示成交的价格,会往不利的方向变动的百分比 ## 数据注册 ## <span id="reg_kdata"></span> ### reg_kdata - 行情数据注册 ### ---------- (在init函数中使用)注册一定频率的K线数据 **函数原型:** reg_kdata(frequency='',fre_num=0,adjust=False) **参数:** |参数名|类型|说明 |:-|:-|:-| |frequency|str|数据注册频率,仅支持以下频率:'day','min','week','month' |fre_num|int|数据注册频数,其中'day','week','month'仅支持1 |adjust |bool|是否同时注册主力合约调整数据,默认为False,True为注册;False为不注册 **返回值:** None **示例:** ```python # 注册5min的行情数据,并注册主力合约调整的数据 reg_kdata(frequency='min', fre_num=5, adjust=True) # 注册1day的行情数据 reg_kdata(frequency='day', fre_num=1) ``` **注意:** 1. 允许在<font color=red size=3>` init函数 `</font>中使用多次<font color=red size=3>` reg_kdata `</font>注册多种频率的K线数据 2. <font color=red size=3>` reg_kdata `</font>注册的记录,会保存在 [context.reg_kdata](#context.reg_kdata) 中。调用时,根据注册语句的先后,记录对应注册的频率;调用时,按索引号,从0开始 3. 获取注册的数据,通过[ get_reg_kdata ](#get_reg_kdata)获取 4. <font color=red size=3>` adjust `</font>为True时,表示会同时期货主力合约换月调整后的数据,此参数,对股票数据没有影响。通过 [get_reg_kdata_adj](#get_reg_kdata_adj) 获取注册的期货主力合约换月调整后的数据 <span id="reg_factor"></span> ### reg_factor - 因子数据注册 ### ---------- (在init函数中使用)注册BPfactor **函数原型:** reg_factor(factor=[]) **参数:** |参数名|类型|说明 |:-|:-|:-| |factor|list|因子名称列表,每个因子以字符串表示,因子名称见[BP因子] **返回值:** None **示例:** ```python # 注册PE,PB和MA10这三个因子 reg_factor(['PE', 'PB', 'MA10']) ``` **注意:** 1. 允许在<font color=red size=3>` init函数 `</font>中使用多次<font color=red size=3>` reg_factor `</font>注册多个因子,也允许在一个<font color=red size=3>` reg_factor `</font>语句中,输入多个因子名注册 2. <font color=red size=3>` reg_factor `</font>注册的记录,会保存在 [context.reg_factor](#context.reg_factor) 中。调用时,根据注册语句的先后,记录对应注册的频率;调用时,按索引号,从0开始 3. 获取注册的数据,通过[ get_reg_factor ](#get_reg_factor)获取 4. BP因子都是未经极值化,中性化,标准化处理的原始数据,用户需要构建多因子策略时,可以根据实际策略情况,对因子加工处理 <span id="reg_userdata"></span> ### reg_userdata - 用户外部数据注册 ### ---------- (在init函数中使用)注册用户外部数据,加入到回测的时间序列中 **函数原型:** reg_userdata(time_line, data) **参数:** |参数名|类型|说明 |:-|:-|:-| |time_line|tuple or list|时间点,时间点以str或者datetime.datetime记录 |data |tuple or list| 时间点对应的数据 **返回值:** None **示例:** 具体应用例子,见[高级应用](#高级应用1) **注意:** 1. <font color=red size=3>` time_line `</font>中,时间的格式使用为 <font color=red size=3> `%Y-%m-%d` </font>或者<font color=red size=3> `%Y-%m-%d %H:%M:%S` </font> 2. <font color=red size=3>` data `</font>只支持数值型的数据,不支持字符串型 3. 注册的结果会保存在 [context对象](#context) 里 3. 外部数据调用的规则与行情数据的规则一样,通过[get_reg_userdata](#get_reg_userdata)获取 4. 一般只适用于回测,因为外部数据无法在实时模式中随着行情变化而扩展 <span id="reg_userindi"></span> ### reg_userindi - 用户外部函数注册 ### ---------- (在init函数中使用)注册用户外部函数,加入到策略结构中 **函数原型:** reg_useridi(indi_func) **参数:** |参数名|类型|说明 |:-|:-|:-| |indi_func|函数对象|外部函数对象 **返回值:** None **示例:** 具体应用例子,见[高级应用](#高级应用2) **注意:** 1. 注册的结果会保存在 [context对象](#context) 里 2. 外部函数的调用的规则与行情数据的规则一样,通过[get_reg_userindi](#get_reg_userindi)获取 2. 外部函数的使用支持回测和实时交易 <span id="数据查询"></span> ## 数据查询 ## atrader中的数据查询函数在不同场景下有所不同,在策略结构中,为了确保在策略结构中,调取的历史数据不存在未来函数的影响,atrader会对API是否适用于策略结构进行标记,以下内容中带有"▲" 的表示为只能在[策略结构](#structure)中使用,**无法在命令行中使用** ### get_code_list - 获取指数行业成分股和权重 ### ---------- 获得指数(包含权重和成分股)、行业板块(没有权重,只有成分股),包括成分股及权重等信息 **函数原型:** get_code_list(block, date='') **参数:** |参数名|类型|说明 |:-|:-|:-| |block|str|1.<a href="https://www.digquant.com.cn/documents/25" target="_blank">指数名称</a>,如`hs300`可获得沪深300指数的权重与成分股。 2.<a href="https://www.digquant.com.cn/documents/24" target="_blank">行业名称</a>,如`SWDZ1`可获取申万电子一级行业的成分股。 3.特殊字段,如:`index`:获取所有指数列表;`plate_industry`:获取行业列表;`sse, szse, cffex, shfe, dce, czce`: 取各交易所品种代码,`sse`和 `szse` 会拿到交易所里的指数以及其他标的,如债券等等;`sse_a,szse_a`: 取上海证券交易所和深圳证券交易所的A股;`cffex000, cffex001, shfe000, shfe001`: 取商品期货交易所主力, 次主力合约代码 |date|str或者datetime.datetime|特定日期,空字符串''指当天时间。只支持行业和指数查询历史成份股,使用特殊字段时不起作用。 **返回值:** pandas.DataFrame |key|类型|说明: |:-|:-|:-| |code|str|标的代码 |name|str|标的中文名称 |blockname|str|标的简称,首字母简称 |weight|float|不存在权重的返回0.0 **示例:** ```python # 获取沪深300指数的成分股 get_code_list('hs300') ``` **输出:** ```python code name block_name weight 0 szse.000001 平安银行 payh 0.907 1 szse.000002 万科A wkA 1.129 2 szse.000060 中金岭南 zjln 0.109 3 szse.000063 中兴通讯 zxtx 0.416 …… ``` ### get_code_list_set - 获取一段时间内指数行业板块的成分股集合 ### ---------- 获取一段时间内指数行业板块的所有成分股集合 **函数原型:** get_code_list_set(block, begin_date, end_date) **参数:** |参数名|类型|说明 |:-|:-|:-| |block|str|1.<a href="https://www.digquant.com.cn/documents/25" target="_blank">指数名称</a>,如`hs300`可获得沪深300指数的权重与成分股。 2.<a href="https://www.digquant.com.cn/documents/24" target="_blank">行业名称</a>,如`SWDZ1`可获取申万电子一级行业的成分股。 |begin_date|str或者datetime.datetime|开始日期 |end_date|str或者datetime.datetime|结束日期 **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |code|str|标的代码 |name|str|标的中文名称 |blockname|str|标的简称,首字母简称 **示例:** ```python # 获取沪深300指数从2018-01-01到2018-12-31内所有曾经为其成分股的股票集合 get_code_list_set('hs300', '2018-01-01', '2018-12-31') ``` **输出:** ```python code name block_name 0 szse.000001 平安银行 payh 1 szse.000002 万科A wkA 2 szse.000060 中金岭南 zjln 3 szse.000063 中兴通讯 zxtx …… ``` ### ▲ get_current_bar - 获取当前bar的信息 ### ---------- ([策略结构](#structure)中使用)获取策略刷新时,当前bar的信息 **函数原型:** get_current_bar(target_indices=()) **参数:** |参数名|类型|说明 |:-|:-|:-| |target_indices|tuple or list|[标的资产的索引号](#context.target_list),()表示全部标的 **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |code|str |标的代码 |time_ bar |datetime.datetime |当前bar的时间 |number_bar |float |bar的位置,第一个为0 |open |float |当前bar开盘价 |high |float |当前bar最高价 |low |float |当前bar最低价 |close |float |当前bar收盘价 |volume |float |当前bar的成交量 |amount |float |当前bar的成交金额 |open_interest |float |当前持仓量,股票为NaN **示例:** get_current_bar(target_indices=()) **输出:** ```python code time_bar number_bar open high low close volume amount open_interest 0 SHFE.RB0000 2018-01-02 15:00:00 0 3801.0 3886.0 3794.0 3874.0 2961436.0 1.13802e+11 2413572.0 1 DCE.I0000 2018-01-02 15:00:00 0 531.5 546.5 531.0 543.5 2036976.0 1.10053e+11 1799508.0 ``` **注意:** 1. 返回的结构与[策略入口](#run_backtest)函数定义的标的和时间有关,当前bar也就是策略刷新时获取到的bar数据 ### get_factor_by_code - 获取BP因子数据(单个股票) ### ---------- 获取单个股票,在一段时间内多个因子的数据 **函数原型:** get_factor_by_code(factor_list, target, begin_date, end_date) **参数:** |参数名|类型|说明 |:-|:-|:-| |factor_list|tuple or list|<a href="https://www.digquant.com.cn/documents/23" target="_blank">BP因子名称</a>列表,每个因子以字符串表示,如`'PE'`、`'PB'` |target|str|标的代码,只支持单只标的输入,不支持输入多个标的,不支持list方式输入 |begin_date|str或者datetime.datetime|开始日期(包含开始日期当天) |end_date|str或者datetime.datetime|结束日期(包含结束日期当天) **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |date|datetime.datetime|交易日期 |factor*|float|每个因子名都是一个列名,因子数值 **示例:** ```python # 获取平安银行的PE,PB的因子数值,时间区间为2017-06-25至2017-07-02 get_factor_by_code(factor_list=['PE', 'PB'], target='SZSE.000001', begin_date='2017-06-25', end_date='2017-07-02') ``` **输出:** ```python date PE PB 0 2017-06-26 7.0262 0.8504 1 2017-06-27 7.0715 0.8558 2 2017-06-28 7.1244 0.8622 3 2017-06-29 7.1244 0.8622 4 2017-06-30 7.0942 0.8586 …… ``` **注意:** 1. 返回的<font color=red size=3> `date` </font>只提供交易日的数据,若<font color=red size=3> `begin_date` </font>和<font color=red size=3> `end_date` </font>之间不存在交易日,则返回<font color=red size=3> `None` </font> 2. 当股票不存在,或者查询的日期该股票未上市,则返回<font color=red size=3> `NaN` </font> ### get_factor_by_day - 获取BP因子数据(单天) ### ---------- 获取单天,多个股票,多个因子的数值 **函数原型:** get_factor_by_day(factor_list, target_list, date='') **参数:** |参数名|类型|说明 |:-|:-|:-| |factor_list|tuple or list|<a href="https://www.digquant.com.cn/documents/23" target="_blank">BP因子名称</a>列表,每个因子以字符串表示,如`'PE'`、`'PB'` |target_list|tuple or list|target_list列表,每个标的以字符串表示 |date|str或者datetime.datetime|交易日,''表示当天 **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |code|datetime.datetime|日期 |factor*|float|每个因子名都是一个列名,因子数值 **示例:** ```python # 获取2017-06-30平安银行和万科A的PE和PB因子数值 get_factor_by_day(factor_list=['PE', 'PB'], target_list=['SZSE.000001','SZSE.000002'], date='2017-06-30') ``` **输出:** ```python code PE PB 0 SZSE.000001 7.0942 0.8586 1 SZSE.000002 13.198 2.4186 …… ``` **注意:** 1. 参数<font color=red size=3> `date` </font>需要为交易日,非交易日会返回None 2. 当股票不存在,或者查询的日期该股票未上市,对应的因子数值返回<font color=red size=3> `NaN` </font> ### get_factor_by_factor - 获取BP因子数据(单个因子) ### ---------- 获取一段时间,多标的的单个因子数据 **函数原型:** get_factor_by_factor(factor, target_list, begin_date, end_date) **参数:** |参数名|类型|说明 |:-|:-|:-| |factor|str|<a href="https://www.digquant.com.cn/documents/23" target="_blank">BP因子名称</a>,只支持单个因子输入,不支持多个因子输入,如`'PE'`、`'PB'` |target_list|tuple or list|标的代码列表,每个因子以字符串的方式表示 |begin_date|str或者datetime.datetime|开始日期(包含开始日期当天) |end_date|str或者datetime.datetime|结束日期(包含结束日期当天) **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |date|datetime.datetime|交易日期 |code*|float|每个标的都是一个列名,因子数值 **示例:** ```python # 获取平安银行和万科A的PE因子数值,时间区间为2017-06-25至2017-07-02 get_factor_by_factor(factor='PE', target_list=['SZSE.000001','SZSE.000002'], begin_date='2017-06-25', end_date='2017-07-02') ``` **输出:** ```python date SZSE.000001 SZSE.000002 0 2017-06-26 7.0262 13.9966 1 2017-06-27 7.0715 13.4998 2 2017-06-28 7.1244 13.2143 3 2017-06-29 7.1244 13.2989 4 2017-06-30 7.0942 13.1985 …… ``` **注意:** 1. 返回的<font color=red size=3> `date` </font>只提供交易日的数据,若<font color=red size=3> `begin_date` </font>和<font color=red size=3> `end_date` </font>之间不存在交易日,则返回<font color=red size=3> `None` </font> 2. 当股票不存在,或者查询的日期该股票未上市,则返回<font color=red size=3> `NaN` </font> ### get_kdata - 获取历史行情数据 ### ---------- (命令行中查询收据)根据开始日期和结束日期,获取标的历史行情数据 **函数原型:** get_kdata(target_list, frequency, fre_num, begin_date, end_date, fq=0, fill_up=False, df=False, sort_by_date=True) **参数:** |参数名|类型|说明 |:-|:-|:-| |target_list|list|标的列表,里面每个标的需要按照 3标的说明结构使用 |frequency|str|数据频率,仅支持以下频率:‘day’,‘min’,‘week’,‘month’ |fre_num|int|频数 |begin_date|str或者datetime.datetime |开始日期(包含开始日期当天) |end_date|str或者datetime.datetime|结束日期(包含结束日期当天) |fq|int|复权类型,默认不复权,0表示不复权,1表示前复权,2表示后复权 |fill_up|bool|True表示补齐操作,False表示不补齐 |df|bool|True则使用df返回,不用dict;False则先返回dict,key为每个标的的code,value为一个df |sort_by_time|bool|只在df为True时有效;True表示,按照日期排列,再到标的False表示,按照标的排列,再到日期 **返回值:** df=False时,返回dict,key为每个标的的code,value为以下字段的df df=True 时,返回df,每一个日期,每一个标的有一条记录 若sort_by_time = True, 则按照time排列 若sort_by_time = False, 则按照code排列 |key|类型|说明 |:-|:-|:-| |time|datetime.datetime|Bar的结束时间 |code|str|标的代码 |open|float|开盘价 |high|float|最高价 |low|float|最低价 |close|float|收盘价 |volume|float|成交量 |amount|float|成交金额, |open_interest|float|持仓量,股票为NaN **示例:** ```python # 获取平安银行和万科A60min的bar数据,时间区间为2017-06-25至2017-06-26 get_kdata(target_list=['SZSE.000001','SZSE.000002'], frequency='min', fre_num=60, begin_date='2017-06-25', end_date='2017-06-26',fq=1,fill_up=False, df=True,sort_by_date=False) ``` **输出:** ```python time code open high low close volume amount open_interest 0 2017-06-26 10:30:00 SZSE.000001 8.98914 9.10550 8.97944 9.05702 391082.0 3.65906e+08 NaN 1 2017-06-26 11:30:00 SZSE.000001 9.05702 9.06671 9.02793 9.03762 97353.0 9.08111e+07 NaN 2 2017-06-26 14:00:00 SZSE.000001 9.03762 9.05702 9.01823 9.04732 77868.0 7.25751e+07 NaN 3 2017-06-26 15:00:00 SZSE.000001 9.04732 9.05702 0.00000 9.00853 130256.0 1.21249e+08 NaN 4 2017-06-26 10:30:00 SZSE.000002 23.24913 24.17984 22.89546 24.13330 794245.0 1.99792e+09 NaN 5 2017-06-26 11:30:00 SZSE.000002 24.13330 24.14261 23.59349 23.86339 166637.0 4.27008e+08 NaN 6 2017-06-26 14:00:00 SZSE.000002 23.86339 24.64519 23.78894 24.58004 449253.0 1.18377e+09 NaN 7 2017-06-26 15:00:00 SZSE.000002 24.57073 24.64519 0.00000 24.64519 253232.0 6.65189e+08 NaN ``` **注意:** 1. 历史数据查询,只提供交易日的数据,若<font color=red size=3> `begin_date` </font>和<font color=red size=3> `end_date` </font>之间不存在交易日,则报错 2. 当股票不存在,或者查询的日期该股票未上市,则返回<font color=red size=3> `NaN` </font> ### get_kdata_n - 获取n个历史行情数据 ### ---------- (命令行中查询数据)根据结束日期,获取结束日期前n个历史行情数据 **函数原型:** get_kdata_n(target_list, frequency, fre_num, n, end_date='', fq=0, fill_up=False, df=False, sort_by_date=True) **参数:** |参数名|类型|说明 |:-|:-|:-| |target_list|list|标的列表,里面每个标的需要按照 3标的说明结构使用 |frequency|str|数据频率,仅支持以下频率:‘day’,‘min’,‘week’,‘month’ |fre_num|int|频数 |end_date|str或者datetime.datetime|结束日期,end_date的数据不包含在返回的结果里 |n|int|取end_date前n个bar |fq|int|复权类型,0表示不复权,1表示前复权,2表示后复权 |fill_up|bool|True表示补齐操作,False表示不补齐 |df|bool|True则使用df返回,不用dict;False则先返回dict,key为每个标的的code,value为一个df |sort_by_time|bool|只在df为True时有效;True表示,按照日期排列,再到标的False表示,按照标的排列,再到日期 **返回值:** df=False时,返回dict,key为每个标的的code,value为以下字段的df df=True 时,返回df,每一个日期,每一个标的有一条记录 若sort_by_time = True, 则按照time排列 若sort_by_time = False, 则按照code排列 |key|类型|说明 |:-|:-|:-| |time|datetime.datetime|Bar的结束时间 |code|str|标的代码 |open|float|开盘价 |high|float|最高价 |low|float|最低价 |close|float|收盘价 |volume|float|成交量 |amount|float|成交金额, |open_interest|float|持仓量,股票为NaN **示例:** ```python # 获取平安银行和万科A,在2017-07-02前4个60min的bar数据 get_kdata_n(target_list=['SZSE.000001', 'SZSE.000002'], frequency='min', fre_num=60, n=4, end_date='2017-07-02', fill_up=False, df=True, fq=1, sort_by_time=False) ``` **输出:** ```python time code open high low close volume amount open_interest 0 2017-06-30 10:30:00 SZSE.000001 9.10550 9.13459 9.04732 9.05702 182015.0 1.70365e+08 NaN 1 2017-06-30 11:30:00 SZSE.000001 9.05702 9.08611 9.02793 9.06671 101571.0 9.48192e+07 NaN 2 2017-06-30 14:00:00 SZSE.000001 9.06671 9.09580 9.05702 9.08611 67107.0 6.27932e+07 NaN 3 2017-06-30 15:00:00 SZSE.000001 9.08611 9.14429 9.08611 9.11520 139448.0 1.31110e+08 NaN 4 2017-06-30 10:30:00 SZSE.000002 23.24913 23.24913 22.94199 22.98853 183685.0 4.55353e+08 NaN 5 2017-06-30 11:30:00 SZSE.000002 22.98853 23.43527 22.97922 23.32358 133077.0 3.32060e+08 NaN 6 2017-06-30 14:00:00 SZSE.000002 23.32358 23.34220 23.15605 23.26774 68761.0 1.71644e+08 NaN 7 2017-06-30 15:00:00 SZSE.000002 23.26774 23.63072 23.16536 23.25843 192888.0 4.85499e+08 NaN ``` **注意:** 1. 历史数据查询,只提供交易日的数据,<font color=red size=3> `end_date` </font>不是交易日,则会寻找往前最近的交易日计算 2. 当股票不存在,或者查询的日期该股票未上市,则返回<font color=red size=3> `NaN` </font> ### get_main_contract - 获取期货物理合约代码 ### ---------- (命令行中查询收据)获得主力合约和次主力合约的物理合约代码 **函数原型:** get_main_contract(main_code, begin_date, end_date) **参数:** |参数名|类型|说明 |:-|:-|:-| |main_code |str| 主力连续合约代码和次主力连续合约代码 |begin_date |str或者datetime.datetime| 开始日期(包含开始日期当天) |end_date |str或者datetime.datetime| 结束日期(包含结束日期当天),’’表示当天 **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |code |str |具体的期货合约代码 |date |datetime.datetime| 交易日期 **示例:** ```python # 获取2018-01-01至2018-02-01螺纹钢主力连续对应的期货合约代码 get_main_contract(main_code='SHFE.RB0000', begin_date='2018-01-01', end_date=2018-02-01)) ``` **输出:** ```python code date 0 SHFE.RB1805 2018-01-02 1 SHFE.RB1805 2018-01-03 2 SHFE.RB1805 2018-01-04 3 SHFE.RB1805 2018-01-05 ``` **注意:** 1. 主力和次主力合约查询,只提供交易日的数据,若<font color=red size=3> `begin_date` </font>和<font color=red size=3> `end_date` </font>之间不存在交易日,返回空的df 2. 当输入的标的不是主力或次主力合约代码,或者查询的日期该品种未上市,则返回空的df 3. 主力连续合约和次主力连续合约的具体代码见[常见枚举] <span id="get_reg_factor"></span> ### ▲ get_reg_factor - 获取已注册的因子 ### ---------- ([策略结构](#structure)中使用)获取已经注册的因子 **函数原型:** get_reg_factor(reg_idx,target_indices=(), length=1, df=False) **参数:** |参数名|类型|说明 |:-|:-|:-| |reg_idx|object|已注册数据的保存对象,context.reg_factor[i],i代表注册时的先后顺序,从0开始 |target_indices |tuple or list|target的索引号,[]表示全部标的 |length |int |从当前时刻往前取多少根bar,频率为日频 |df |bool |是否使用df的格式返回 **返回值:** **df=False时**,返回dict,key为每个标的的索引号,value为以下字段的df |key|类型|说明 |:-|:-|:-| |target_indices*| float|每一个标的索引号作为一个单独的column,其数值为该标的因子的数值 |date| datetime.datetime|交易日期 **df=True 时**,返回df,每一个日期,每一个标的有一条记录 |key|类型|说明 |:-|:-|:-| |target_idx| int| 标的资产索引号 |date |datetime.datetime| 交易日历 |factor |str |因子名称 |value |float |因子数值 **示例:** ```python # 策略使用浦发银行和万科A作为标的,选择PE 和 PB两个因子 # 回测日期为2018-01-01至2018-06-30 # df=False时 get_reg_factor(reg_idx=context.reg_factor[0], target_indices=(), length=1, df=False) # df=True时 get_reg_factor(reg_idx=context.reg_factor[0], target_indices=(), length=1, df=True) ``` **输出:** ```python # df=False时 {'PE': 0 1 date 0 6.8044 9.9148 2018-01-02 15:00:00, 'PB': 0 1 date 0 0.9538 1.1524 2018-01-02 15:00:00} # df=True时 target_idx date factor value 0 0 2018-01-02 15:00:00 PE 6.8044 1 0 2018-01-02 15:00:00 PB 0.9538 2 1 2018-01-02 15:00:00 PE 9.9148 3 1 2018-01-02 15:00:00 PB 1.1524 ``` <span id="get_reg_kdata"></span> ### ▲ get_reg_kdata - 获取已注册的行情数据 ### ---------- ([策略结构](#structure)中使用)获取已经注册的行情数据 **函数原型:** get_reg_kdata(reg_idx,target_indices=(), length=1, fill_up=False, df=False) **参数:** |参数名|类型|说明 |:-|:-|:-| |reg_idx|object|已注册数据的保存对象,context.reg_kdata[i],i代表注册时的先后顺序,从0开始 |target_indices |tuple or tuple |Target的索引号,[]表示全部标的 |length |int |从当前时刻往前取多少根bar,频率根据注册时的频率决定 |fill_up |bool |True表示补齐操作,False表示不补齐 |df |bool |True则使用df返回,不用dict,False则先返回dict,key为每个标的的索引号,value为一个df,默认为False **返回值:** df=False时,返回dict,key为每个标的的索引号,value为以下字段的df df=True 时,返回df,每一个日期,每一个标的有一条记录 |key|类型|说明 |:-|:-|:-| |target_idx|int|标的资产索引号 |time|datetime.datetime|bar的结束时间 |code|str|标的代码 |open|float|开盘价 |high|float|最高价 |low|float|最低价 |close|float|收盘价 |volume|float|成交量 |amount|float|成交金额, |open_interest|float|持仓量,股票为NaN **示例:** ```python # 按照第一个注册的频率,构建长度为1的滑窗,获取全部标的,不补齐,使用df的形式返回 get_reg_kdata(reg_idx=context.reg_kdata[0], target_indices=(), length=1, fill_up=False, df=True) ``` **输出:** ```python target_idx time open high low close volume amount open_interest 0 0 2018-01-02 15:00:00 3801 3886 3794 3874 2.9614e+06 1.138e+11 2.4136e+06 1 1 2018-01-02 15:00:00 531.5 546.5 531 543.5 2.037e+06 1.1005e+11 1.7995e+06 ``` **注意:** 1. 返回的结构中,标的,以及开始的日期与[策略入口]处定义的标的有关,数据频率与[行情数据注册]的频率有关 2. 当没有在 [init 函数] 中注册行情数据时,使用此函数会报错 <span id="get_reg_kdata_adj"></span> ### ▲ get_reg_kdata_adj - 获取经过调整的注册行情数据 ### ---------- ([策略结构](#structure)中使用)获取已经注册的行情数据(经过主力合约换月调整) **函数原型:** get_reg_kdata_adj(reg_idx,target_indices=(), length=1, fill_up=False, df=False) **参数:** |参数名|类型|说明 |:-|:-|:-| |reg_idx|object|已注册数据的保存对象,context.reg_kdata[i],i代表注册时的先后顺序,从0开始 |target_indices |tuple or tuple |Target的索引号,[]表示全部标的 |length |int |从当前时刻往前取多少根bar,频率根据注册时的频率决定 |fill_up |bool |True表示补齐操作,False表示不补齐 |df |bool |True则使用df返回,不用dict,False则先返回dict,key为每个标的的索引号,value为一个df,默认为False **返回值:** df=False时,返回dict,key为每个标的的索引号,value为以下字段的df df=True 时,返回df,每一个日期,每一个标的有一条记录 |key|类型|说明 |:-|:-|:-| |target_idx|int|标的资产索引号 |time|datetime.datetime|bar的结束时间 |code|str|标的代码 |open|float|开盘价 |high|float|最高价 |low|float|最低价 |close|float|收盘价 |volume|float|成交量 |amount|float|成交金额, |open_interest|float|持仓量,股票为NaN **示例:** ```python # 按照第一个注册的频率,构建长度为1的滑窗,获取全部标的,不补齐,使用df的形式返回 get_reg_kdata_adj(reg_idx=context.reg_kdata[0], target_indices=(), length=1, fill_up=False, df=True) ``` **输出:** ```python target_idx time open high low close volume amount open_interest 0 0 2018-01-02 15:00:00 3801 3886 3794 3874 2.9614e+06 1.138e+11 2.4136e+06 1 1 2018-01-02 15:00:00 531.5 546.5 531 543.5 2.037e+06 1.1005e+11 1.7995e+06 ``` **注意:** 1. 当没有在 [init 函数] 中注册行情数据时,使用此函数会报错 2. 参数<font color=red size=3> `reg_idx` </font>入参的对象,在行情注册时,其参数<font color=red size=3> `adjust` </font>必须为<font color=red size=3> `True` </font>, 否则会报错 3. 返回的数据会根据根据主力合约换月进行调整,消去换月效应 4. 换月效应的调整只适用于期货合约,股票不起作用 <span id="get_reg_userdata"></span> ### ▲ get_reg_userdata - 获取已注册的用户外部数据 ### ---------- ([策略结构](#structure)中使用)获取已注册的用户外部数据 **函数原型:** get_reg_userdata(reg_idx, length=1) **参数:** |参数名|类型|说明 |:-|:-|:-| |reg_idx|object|已注册数据的保存对象,context.reg_userdata[i],i代表注册时的先后顺序,从0开始 |length |int |从当前时刻往前取多少根bar,频率根据策略入口的刷新频率决定 **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |time |datetime.datetime|时间点 |value |float| 根据注册进入的数值类型决定 **示例:** 具体应用例子,见[高级应用](#高级应用1) **注意:** 1.外部数据的频率是根据策略的<font color=red>刷新频率</font>来决定的,这和行情数据的注册不一样 <span id="get_reg_userindi"></span> ### ▲ get_reg_userindi - 获取已注册的用户外部函数 ### ---------- ([策略结构](#structure)中使用)获取已注册的用户外部函数 **函数原型:** get_reg_userindi(reg_idx, length=1) **参数:** |参数名|类型|说明 |:-|:-|:-| |reg_idx|object|已注册数据的保存对象,context.reg_userindi[i],i代表注册时的先后顺序,从0开始 |length |int |从当前时刻往前取多少根bar,频率根据策略入口的刷新频率决定 **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |time |datetime.datetime|时间点 |value |float| 根据外部函数返回的类型决定 **示例:** 具体应用例子,见[高级应用](#高级应用2) **注意:** 1.外部数据的频率是根据策略的<font color=red>刷新频率</font>来决定的,这和行情数据的注册不一样 ### get_trading_days - 获取一段时间的交易日历 ### ---------- (命令行中查询收据)获得主力合约和次主力合约的物理合约代码 **函数原型:** get_trading_days (market,begin_date,end_date=‘’) **参数:** |参数名|类型|说明 |:-|:-|:-| |market|str|交易所,交易所代码见[交易所介绍] |begin_date |str或者datetime.datetime| 开始日期(包含开始日期当天) |end_date |str或者datetime.datetime| 结束日期(包含结束日期当天),’’表示当天 **返回值:** Numpy.ndarray 交易日期使用datetime.datetime格式表示 **示例:** ```python # 获取上交所2018-01-01至2018-01-06的交易日期列表 get_trading_days(market='sse', begin_date='2018-01-01', end_date='2018-01-06') ``` **输出:** ```python [datetime.datetime(2018, 1, 2, 0, 0) datetime.datetime(2018, 1, 3, 0, 0) datetime.datetime(2018, 1, 4, 0, 0) datetime.datetime(2018, 1, 5, 0, 0)] ``` **注意:** 1. 若<font color=red size=3> `begin_date` </font>和<font color=red size=3> `end_date` </font>之间不存在交易日,返回<font color=red size=3> `None` </font> 2. 若<font color=red size=3> `begin_date` </font>晚于<font color=red size=3> `end_date` </font>,则返回<font color=red size=3> `None` </font> ### get_trading_time - 获取标的交易时间 ### ---------- (命令行中查询收据)根据具体标的的频率周期获取其交易时间 **函数原型:** get_trading_time(target_list, frequency, fre_num, begin_date, end_date='') **参数:** |参数名|类型|说明 |:-|:-|:-| |target_list |tuple or list| target_list列表,里面每个标的需要按照 3标的说明结构使用 |frequency |str |数据频率,仅支持以下频率:‘day’,‘min’,‘week’,‘month’’ |fre_num |int |频数,其中‘day’,‘week’,‘month’仅支持1 |begin_date |str或者datetime.datetime| 开始日期(包含开始日期当天) |end_date |str或者datetime.datetime| 结束日期(包含结束日期当天)‘’表示当天 **返回值:** Pandas.DataFrame |key|类型|说明 |:-|:-|:-| |time |datetime.datetime |Bar的时间,有多个标的时,会取各自时间的并集 |nums |float |bar的序号,从0开始1) 频率低于day时,返回所属日期bar序列数 2) 频率大于等与day时,返回begin_date开始到当前位置的序列号 **示例:** ```python # 获取螺纹钢主力连续和铁矿石主力连续合约在2017-06-26至2017-07-02,按1day形成的交易时间序列 get_trading_time(target_list=['SHFE.RB0000', 'DCE.I0000'], frequency='day', fre_num=1, begin_date='2017-06-26', end_date='2017-07-02') ``` **输出:** ```python time nums 0 2017-06-26 15:00:00 0 1 2017-06-27 15:00:00 1 2 2017-06-28 15:00:00 2 3 2017-06-29 15:00:00 3 4 2017-06-30 15:00:00 4 ``` **注意:** 1. 若<font color=red size=3> `target_list` </font>中是混合品种,返回的<font color=red size=3> `time` </font>将是两个品种交易时间的并集 2. 若<font color=red size=3> `frequency` </font>使用<font color=red size=3> `day, week, month` </font>,则返回的<font color=red size=3> `nums` </font>从<font color=red size=3> `begin_date` </font>之后的最近交易日开始计算,从0开始;若使用<font color=red size=3> `min` </font>,则从交易日内开始计算,第一根bar为0,每个交易日计数重置 3. 若<font color=red size=3> `begin_date` </font>和<font color=red size=3> `end_date` </font>之间不存在交易日,则报错 4. 若<font color=red size=3> `begin_date` </font>晚于<font color=red size=3> `end_date` </font>,则报错 5. 若查询的标的不存在,或者查询的日期该标的未上市,则报错 <span id="get_strategy_id"></span> ### get_strategy_id - 获取回测完策略的ID ### ---------- 获取AT上当前回测完的策略的ID **函数原型:** get_strategy_id() **参数:** 无 **返回值:** list(dict),列表中每个元素代表一个策略, |字段名|类型|说明 |:-|:-|:-| |strategy_name|str|策略名称| |strategy_id|str|策略ID| **示例:** ```python get_strategy_id() ``` **输出:** ```python [{'strategy_name': '海龟', 'strategy_id': '6489313123860738085'}] ``` **注意:** 1.`get_strategy_id` 获取的策略ID是当前AT客户端中,策略回测页面存在,并且可以提取绩效报告的策略ID 2.当AT客户端中策略回测中策略的Tab被关闭,或者AT重启后,策略ID失效 3.通过此方式不必依赖策略回测入口函数 `run_backtest` 获取策略ID 4.只有回测成功,回测结束,绩效计算完成的策略才会返回策略ID ### get_performance - 获取策略的绩效报告 ### ------------ 根据策略ID获取策略的绩效报告 **函数原型:** get_performance(strategy_id) **参数:** |字段名|类型|说明 |:-|:-|:-| |strategy_id|str|策略ID| **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |strategty_name|str|策略名| |cum_return|float|累计收益率| |annu_return|float|年化收益率(几何)| |max_drawback_rate|float |最大回测率| |init_cash|float |初始资金| |total_property|float |总资产| |begin_date|datetime.datetime| 回测开始日期| |end_date|datetime.datetime|回测结束日期| |cum_return_bm|float |基准累计收益率| |alpha|float |策略的Alpha| |beta|float |策略的Beta| |sharpe_ratio|float| 夏普比率| |info_ratio|float |信息比率| |turnover_rate|float |换手率| |net_profit|float |净利润(元)| |gross_profit|float |毛利(元)| |gross_loss|float |毛损(元)| |profit_factor|float |盈利因子| |long_net_profit|float |多头净利(元)| |short_net_profit|float |空头净利(元)| |aver_return|float| 年化收益率(算术)| |max_drawback|float |最大回撤(元)| |commission_paid|float| 已付手续费(元)| |slide_paid|float |已付滑价| |target_nums|float| 标的数量| |calmar_ratio|float |Calmar比率| |sortino_ratio|float| Sortino比率| |net_profit2max_po_loss|float| 净利润/最大潜在亏损| |commission2np|float |手续费/净利润| |trading_days|float |交易天数| |aver_holding_time|float |平均持仓时间(天)| |max_drawback_period|char |最大回测期| |max_loss_duration|float |最大不盈利天数| |max_con_profit_days|float| 最大连续盈利天数| |max_con_loss_days|float |最大连续亏损天数| |max_con_profit|float |最大连续盈利(元)| |max_con_loss|float |最大连续亏损(元)| |total_trade|float |交易总数量(笔)| |none_close_trade|float |未平仓交易数量(笔)| |profit_trade|float |盈利交易数(笔)| |loss_trade|float| 亏损交易数(笔)| |odds|float |胜率| |aver_profit|float |平均盈利(元)| |aver_loss|float |平均亏损(元)| |pl_ratio|float |平均盈利/平均亏损| |turnover_day|float |资金周转周期(天)| |net_value_arr|ndarray |净值曲线| |————|————|————| |net_value_arr[0]|dict|策略净值:n为数据点的数量| |name|shape为(n,)的ndarray| 曲线名称| |nvalue|shape为(n,)的ndarray| 净值曲线数值| |date|shape为(n,)的ndarray|日期| |————|————|————| |net_value_arr[1]|dict|基准净值:n为数据点的数量| |name|shape为(n,)的ndarray|基准名称| |nvalue|shape为(n,)的ndarray| 基准曲线数值| |date|shape为(n,)的ndarray| 日期| |————|————|————| |tradelist_future|dict|期货交易列表:m为配对后交易记录数量| |order_id|shape为(m,)的ndarray|开仓的交易订单号| |market|shape为(m,)的ndarray|市场| |code|shape为(m,)的ndarray| 代码| |shortname|shape为(m,)的ndarray|品种| |ls_type|shape为(m,)的ndarray|多空类型| |volume|shape为(m,)的ndarray| 数量| |open_time|shape为(m,)的ndarray| 开仓时间| |close_time|shape为(m,)的ndarray|平仓时间| |open_price|shape为(m,)的ndarray| 开仓价格| |close|shape为(m,)的ndarray| 平仓价格| |————|————|————| |tradelist_stock|dict|期货交易列表:m为配对后交易记录数量| |order_id|shape为(m,)的ndarray|开仓的交易订单号| |market|shape为(m,)的ndarray| 市场| |code|shape为(m,)的ndarray| 代码| |shortname|shape为(m,)的ndarray|品种| |ls_type|shape为(m,)的ndarray|开仓多空类型| |volume|shape为(m,)的ndarray| 数量| |open_time|shape为(m,)的ndarray|开仓时间| |close_time|shape为(m,)的ndarray| 平仓时间| |open_price|shape为(m,)的ndarray|开仓价格| |close|shape为(m,)的ndarray|平仓价格| |————|————|————| |month_info_arr|dict|月度分析:p为回测期间所涵盖的月份| |month|shape为(p,)的ndarray|月份标记| |net_profit|shape为(p,)的ndarray| 净利润| |net_profit_return|shape为(p,)的ndarray|净利率| |gross_profit|shape为(p,)的ndarray| 毛利| |gross_loss|shape为(p,)的ndarray|毛损| |trade_nums|shape为(p,)的ndarray|交易次数| |odds|shape为(p,)的ndarray|胜率| |————|————|————| |month_pl_arr|dict|月度盈亏分析:p为回测期间所涵盖的月份| |pl|shape为(p,)的ndarray|月度| |date|shape为(p,)的ndarray| 日期| |————|————|————| |long_equ_arr|dict|多头权益:n为数据点(交易日)| |lequity|shape为(n,)的ndarray|多头权益| |date|shape为(n,)的ndarray|日期| |————|————|————| |short_equ_arr|dict|空头权益:n为数据点(交易日)| |sequity|shape为(n,)的ndarray|空头权益| |date|shape为(n,)的ndarray| 日期| |————|————|————| |equity_arr|dict|权益:n为数据点(交易日)| |equity|shape为(n,)的ndarray| 权益| |date|shape为(n,)的ndarray| 日期| |————|————|————| |potential_loss_arr|dict|潜在亏损:n为数据点(交易日)| |ploss|shape为(n,)的ndarray|潜在亏损| |date|shape为(n,)的ndarray|日期| 解析 1.获取策略回测的绩效,只支持单一策略ID查询 2.如果通过 [`run_backtest`](#run_backtest) 获取策略ID,然后马上获取策略绩效,在策略的回测结果没有计算完毕之前,查询结果无效 ### get_future_info - 查询期货标的基本信息 ------ 查询期货标的基本信息 **函数原型:** ``` get_future_info(target_list) ``` **参数:** |字段名|类型|说明 |:-|:-|:-| |target_list|tuple or list|标的代码,支持多标的查询| **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |code|str|期货标的代码| |name| str |期货合约的中文简称| |ex_margin_rate| float |交易所规定的最低期货合约保证金率| |round_lot| float |最小交易手数| |listed_date|Datetime.datetime|期货的上市日期。主力连续合约与指数连续合约都为None| |type |str |合约类型| |multiplier| float |合约乘数,例如沪深300股指期货的乘数为300| |underlying_target| str |合约标的名称,只有股指期货有该字段,例如IF1005的合约标的名称为'IF',其余为None| |maturity |Datetime.datetime |期货到期日。主力连续合约与指数连续合约都为None| |settlement |str |交割方式:'cash' - 现金交割;'physical' - 实物交割| |product |str |产品类型:'index' - 股指期货;'commodity' - 商品期货;'government' - 国债期货| |market| str| 交易所 | |min_move |float |最小变动单位| **示例:** ```python get_future_info(['shfe.rb1901']) ``` **输出:** ```python code name ex_margin_rate round_lot listed_date type multiplier underlying_target maturity settlement product market min_move 0 rb1901 螺钢1901 0.05 1.0 2018-01-16 10.0 2019-01-15 physical commodity shfe 1.0 ``` ### get_stock_info - 查询股票标的基本信息 ------ 查询股票标的基本信息 **函数原型:** ``` get_stock_info(target_list) ``` **参数:** |字段名|类型|说明 |:-|:-|:-| |target_list|tuple or list|标的代码,支持多标的查询| **返回值:** pandas.DataFrame |key|类型|说明 |:-|:-|:-| |code|str|标的代码| |name| str |中文简称| |abbrev_name |str |证券中文简称首字母拼音| |round_lot |float |一手对应多少股,中国A股一手是100股| |listed_date |Datetime.datetime| 该证券上市日期| |delisted_date |Datetime.datetime |退市日期,未退市的显示None| |type |str |类型:‘stock’-股票;‘etf’-etf基金;‘index’-指数| |market |str |交易所代码| **示例:** ```python get_stock_info(['sse.600000']) ``` **输出:** ```python code name abbrev_name round_lot listed_date de_listed_date type market 0 600000 浦发银行 pfyh 100.0 1999-11-10 None 股票 sse ``` ### get_history_instruments - 查询标的历史日频交易信息 ------ 查询标的历史日频交易信息 **函数原型:** ``` get_history_instruments(target_list,begin_date, end_date='',df=False,sort_by_date=True) ``` **参数:** |字段名|类型|说明 |:-|:-|:-| |target_list|tuple or list|标的代码,支持多标的查询| |begin_date|str|开始日期| |end_date| str |结束日期,默认为'',表示当前日期| |df |boolen |是否以DataFrame的方式展示,默认为False| |sort_by_date|boolen|是否按日期排列,默认为True;True表示,按照日期排列,再到标的;False表示,按照标的排列,再到日期| **返回值:** df=False时,返回dict,key为每个标的的code,value为以下字段的df df=True 时,返回df,每一个日期,每一个标的有一条记录 若sort_by_time = True, 则按照time排列 若sort_by_time = False, 则按照code排列 |key|类型|说明 |:-|:-|:-| |code|str|标的代码| |trade_date| datetime.datetime |交易日期 |settle_price |float |结算价,股票为None |open_interest |float |持仓量,股票为None |pre_close| float |昨收价 |pre_settle| float |昨结算价,股票为None |status |str |<font color=red size=2>(暂不支持)</font>合约状态。'active' - 正常上市';delisted' - 终止上市;'temporary_suspended' - 暂停上市;'suspend' – 停牌| |special_type| str|<font color=red size=2>(暂不支持)</font>特别处理状态。'normal' - 正常上市';st' - st处理 ;'starst' - *st代表该股票正在接受退市警告; 'pt' - 代表该股票连续3年收入为负,将被暂停交易; 'other' - 其他 | **示例:** ```python get_history_instruments(['shfe.rb0000'], '2018-01-01', '2018-12-31',True) ``` **输出:** ```python trade_date settle_price open_interest pre_close pre_settle status special_type code 0 2018-01-02 3842 2413572 3794 3794 active normal shfe.rb0000 1 2018-01-03 3845 2433636 3874 3842 active normal shfe.rb0000 2 2018-01-04 3811 2581090 3809 3845 active normal shfe.rb0000 3 2018-01-05 3791 2744436 3819 3811 active normal shfe.rb0000 …… ``` ### ▲ get_instruments - 查询交易标的最新的日频信息 ------ ([策略结构](#structure)中使用)查询交易标的最新的日频信息 **函数原型:** ``` get_history_instruments(target_indices=(),length=1,df=False, sort_by_time=True) ``` **参数:** |字段名|类型|说明 |:-|:-|:-| |target_indices|tuple or list|[标的资产的索引号](#context.target_list),()表示全部标的| |length|int|从当前时刻往前取多少根bar| |df |boolen |是否以DataFrame的方式展示,默认为False| |sort_by_date|boolen|是否按日期排列,默认为True;True表示,按照日期排列,再到标的;False表示,按照标的排列,再到日期| **返回值:** df=False时,返回dict,key为每个标的的code,value为以下字段的df df=True 时,返回df,每一个日期,每一个标的有一条记录 若sort_by_time = True, 则按照time排列 若sort_by_time = False, 则按照code排列 |key|类型|说明 |:-|:-|:-| |code|str|标的代码| |trade_date| datetime.datetime |交易日期 |settle_price |float |结算价,股票为None |open_interest |float |持仓量,股票为None |pre_close| float |昨收价 |pre_settle| float |昨结算价,股票为None |status |str |<font color=red size=2>(暂不支持)</font>合约状态。'active' - 正常上市';delisted' - 终止上市;'temporary_suspended' - 暂停上市;'suspend' – 停牌| |special_type| str|<font color=red size=2>(暂不支持)</font>特别处理状态。'normal' - 正常上市';st' - st处理 ;'starst' - *st代表该股票正在接受退市警告; 'pt' - 代表该股票连续3年收入为负,将被暂停交易; 'other' - 其他 | **示例:** ```python get_instruments(target_indices=[], length=1, df=True) ``` **输出:** ```python trade_date settle_price open_interest pre_close pre_settle status special_type code 0 2018-01-02 3842 2413572 3794 3794 active normal shfe.rb0000 1 2018-01-03 3845 2433636 3874 3842 active normal shfe.rb0000 2 2018-01-04 3811 2581090 3809 3845 active normal shfe.rb0000 3 2018-01-05 3791 2744436 3819 3811 active normal shfe.rb0000 …… ``` <span id="沪深股票基本面数据"></span> ## 沪深股票基本面数据 atrader的沪深股票基本面信息数据提供四大类型的数据,具体可见<a href="https://www.digquant.com.cn/documents" target="_blank">数据字典</a>,每个类型下可能还存在分类,每个具体的数据单独形成API。 | 一级分类 | 一级分类说明 | 二级分类 | 二级分类说明 | | :------- | :----------- | :---------- | :----------- | | fdmt | 财务报表 | bs | 资产负债表 | | fdmt | 财务报表 | ins | 利润表 | | fdmt | 财务报表 | cf | 现金流量表 | | fdmt | 财务报表 | bs | 资产负债表 | | fdmt | 财务报表 | note | 附注信息 | | fdmt | 财务报表 | indicator | 财务指标 | | fdmt | 财务报表 | expectation | 业绩预期 | | mkt | 行情衍生数据 | —— | —— | | company | 公司行为 | info | 基本信息 | | company | 公司行为 | personel | 人员信息 | | company | 公司行为 | fid | 投融资分红 | | company | 公司行为 | equity | 股本股东 | | company | 公司行为 | ipo | 首发信息 | | company | 公司行为 | restricted | 限售解禁 | | company | 公司行为 | matters | 重大事项 | 用户在调用对应的API时,需要带上其层级关系,方能调用。 如获取财务数据中的资产负债表的一版工商业资产负债表的最新数据 ```python from atrader import fdmt data = fdmt.bs.bs_pit(target_list=['sse.600000'], report_type=(), begin_date='2017-01-01', end_date='2018-01-01', publish_date_begin='', publish_date_end='', field=()) ``` <span id="交易函数"></span> ## 交易函数 ### ▲ order_volume - 指定委托量下单 ------ ([策略结构](#structure)中使用)指定委托数量下单 **函数原型:** order_volume(account_idx,target_idx, volume, side, position_effect, type, price=0.0) **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号 |target_idx |int |标的资产索引号 |volume |int |委托量 |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE) |position_effect |int |开平标志,取值参考[ORDERPOSITIONEFFECT](#ORDERPOSITIONEFFECT) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |price |float |委托单价格,默认0.0 **返回:** 委托订单号 **示例:** ```python # 对索引号为0的账户买入开仓100股索引号为0的标的,,委托方式为市价委托 order_volume(account_idx=0, target_idx=0, volume=100, side=1, position_effect=1, order_type=2, price=0.0) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 参数<font color=red size=3> `volume` </font>对应股票时,单位为股数;对应期货时,单位为手数 3. 参数<font color=red size=3> `side, position_effect, order_type` </font>可以使用枚举常量的名称,也可以使用常量的数值;若输入的数值不在枚举常量的范围里,报错 4. 若<font color=red size=3> `order_type` </font>中使用了非限价单,<font color=red size=3> `price` </font>将不起作用 5. 类似于可用资金不足,委托量不合法,可平仓位不足等等,不会影响委托单号的生成,可以通过 [get_order_info](#get_order_info) 根据委托单号查询委托单的状态 ### ▲ order_value - 指定委托量下单 ------ ([策略结构](#structure)中使用)指定委托价值下单 **函数原型:** ``` order_value(account_idx,target_idx, value, side, position_effect, type, price=0.0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号 |target_idx |int |标的资产索引号 |value |float |委托价值 |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE) |position_effect |int |开平标志,取值参考[ORDERPOSITIONEFFECT](#ORDERPOSITIONEFFECT) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |price |float |委托单价格,默认0.0 **返回:** 委托订单号 **示例:** ```python # 对索引号为0的账户开仓买入10000元价值,索引号为0的标的,,委托方式为市价委托 order_value(account_idx=0, target_idx=0, value=10000.0, side=1, position_effect=1, order_type=2, price=0.0) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 参数<font color=red size=3> `value` </font>计算时,期货会按照名义价值计算 3. 价值转换为数量时,计算方式为<font color=red size=3> `value / price` </font>,实际数量会向下取整,股票单位为100股,期货为1手。当<font color=red size=3> `price` </font>使用市价时,委托的价格会使用当前bar的收盘价来转换成数量 4. 参数<font color=red size=3> `side, position_effect, order_type` </font>可以使用枚举常量的名称,也可以使用常量的数值;若输入的数值不在枚举常量的范围里,报错 5. 若<font color=red size=3> `order_type` </font>中使用了非限价单,<font color=red size=3> `price` </font>将不起作用 6. 类似于可用资金不足,委托量不合法,可平仓位不足等等,不会影响委托单号的生成,可以通过 [get_order_info](#get_order_info) 根据委托单号查询委托单的状态 ### ▲ order_percent - 指定可用资金的百分比下单 ------ ([策略结构](#structure)中使用)指定可用资金的百分比下单 **函数原型:** ``` order_percent(account_idx,target_idx, percent, side, position_effect, type, price=0.0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号 |target_idx |int |标的资产索引号 |percent |float |可用资金的百分比,0.01代表1% |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE) |position_effect |int |开平标志,取值参考[ORDERPOSITIONEFFECT](#ORDERPOSITIONEFFECT) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |price |float |委托单价格,默认0.0 **返回:** 委托订单号 **示例:** ```python # 对索引号为0的账户使用可用资金的15%开仓买入,索引号为0的标的,,委托方式为市价委托 order_percent(account_idx=0, target_idx=0, percent=0.15, side=1, position_effect=1, order_type=2, price=0.0) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 参数<font color=red size=3> `percent` </font>计算时,期货会按照名义价值计算,所以可以大于1 3. 价值转换为数量时,计算方式为<font color=red size=3> `可用资金 * percent / (price * 合约乘数)` </font>,实际数量会向下取整,股票单位为100股,期货为1手 4. 参数<font color=red size=3> `side, position_effect, order_type` </font>可以使用枚举常量的名称,也可以使用常量的数值;若输入的数值不在枚举常量的范围里,报错 5. 若<font color=red size=3> `order_type` </font>中使用了非限价单,<font color=red size=3> `price` </font>将不起作用 6. 类似于可用资金不足,委托量不合法,可平仓位不足等等,不会影响委托单号的生成,可以通过 [get_order_info](#get_order_info) 根据委托单号查询委托单的状态 ### ▲ order_target_volume - 调仓到目标持仓量 ------ ([策略结构](#structure)中使用)调仓到目标持仓量 **函数原型:** ``` order_target_volume(account_idx,target_idx, target_volume, side, type, price=0.0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号 |target_idx |int |标的资产索引号 |target_volume |int |目标委托量 |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |price |float |委托单价格,默认0.0 **返回:** 委托订单号 list,调仓可能会涉及到多个订单 **示例:** ```python # 对索引号为0的账户中索引号为0的标的,调仓到多头100股,委托方式为市价委托 order_target_volume(account_idx=0, target_idx=0, target_volume=100, side=1, order_type=2, price=0.0) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 参数<font color=red size=3> `target_volume` </font>对应股票时,单位为股数;对应期货时,单位为手数 3. 参数<font color=red size=3> `side, order_type` </font>可以使用枚举常量的名称,也可以使用常量的数值;若输入的数值不在枚举常量的范围里,报错 4. 若<font color=red size=3> `order_type` </font>中使用了非限价单,<font color=red size=3> `price` </font>将不起作用 5. 类似于可用资金不足,委托量不合法,可平仓位不足等等,不会影响委托单号的生成,可以通过 [get_order_info](#get_order_info) 根据委托单号查询委托单的状态 6. 调仓不支持双边持仓,使用调仓函数时,会把和目标持仓方向不一样的持仓平仓 ### ▲ order_target_value - 调仓到目标持仓价值 ------ ([策略结构](#structure)中使用)调仓到目标持仓价值 **函数原型:** ``` order_target_value(account_idx,target_idx, target_value, side, type, price=0.0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号 |target_idx |int |标的资产索引号 |target_value |float |目标价值 |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |price |float |委托单价格,默认0.0 **返回:** 委托订单号 list,调仓可能会涉及到多个订单 **示例:** ```python # 对索引号为0的账户中索引号为0的标的,调仓到多头10000元,委托方式为市价委托 order_target_value(account_idx=0, target_idx=0, value=10000.0, side=1, order_type=2, price=0.0) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 参数<font color=red size=3> `target_value` </font>计算时,期货会按照名义价值计算 3. 价值转换为数量时,计算方式为<font color=red size=3> `target_value / price` </font>,实际数量会向下取整,股票单位为100股,期货为1手。当<font color=red size=3> `price` </font>使用市价时,委托的价格会使用当前bar的收盘价来转换成数量 4. 参数<font color=red size=3> `side, order_type` </font>可以使用枚举常量的名称,也可以使用常量的数值;若输入的数值不在枚举常量的范围里,报错 5. 若<font color=red size=3> `order_type` </font>中使用了非限价单,<font color=red size=3> `price` </font>将不起作用 6. 类似于可用资金不足,委托量不合法,可平仓位不足等等,不会影响委托单号的生成,可以通过 [get_order_info](#get_order_info) 根据委托单号查询委托单的状态 7. 调仓不支持双边持仓,使用调仓函数时,会把和目标持仓方向不一样的持仓平仓 ### ▲ order_target_percent - 调仓到目标比例(总权益) ------ ([策略结构](#structure)中使用)调仓到目标比例(总权益) **函数原型:** ``` order_target_percent(account_idx,target_idx, target_percent, side, type, price=0.0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号 |target_idx |int |标的资产索引号 |target_percent |float |目标总权益比例 |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE) |order_type |int |委托类型,取值参考[ORDERTYPE](#ORDERTYPE) |price |float |委托单价格,默认0.0 **返回:** 委托订单号 list,调仓可能会涉及到多个订单 **示例:** ```python # 对索引号为0的账户中索引号为0的标的,调仓到总权益的10%,委托方式为市价委托 order_target_percent(account_idx=0, target_idx=0, percent=0.1, side=1, order_type=2, price=0.0) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 参数<font color=red size=3> `target_percent` </font>计算时,期货会按照名义价值计算,所以可以大于1 3. 价值转换为数量时,计算方式为<font color=red size=3> `动态市值权益 * target_percent / (price * 合约乘数)` </font>,实际数量会向下取整,股票单位为100股,期货为1手 4. 参数<font color=red size=3> `side, order_type` </font>可以使用枚举常量的名称,也可以使用常量的数值;若输入的数值不在枚举常量的范围里,报错 5. 若<font color=red size=3> `order_type` </font>中使用了非限价单,<font color=red size=3> `price` </font>将不起作用 6. 类似于可用资金不足,委托量不合法,可平仓位不足等等,不会影响委托单号的生成,可以通过 [get_order_info](#get_order_info) 根据委托单号查询委托单的状态 7. 调仓不支持双边持仓,使用调仓函数时,会把和目标持仓方向不一样的持仓平仓 ### ▲ order_cancel - 撤销特定委托单(根据委托单号) ------ ([策略结构](#structure)中使用)根据委托单号,撤销订单 **函数原型:** ``` order_cancel(order_list) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |order_list |list |委托订单号列表 **返回:** ``` None ``` **示例:** ```python # 对委托单号为1,2,10的订单进行撤单操作 order_cancel(order_list=[1, 2, 10]) ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 若订单已经成交,或者已撤单,或者被拒绝,进行撤单操作不会有实际作用,订单的状态可以通过 [get_order_info] 查询 ### ▲ order_cancel_all - 撤销所有委托 ------ ([策略结构](#structure)中使用)撤销所有当前可撤委托订单 **函数原型:** ``` order_cancel_all(account_indice=[0]) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_indice|list|账户索引列表,默认为[0]| **返回:** ``` None ``` **示例:** ``` order_cancel_all() ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 若订单已经成交,或者已撤单,或者被拒绝,进行撤单操作不会有实际作用,订单的状态可以通过 [get_order_info](#get_order_info) 查询 ### ▲ order_close_all - 平当前所有可平持仓 ------ ([策略结构](#structure)中使用)平当前所有可平持仓 **函数原型:** ``` order_close_all(account_idx=0) ``` **参数:** | 参数名 | 类型 | 说明 | | :---------- | :--- | :--------- | | account_idx | int | 账户索引号 | **返回:** 委托订单号 list,可能会涉及到多个订单 **示例:** ``` order_close_all() ``` **注意:** 1. 下单函数不能在[ init 函数 ](#init函数)使用 2. 可平持仓针对可用持仓而言,股票当日开仓的部分不能平仓,存在平仓挂单的被冻结的持仓,不会受此指令影响 <span id="get_order_info"></span> ### ▲ get_order_info - 查询订单的信息 ------ ([策略结构](#structure)中使用)根据委托单号查询订单的信息 **函数原型:** ``` get_order_info(order_list=(), accout_idx=0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |order_list |tuple or list|委托订单号列表,()代表所有委托单| |account_idx|int|账户索引号| **返回:** |类型|说明 |:-|:- |pandas.DataFrame|委托单对象,参见[委托对象](#order) **示例:** ```python # 查询当前所有订单的信息 get_order_info(order_list=()) ``` **输出:** ```python account_name account_idx order_id order_id_broker code target_idx side position_effect order_type source status rej_reason price volume value filled_volume filled_average filled_amount created updated 0 default 0 1 None SSE.600000 0 1 1 2 1 1 NaN 0.0 100 0 0 0.0 0.0 2018-01-02 15:00:00 2018-01-02 15:00:00 ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ]使用 2. 委托订单号由下单函数生成 ### ▲ get_last_order- 查询上一笔委托单的信息 ------ ([策略结构](#structure)中使用)查询上一笔委托单的信息 **函数原型:** ``` get_last_order(account_idx=0, target_idx=0, side=0, position_effect=0) ``` **返回:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号,默认为0 |target_idx |int |标的资产索引号,默认为0 |side |int |头寸方向,取值参考[ORDERSIDE](#ORDERSIDE),默认为0,表示不作筛选 |position_effect |int |开平标志,取值参考[ORDERPOSITIONEFFECT](#ORDERPOSITIONEFFECT),默认为0,表示不作筛选 **返回:** |类型|说明 |:-|:-| |pandas.DataFrame|委托单对象,参见[委托对象](#order) **示例:** ```python # 查询最近一次账户索引号为0,标的索引号为0的委托单 get_last_order(account_idx=0, target_idx=0) ``` **输出:** ```python account_name account_idx order_id order_id_broker code target_idx side position_effect order_type source status rej_reason price volume value filled_volume filled_average filled_amount created updated 0 default 0 1 None SSE.600000 0 1 1 2 1 1 NaN 0.0 100 0 0 0.0 0.0 2018-01-02 15:00:00 2018-01-02 15:00:00 ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. 上一次的定义是根据订单生成的时间来决定的。回测中,当策略刷新频率为<font color=red size=3> `min` </font>时,由于每天收盘时间会对当天的订单作清除处理,所以在新的一个交易日,使用此函数,将返回<font color=red size=3> `None` </font> 3. 若查询对应的订单不存在,则返回<font color=red size=3> `None` </font> ### ▲ get_daily_orders- 查询当天日内的全部委托 ------ ([策略结构](#structure)中使用)查询当天日内全部未结委托 **函数原型:** ``` get_daily_orders(accout_idx=0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx|int|账户索引号| **返回:** |类型|说明 |:-|:-| |pandas.DataFrame|委托单对象,参见[委托对象](#order) **示例:** ```python # 查询当前日内委托订单的信息 get_daily_orders() ``` **输出:** ```python account_name account_idx order_id order_id_broker code target_idx side position_effect order_type source status rej_reason price volume value filled_volume filled_average filled_amount created updated 0 default 0 1 None SSE.600000 0 1 1 2 1 1 NaN 0.0 100 0 0 0.0 0.0 2018-01-02 15:00:00 2018-01-02 15:00:00 ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. 在回测中,策略刷新频率为<font color=red size=3> `min` </font>,回测当天收盘后会把当天未成交的订单处理为撤单;若刷新频率为<font color=red size=3> `day, week, month` </font>,则订单不会随着每天被处理为撤单,会一直保留 3. 当没有满足条件的订单时,返回<font color=red size=3> `None` </font> ### ▲ get_unfinished_order- 查询当天日内全部未结委托 ------ ([策略结构](#structure)中使用)查询当天日内全部未结委托 **函数原型:** ``` get_unfinished_order(accout_idx=0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx|int|账户索引号| **返回:** |类型|说明 |:-|:-| |pandas.DataFrame|委托单对象,参见[委托对象](#order) **示例:** ```python # 查询当前日内全部未结的信息 get_unfinished_order() ``` **输出:** ```python account_name account_idx order_id order_id_broker code target_idx side position_effect order_type source status rej_reason price volume value filled_volume filled_average filled_amount created updated 0 default 0 1 None SSE.600000 0 1 1 2 1 1 NaN 0.0 100 0 0 0.0 0.0 2018-01-02 15:00:00 2018-01-02 15:00:00 ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. 在回测中,策略刷新频率为<font color=red size=3> `min` </font>,回测当天收盘后会把当天未成交的订单处理为撤单;若刷新频率为<font color=red size=3> `day, week, month` </font>,则订单不会随着每天被处理为撤单,会一直保留 3. 当没有满足条件的订单时,返回<font color=red size=3> `None` </font> ### ▲ get_last_execution- 查询上一笔成交单的信息 ------ ([策略结构](#structure)中使用)查询上一笔成交单的信息 **函数原型:** ``` get_last_execution(account_idx=0, target_idx=0, side=0, position_effect=0) ``` **返回:** |参数名|类型|说明 |:-|:-|:-| |account_idx |int |账户索引号,默认为0 |target_idx |int |标的资产索引号,默认为0 |side |int |头寸方向,取值参考[EXECUTIONSIDE](#EXECUTIONSIDE),默认为0,表示不作筛选 |position_effect |int |开平标志,取值参考[EXECUTIONPOSITIONEFFECT](#EXECUTIONPOSITIONEFFECT),默认为0,表示不作筛选 **返回:** |类型|说明 |:-|:-| |pandas.DataFrame|成交对象,参见[成交对象](#execution) **示例:** ```python # 查询最近一次账户索引号为0,标的资产索引号为0的成交信息 get_last_execution(account_idx=0, target_idx=0) ``` **输出:** ```python account_name account_idx order_id order_id_broker code target_idx side position_effect order_type source status rej_reason price volume value filled_volume filled_average filled_amount created updated 0 default 0 1 None SSE.600000 0 1 1 2 1 4 NaN 0.0 100 0 100 12.75 1403.0 2018-01-02 10:30:00 2018-01-02 10:30:00 ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. 上一次的定义是根据成交信息生成的时间来决定的。回测中,当策略刷新频率为<font color=red size=3> `min` </font>时,由于每天收盘时间会对当天的订单作清除处理,所以在新的一个交易日,使用此函数,将返回<font color=red size=3> `None` </font> 3. 回测中,当策略刷新频率为<font color=red size=3> `day, week, month` </font>时,会返回<font color=red size=3> `None` </font> 4. 若查询对应的订单不存在,则返回<font color=red size=3> `None` </font> ### ▲ get_daily_executions- 查询当天的全部成交信息 ------ ([策略结构](#structure)中使用)查询当天的全部成交信息 **函数原型:** ``` get_daily_executions(accout_idx=0) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |account_idx|int|账户索引号| **返回:** |类型|说明 |:-|:-| |pandas.DataFrame|成交对象,参见[成交对象](#execution) **示例:** ```python # 查询当天的全部成交信息 get_daily_executions() ``` **输出:** ```python account_name account_idx order_id order_id_broker code target_idx side position_effect order_type source status rej_reason price volume value filled_volume filled_average filled_amount created updated 0 default 0 1 None SSE.600000 0 1 1 2 1 4 NaN 0.0 100 0 100 12.75 1403.0 2018-01-02 10:30:00 2018-01-02 10:30:00 ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](init函数)使用 2. 在回测中,此函数只适用于策略刷新频率为<font color=red size=3> `min` </font>时,而且进入到另外一个交易日时,将清空当天的成交信息; 当策略刷新频率为<font color=red size=3> `day, week, month` </font>时,将返回<font color=red size=3> `None` </font> 3. 当没有满足条件的订单时,返回<font color=red size=3> `None` </font> <span id="止盈止损"></span> ## 止盈止损 ### ▲ stop_loss_by_order - 根据委托单设置止损 ------ ([策略结构](#structure)中使用)根据委托单设置止损 **函数原型:** ``` stop_loss_by_order(target_order_id,stop_type,stop_gap,order_type) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |target_order_id |int |目标委托订单号 |stop_type |int |止损类型,1 =‘point’2 = ‘percent’ |stop_gap |int |止损距离,整数点(非最小变动单位) |order_type |int |止盈止损执行时的委托类型,参见[ORDERSTOP_ORDER_TYPE](#ORDERSTOP_ORDER_TYPE) **返回:** 止盈止损单ID,int **示例:** ```python # 对订单号为order_id的委托单设置止损,止损距离10个整数点,触发时,委托的方式用市价委托 stop_loss_by_order(target_order_id=order_id, stop_type=1, stop_gap=10, order_type=2) ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. <font color=red size=3> `target_order_id` </font>指的是下单函数生成的订单委托号 3. 以买入开仓设置止损为例,<font color=red size=3> `point` </font>指的是<font color=red size=3> `触发价格 = 委托单的成交价 - stop_gap` </font>;<font color=red size=3> `percent` </font>指的是<font color=red size=3> `触发价格 = 委托单的成交价* (1 - stop_gap)` </font> 4. 止损单只有在目标委托订单生效之后,才会处于激活状态(等待被触发) 5. 止损单的状态可以通过 [get_stop_info](#get_stop_info) 根据止盈止损单号查询止盈止损单的状态 ### ▲ stop_profit_by_order - 根据委托单设置止盈 ------ ([策略结构](#structure)中使用)根据委托单设置止盈 **函数原型:** ``` stop_profit_by_order(target_order_id,stop_type,stop_gap,order_type) ``` **返回:** |参数名|类型|说明 |:-|:-|:-| |target_order_id |int |目标委托订单号 |stop_type |int |止盈类型,1 =‘point’2 = ‘percent’ |stop_gap |int |止盈距离,整数点(非最小变动单位) |order_type |int |止盈止损执行时的委托类型,参见[ORDERSTOP_ORDER_TYPE](#ORDERSTOP_ORDER_TYPE) **返回:** 止盈止损单ID,int **示例:** ```python # 对订单号为order_id的委托单设置止盈,止损距离10个整数点,触发时,委托的方式用市价委托 stop_profit_by_order(target_order_id=order_id, stop_type=1, stop_gap=10, order_type=2) ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. <font color=red size=3> `target_order_id` </font>指的是下单函数生成的订单委托号 3. 以买入开仓设置止盈为例,<font color=red size=3> `point` </font>指的是<font color=red size=3> `触发价格 = 委托单的成交价 + stop_gap` </font>;<font color=red size=3> `percent` </font>指的是<font color=red size=3> `触发价格 = 委托单的成交价* (1 + stop_gap)` </font> 4. 止盈单只有在目标委托订单生效之后,才会处于激活状态(等待被触发) 5. 止盈单的状态可以通过 [get_stop_info](#get_stop_info) 根据止盈止损单号查询止盈止损单的状态 ### ▲ stop_trailing_by_order - 根据委托单设置追踪止盈 ------ ([策略结构](#structure)中使用)根据委托单设置追踪止盈 **函数原型:** ``` stop_loss_by_order(target_order_id, stop_type, stop_gap, trailing_type, trailing_gap, order_type) ``` **返回:** |参数名|类型|说明 |:-|:-|:-| |target_order_id |int |目标委托订单号 |stop_type |int |止损类型,1 =‘point’2 = ‘percent’ |stop_gap |int |止损距离,整数点(非最小变动单位) |trailing_type|int| 追踪止盈触发距离计算类型,1 =‘point’2 = ‘percent’ |trailing_gap|int | 追踪止盈触发距离计算距离,整数点(非最小变动单位) |order_type |int |止盈止损执行时的委托类型,参见[ORDERSTOP_ORDER_TYPE](#ORDERSTOP_ORDER_TYPE) **返回:** 止盈止损单ID,int **示例:** ```oython # 对订单号为order_id的委托单设置追踪止盈,盈利15%后开始追踪,最高点回撤3%时触发,触发后,委托的方式用市价委托 stop_trailing_by_order(target_order_id=order_id, stop_type=2, stop_gap=15, trailing_type=2, trailing_gap=3, order_type=2) ``` **注意:** 1. 订单信息查询函数不能在[ init 函数 ](#init函数)使用 2. <font color=red size=3> `target_order_id` </font>指的是下单函数生成的订单委托号 3. 以买入开仓设置追踪止盈为例,<font color=red size=3> `trailing_point 和 trailing_gap` </font>计算的是追踪止盈开始追踪的位置,以 <font color=red size=3> `percent` </font>为例,则开始追踪的价格为<font color=red size=3> `委托单的成交价格 * ( 1 + percent )` </font>。<font color=red size=3> `stop_point 和 stop_gap` </font>指的是追踪止盈单的状态变为<font color=red size=3> `追踪中` </font>,而且从<font color=red size=3> `最高价` </font>回落的幅度,这个价格会随着行情的最高价变动而变动,当价格到达最高价计算的回落幅度,止盈平仓单将被触发 4. 追踪止盈单只有在目标委托订单生效之后,才会处于<font color=red size=3> `激活` </font>(等待被触发) 5. 追踪止盈单上涨超过(卖出开仓为下跌越过)由<font color=red size=3> `trailing_point 和 trailing_gap` </font>计算出来的触发价格,状态将变成<font color=red size=3> `追踪中` </font> 6. 追踪止盈单的状态可以通过 [get_stop_info](#get_stop_info) 根据止盈止损单号查询止盈止损单的状态 ### ▲ stop_cancel - 撤销止盈止损单 ------ ([策略结构](#structure)中使用)撤销止盈止损单 **函数原型:** ``` stop_cancel(stop_list) ``` **参数:** |参数名|类型|说明 |:-|:-|:-| |stop_list |tuple or list|止盈止损单号列表 **返回:** ``` None ``` **示例:** ```python # 撤销止盈止损单号为order_id的订单信息 stop_cancel(stop_list=[order_id]) ``` **注意:** 1. 止盈止损单信息查询函数不能在[ init 函数 ](#init函数)使用 2. 止盈止损单号的生成通过止盈止损函数形成 3. 回测模式中,本一轮的策略刷新,通过止盈止损函数生成的订单信息,需要在下一轮查询中才生效 4. 撤单只能针对那些未触发,未撤单的止盈止损单,若输入的止盈止损单号不属于可撤的范畴,不会起实际作用 <span id="get_stop_info"></span> ### ▲ get_stop_info - 查询止盈止损单的信息 ------ ([策略结构](#structure)中使用)根据止盈止损单查询订单的信息 **函数原型:** ``` get_stop_info(stop_list, accout_idx=0) ``` **参数:** | 参数名 | 类型 | 说明 | | :---------- | :------------ | :--------------- | | stop_list | tuple or list | 止盈止损单号列表 | | account_idx | int | 账户索引号 | **返回:** |类型|说明 |:-|:-| |pandas.DataFrame|止盈止损单对象,参见[止盈止损对象](#order_stop) **示例:** ```python # 查询止盈止损单号为order_id的订单信息 get_stop_info(stop_list=[order_id]) ``` **输出:** ```python account_name account_idx stop_order_id code order_id target_idx target_order_id stop_point stop_type execute_status trigger_price open trailing_price trailing_point trailing_high trailing_low created_time trigger_time 0 default 0 1 SSE.600000 NaN 0 1 NaN 1 1 NaN 0 NaN NaN NaN NaN 2018-01-02 15:00:00 None ``` **注意:** 1. 止盈止损单信息查询函数不能在[ init 函数 ](#init函数)使用 2. 止盈止损单号的生成通过止盈止损函数形成 3. 回测模式中,本一轮的策略刷新,通过止盈止损函数生成的订单信息,需要在下一轮查询中才生效 ## 其他函数 ### get_version - 获取atrader的版本号 ------ 获取atrader的版本号 **函数原型:** ``` get_version() ``` **返回值:** atrader版本号,str **示例:** ``` get_version() ``` **输出:** ``` '3.1.2' ``` **注意:** 1.atrader的版本与Auto-Trader的版本有关联,在调用的时候,会做版本检查,如果版本不匹配,请升级或者下载指定版本的atrader即可 # 高级应用 atrader提供以下几个高阶应用给用户,让用户在写策略的时候可以有更多的自主性,便利性,主要包括以下几个方面: 1. 策略使用用户自建的函数(以行情数据或者因子数据为基础) 2. 策略使用用户准备的外部数据(纯数据,不涉及运算) 3. 通过atrader获取策略回测后的绩效结果 以上应用场景会配以特定的API使用,并且会增加代码的理解难度,以及可能会导致策略的计算顺序改变,所以用户可以根据自己的需要,决定是否使用 <span id="高级应用1"></span> ### 策略使用用户准备的外部数据 ------ 在策略结构中,atrader允许用户添加一些自己的数据到策略结构中,一般而言在回测中使用比较多,在实时交易时,由于行情推送时间是属于未来的数据,一般难以与用户自己的数据结合,因为用户添加的数据往往是静态的,但从逻辑上是可以支持的。主要步骤如下: 1. 在 [init函数](#init函数) ,通过<font color=red size=3> `reg_userdata` </font>告诉系统外部的数据的时间,以及时间节点上的数据 2. 在策略运行阶段 [on_data函数](#on_data函数) ,通过<font color=red size=3> `get_reg_userdata ` </font>获取当前刷新时间点的外部数据 具体实施过程请看例子: **示例:** ```python # *_*coding:utf-8 *_* from atrader import * def init(context: Context): # 注册15min的行情数据 reg_kdata(frequency='min', fre_num=15) # 注册外部数据,两个数据,分别对应两个时间点 reg_userdata(timeline=['2018-01-31', '2018-02-01'], data=[2.6, 3.8]) def on_data(context: Context): # 获取用户自己添加的外部数据,只获取当期的数据 user_data_temp = get_reg_userdata(reg_idx=context.reg_userdata[0], length=1) print(user_data_temp) if __name__ == '__main__': run_backtest(strategy_name='example_test', file_path='回测.py', target_list=['sse.600000'], frequency='min', fre_num=120, begin_date='2018-01-30', end_date='2018-06-30') ``` **输出:** ```python time value 0 2018-01-30 11:30:00 0.0 time value 0 2018-01-30 15:00:00 0.0 time value 0 2018-01-31 11:30:00 2.6 time value 0 2018-01-31 15:00:00 2.6 time value 0 2018-02-01 11:30:00 3.8 …… ``` 解析 1. 添加的两个数据时间点分别在2018-01-31和2018002-01,回测的时间段在2018-01-30到2018-06-30,因此在2018-01-31之前,用户自添加的数据没有数据,系统会处理为0 <span id="高级应用2"></span> ### 策略使用用户自建的函数 ------ 使用自建函数主要是为了在策略运行中,会使用行情数据或者因子数据做一些较为复杂的计算,如果要在策略运行过程中运算,会导致策略运行速度变慢,而且代码显得臃肿,比较难快速把握到策略的思路,因此使用这个功能,可以实现以上几个问题。主要的步骤如下: 1. 在 [init函数](#init函数) 中,注册行情数据,BP因子数据(如有需要) 2. 在 [init函数](#init函数) ,使用<font color=red size=3> `reg_userindi` </font>注册 3. 定义自建函数,以<font color=red size=3> `context` </font>作为参数 4. 在策略运行阶段,在 [on_data函数](#on_data函数) 使用<font color=red size=3> `get_reg_userindi` </font>获取函数运行的结果 具体实施过程请看例子: **示例:** ```python def init(context: Context): # 注册15min的行情数据 reg_kdata(frequency='min', fre_num=15) # 注册外部函数,函数对象为signal_func reg_userindi(indi_func=signal_func) def on_data(context: Context): # 获取外部函数的结果序列 userindi_temp = get_reg_userindi(reg_idx=context.reg_userindi[0], length=1) print(userindi_temp) def signal_func(context:Context): # 利用行情数据构建外部函数返回的结果 k_data_temp = get_reg_kdata(reg_idx=context.reg_kdata[0], length=5, df=True) # 计算最近5个最高价的平均价 high_temp = np.mean(k_data_temp['high'].values) # 若最新的bar收盘价,大于最高价的平均价,返回1,否则返回0 if k_data_temp.loc[4, 'close'] > high_temp: signal = 1 else: signal = 0 return signal if __name__ == '__main__': run_backtest(strategy_name='example_test', file_path='回测.py', target_list=['sse.600000'], frequency='min', fre_num=120, begin_date='2018-01-30', end_date='2018-06-30') ``` **输出:** ```python time value 0 2018-01-30 11:30:00 0 time value 0 2018-01-30 15:00:00 0 time value 0 2018-01-31 11:30:00 1 time value 0 2018-01-31 15:00:00 1 time value 0 2018-02-01 11:30:00 0 ``` 解析 1. 在自定义函数<font color=red size=3> `signal_func ` </font>中,返回的是一个与标的数有关的结果 2. 自定义函数中若需要使用行情数据,或者因子数据,或者一些全部变量,需要在<font color=red size=3> `signal_func ` </font>中,以<font color=red size=3> `context ` </font>为参数 3. 在回测准备数据的过程中,<font color=red size=3> `signal_func ` </font>的数据会和K线数据一样提前准备,不需要等待到逻辑计算时才计算,会大幅减少运算时间 4. 在实时交易中,当有新行情推送过来时,会先计算自定义函数的数值,然后在执行 [on_data函数](#on_data函数) 的处理 ### 获取回测完的策略业绩报告 ------ 每个回测完成的策略,AT提供完整的业绩分析报告,每个业绩分析报告会保存在内存中,依赖于策略ID,用户可以通过atrader提供的专门API获取整个报告的每一个字段。 策略ID的获取有两种方式,用户可以根据具体的使用场景在不同地方使用 **回测语句完成后返回策略ID** ```python target_list = ['CZCE.FG000', 'SHFE.rb0000'] # 设置回测标的 frequency = 'min' # 设置刷新频率 fre_num = 1 # 设置刷新频率 begin_date = '2017-06-01' # 设置回测初始时间 end_date = '2017-09-01' # 设置回测结束时间 fq = 1 # 设置复权方式 strategy_id = run_backtest('海龟', '海龟.py', target_list=target_list, frequency=frequency, fre_num=fre_num,begin_date=begin_date, end_date=end_date, fq=fq) ``` 代码解析: 1. 通过回测入口函数 `run_backtest` 运行回测后返回策略ID 2. 只有回测完成才会返回策略ID;回测中断,回测发生错误都不会返回策略ID **回测后获取AT里的策略列表** ``` get_strategy_id() ``` 代码解析: 1.`get_strategy_id` 获取的策略ID是当前AT客户端中,策略回测页面存在,并且可以提取绩效报告的策略ID 2.当AT客户端中策略回测中策略的Tab被关闭,或者AT重启后,策略ID失效 3.通过此方式不必依赖策略回测入口函数 `get_strategy_id` 获取策略ID 4.只有回测成功,回测结束,绩效计算完成的策略才会返回策略ID **通过策略ID获取回测的绩效报告信息字段** 以下代码是通过策略ID获取策略回测报告信息,具体指标见[`get_performance`](#get_performance)介绍 ```python result = get_performance = ('6488216908083490844') ``` 1.回测完成但是绩效没有计算完毕的策略获取绩效报告字段会返回空的dict 2.策略ID可以通过上面两种方式获取 # 枚举常量 atrader中有大量的枚举常量,用户在使用过程中,可以使用常量的名称或者常量的数值入参,如果需要使用常量的名称,需要导入<font color=red size=3> `atrader.enums` </font>,如下: ``` from atrader.enums import * ``` <span id=ACCOUNTTYPE></span> ### ACCOUNTTYPE - 账户类型 ------ ```python ACCOUNTTYPE_SIM = 0 # 模拟账户 ACCOUNTTYPE_STOCK = 1 # 股票账户 ACCOUNTTYPE_FUTURE = 2 # 期货账户 ACCOUNTTYPE_OPTION = 3 # 期权账户 ACCOUNTTYPE_DIGITAL = 4 # 数字货币 ``` <span id=CASHCHANGEREASON></span> ### CASHCHANGEREASON - 资金变动原因 ------ ```python CASHCHANGEREASON_UNKNOWN = 0 # 不明 CASHCHANGEREASON_TRADE = 1 # 交易 CASHCHANGEREASON_INOUT = 2 # 出入金 ``` <span id=POSITIONSIDE></span> ### POSITIONSIDE - 持仓方向 ------ ```python POSITIONSIDE_UNKNOWN = 0 # 不明 POSITIONSIDE_LONG = 1 # 多头 POSITIONSIDE_SHORT = 2 # 空头 ``` <span id=POSITIONCHANGEREASON></span> ### POSITIONCHANGEREASON - 持仓变动原因 ------ ```python POSITIONCHANGEREASON_UNKNOW = 0 # 不明 POSITIONCHANGEREASON_TRADE = 1 # 交易 POSITIONCHANGEREASON_LIQUIDATION = 2 # 强平 POSITIONCHANGEREASON_INOUT = 3 # 出入仓 ``` <span id=ORDERSIDE></span> ### ORDERSIDE - 委托方向 ------ ```python ORDERSIDE_UNKNOWN = 0 # 不明 ORDERSIDE_BUY = 1 # 多 ORDERSIDE_SELL = 2 # 空 ``` <span id=ORDERPOSITIONEFFECT></span> ### ORDERPOSITIONEFFECT - 委托开平标记 ------ ```python ORDERPOSITIONEFFECT_UNKNOWN = 0 # 不明 ORDERPOSITIONEFFECT_OPEN = 1 # 开仓 ORDERPOSITIONEFFECT_CLOSE = 2 # 平仓 ORDERPOSITIONEFFECT_CLOSETODAY = 3 # 今平仓 ``` <span id=ORDERTYPE></span> ### ORDERTYPE - 委托类型 ------ ```python ORDERTYPE_UNKNOWN = 0 # 不明 ORDERTYPE_LIMIT = 1 # 限价 ORDERTYPE_MARKET = 2 # 市价 ORDERTYPE_FAK = 3 # 即时成交剩余撤销 ORDERTYPE_FOK = 4 # 即时全额成交或撤销 ORDERTYPE_BOC = 5 # 对方最优价格 ORDERTYPE_BOP = 6 # 己方最优价格 ORDERTYPE_B5TC = 7 # 最优五档剩余撤销 ORDERTYPE_B5TL = 8 # 最优五档剩余转限价 ``` <span id=ORDERSOURCE></span> ### ORDERSOURCE - 委托来源 ------ ```python ORDERSOURCE_MANUAL = 0 # 手动下单 ORDERSOURCE_STRATEGY = 1 # 策略下单 ORDERSOURCE_STOP = 2 # 止盈止损单 ``` <span id=ORDERSTATUS></span> ### ORDERSTATUS - 委托状态 ------ ```python ORDERSTATUS_UNKNOWN = 0 # 不明 ORDERSTATUS_CREATED = 1 # 创建 ORDERSTATUS_REPORTED = 2 # 已报 ORDERSTATUS_CANCELED = 3 # 已撤销订单 ORDERSTATUS_DEALED = 4 # 全部成交 ORDERSTATUS_REJECTED = 5 # 已拒绝 ORDERSTATUS_PENDINGCANCEL = 6 # 待撤销订单 ORDERSTATUS_PARTIALDEALED = 7 # 部分成交 ORDERSTATUS_PENDINGNEW = 8 # 待报 ORDERSTATUS_EXPIRED = 9 # 已过期 ORDERSTATUS_SUSPENDED = 10 # 挂起 ``` <span id=ORDERREJECTREASON></span> ### ORDERREJECTREASON - 拒绝原因 ------ ```python ORDERREJECTREASON_UNKNOWN = 0 # 未知原因 ORDERREJECTREASON_RISKRULECHECKFAILED = 1 # 不符合风控规则 ORDERREJECTREASON_NOENOUGHCASH = 2 # 资金不足 ORDERREJECTREASON_NOENOUGHPOSITION = 3 # 仓位不足 ORDERREJECTREASON_ILLEGALACCOUNTID = 4 # 非法账户ID ORDERREJECTREASON_ILLEGALSTRATEGYID = 5 # 非法策略ID ORDERREJECTREASON_ILLEGALSYMBOL = 6 # 非法交易标的 ORDERREJECTREASON_ILLEGALVOLUME = 7 # 非法委托量 ORDERREJECTREASON_ILLEGALPRICE = 8 # 非法委托价 ORDERREJECTREASON_ACCOUNTDISABLED = 9 # 账户被禁止交易 ORDERREJECTREASON_ACCOUNTDISCONNECTED = 10 # 账户未连接 ORDERREJECTREASON_ACCOUNTLOGGEDOUT = 11 # 账户未登录 ORDERREJECTREASON_NOTINTRADINGSESSION = 12 # 非交易时间段 ORDERREJECTREASON_ORDERTYPENOTSUPPORTED = 13 # 委托类型不支持 ORDERREJECTREASON_THROTTLE = 14 # 流控限制 ``` <span id=EXECUTIONPOSITIONEFFECT></span> ### EXECUTIONPOSITIONEFFECT - 成交开平标记 ------ ```python EXECUTIONPOSITIONEFFECT_UNKNOWN = 0 # 不明 EXECUTIONPOSITIONEFFECT_OPEN = 1 # 开仓 EXECUTIONPOSITIONEFFECT_CLOSE = 2 # 平仓 EXECUTIONPOSITIONEFFECT_CLOSETODAY = 3 # 今平仓 ``` <span id=EXECUTIONSIDE></span> ### EXECUTIONSIDE - 成交买卖方向 ------ ```python EXECUTIONSIDE_UNKNOWN = 0 # 不明 EXECUTIONSIDE_BUY = 1 # 买入 EXECUTIONSIDE_SELL = 2 # 卖出 ``` <span id=ORDERSTOP_STOP_TYPE></span> ### ORDERSTOP_STOP_TYPE - 止损单类型 ------ ```python ORDERSTOP_STOP_TYPE_UNKNOW = 0 # 不明 ORDERSTOP_STOP_TYPE_LOSS = 1 # 止损单类型 ORDERSTOP_STOP_TYPE_PROFIT = 2 # 止盈单类型 ORDERSTOP_STOP_TYPE_TRAILING = 3 # 跟踪止盈单类型 ``` <span id=ORDERSTOP_ORDER_TYPE></span> ### ORDERSTOP_ORDER_TYPE - 止盈止损触发时的委托类型 ------ ```python ORDERSTOP_ORDER_TYPE_UNKNOWN = 0 # 不明 ORDERSTOP_ORDER_TYPE_LIMIT = 1 # 限价 ORDERSTOP_ORDER_TYPE_MARKET = 2 # 市价 ``` <span id=ORDERSTOPEXECTYPE></span> ### ORDERSTOPEXECTYPE - 止盈止损单状态 ------ ```python ORDERSTOPEXECTYPE_HOLDING = 1 # 保持 ORDERSTOPEXECTYPE_CANCELED = 2 # 已撤销 ORDERSTOPEXECTYPE_PENDINGCANCEL = 3 # 待撤销 ORDERSTOPEXECTYPE_ACTIVE = 4 # 激活 ORDERSTOPEXECTYPE_TRAILING = 5 # 追踪中 ORDERSTOPEXECTYPE_TRIGGER = 6 # 已触发 ``` <span id=FQ></span> ### FQ - 复权常量 ------ ```python FQ_NA = 0 # 不复权 FQ_FORWARD = 1 # 前复权 FQ_BACKWARD = 2 # 后复权 ``` # 其他 ### 期货主力和次主力合约 atrader已将每个期货品种的主力合约做成统一连续的标准合约,默认当日持仓量最大的合约为该品种的主力合约,标记为CODE0000,例如当日沪深300指数股指期货主力合约为IF1603,则可直接调用IF0000,次主力合约为IF1604,则可直接调用为IF0001。 |合约 |释义 |备注 |:-|:-|:-| |Code0000 |主力合约 || |Code0001 |次主力合约 || |IF0000 |中金所沪深300指数股指期货主力合约 || |IF0001 |中金所沪深300指数股指期货次主力合约 || |CU0000 |上期所铜主力合约 || |CU0001 |上期所铜次主力合约 || |M0000 |大商所豆粕主力合约 || |M0001 |大商所豆粕次主力合约 || |CF000 |郑商所棉花主力合约 |郑商所合约号码为三位| |CF001 |郑商所棉花次主力合约 |郑商所合约号码为三位| ### 期货品种代码表 |品种代码 |品种名称 |交易所 |:-|:-|:-| |A |豆一 |大连商品交易所 |B |豆二 |大连商品交易所 |BB |胶合板 |大连商品交易所 |C |玉米 |大连商品交易所 |CS |玉米淀粉 |大连商品交易所 |FB |纤维板 |大连商品交易所 |I |铁矿石 |大连商品交易所 |J |焦炭 |大连商品交易所 |JD |鸡蛋 |大连商品交易所 |JM |焦煤 |大连商品交易所 |L |LLDPE |大连商品交易所 |M |豆粕 |大连商品交易所 |P |棕榈油 |大连商品交易所 |PP |聚丙烯 |大连商品交易所 |V |聚氯乙烯 |大连商品交易所 |Y |豆油 |大连商品交易所 |AG |白银 |上海期货交易所 |AL |铝 |上海期货交易所 |AU |黄金 |上海期货交易所 |BU |石油沥青 |上海期货交易所 |CU |铜 |上海期货交易所 |FU |燃料油 |上海期货交易所 |HC |热轧卷板 |上海期货交易所 |NI |镍 |上海期货交易所 |PB |铅 |上海期货交易所 |RB |螺纹钢 |上海期货交易所 |RU |天然橡胶 |上海期货交易所 |SN |锡 |上海期货交易所 |WR |线材 |上海期货交易所 |ZN |锌 |上海期货交易所 |CF |棉花 |郑州商品交易所 |ER |早籼稻 |郑州商品交易所 |FG |玻璃 |郑州商品交易所 |GN |绿豆 |郑州商品交易所 |JR |粳稻谷 |郑州商品交易所 |LR |晚籼稻 |郑州商品交易所 |MA |甲醇 |郑州商品交易所 |ME |甲醇 |郑州商品交易所 |OI |菜籽油 |郑州商品交易所 |PM |普通小麦 |郑州商品交易所 |RI |早籼稻 |郑州商品交易所 |RM |菜籽粕 |郑州商品交易所 |RO |菜籽油 |郑州商品交易所 |RS |油菜籽 |郑州商品交易所 |SF |硅铁 |郑州商品交易所 |SM |锰硅 |郑州商品交易所 |SR |白糖 |郑州商品交易所 |TA |PTA |郑州商品交易所 |ZC |动力煤 |郑州商品交易所 |WH |强麦 |郑州商品交易所 |CY |棉纱 |郑州商品交易所 |AP |苹果 |郑州商品交易所 |IC |中证500指数股指期货 |中国金融期货交易所 |IF |沪深300指数股指期货 |中国金融期货交易所 |IH |上证50指数股指期货 |中国金融期货交易所 |T |10年期国债期货 |中国金融期货交易所 |TF |5年期国债期货 |中国金融期货交易所 |SC |原油 |上海国际能源中心
contact@digquant.com.cn

联系

邮箱

0755-8695-2080

联系

电话

关注

微信

关注

QQ

回到

顶部