目录
使用说明
新建策略
开始回测和交易前需要先新建策略,点击下图中左上角标识进行策略添加。可以选择不同的业务类型(比如股票),然后给策略设定一个名称,添加成功后可以在默认策略模板基础上进行策略编写。
新建回测
策略添加完成后就可以开始进行回测操作了。回测之前需要对开始时间、结束时间、回测资金、回测基准、回测频率几个要素进行设定,设定完毕后点击保存。然后再点击回测按键,系统就会开始运行回测,回测的评价指标、收益曲线、日志都会在界面中展现。
新建交易
交易界面点击新增按键进行新增交易操作,策略方案中的对象为所有策略列表中的策略,给本次交易设定名称并点击确定后系统就开始运行交易了。
交易开始运行后,可以实时看到总资产和可用资金情况,同时可以在交易列表查询交易状态。
交易开始运行后,可以点击交易详情,查看策略评价指标、交易明细、持仓明细、交易日志。
策略运行周期
回测支持日线级别、分钟级别运行,详见handle_data方法。
交易支持日线级别、分钟级别、tick级别运行,日线级别和分钟级别详见handle_data方法,tick级别运行详见run_interval和tick_data方法。
频率说明
- 日线级别: 当选择日线频率时,回测和交易都是每天运行一次,运行时间为每天盘后。
- 分钟级别: 当选择分钟频率时,回测和交易都是每分钟运行一次,运行时间为每根分钟K线结束。
- tick级别: 当选择tick频率时,交易最小频率可以达到3秒运行一次。
策略运行时间
盘前运行
- 9:30分钟之前为盘前运行时间
- 交易环境支持运行在run_daily中指定交易时间(如time=‘09:15’)运行的函数
- 回测环境和交易环境支持运行before_trading_start函数
盘中运行
- 9:31(回测)/9:30(交易)~15:00分钟为盘中运行时间
- 分钟级别回测环境和交易环境支持运行在run_daily中指定交易时间(如time=‘14:30’)运行的函数
- 回测环境和交易环境支持运行handle_data函数
- 交易环境支持运行run_interval函数
盘后运行
- 15:30分钟为盘后运行时间
- 回测环境和交易环境支持运行after_trading_end函数(该函数为定时运行)
- 15:00之后交易环境支持运行在run_daily中指定交易时间(如time=‘15:10’)运行的函数
交易策略委托下单时间
使用order系列接口进行股票委托下单,将直接报单到柜台。
支持的业务类型
回测支持业务类型
目前所支持的业务类型:
- 普通股票买卖(单位:股)
- 可转债买卖(单位:张,T+0)
- 融资融券担保品买卖(单位:股)
- 期货投机类型交易(单位:手,T+0)
- LOF基金买卖(单位:股)
- ETF基金买卖(单位:股)
交易支持业务类型
目前所支持的业务类型:
- 普通股票买卖(单位:股)
- 可转债买卖(具体单位请咨询券商,T+0)
- 融资融券交易(单位:股)
- ETF申赎、套利(单位:份)
- 国债逆回购(单位:份)
- 期货投机类型交易(单位:手,T+0)
- LOF基金买卖(单位:股)
- ETF基金买卖(单位:股)
- 期权交易(单位:手)
开始写策略
简单但是完整的策略
先来看一个简单但是完整的策略:
def initialize(context):
set_universe('600570.SS')
def handle_data(context, data):
pass
一个完整策略只需要两步:
- set_universe: 设置我们要操作的股票池,上面的例子中,只操作一支股票: ‘600570.SS’,恒生电子。所有的操作只能对股票池的标的进行。
- 实现一个函数: handle_data。
这是一个完整的策略,但是我们没有任何交易,下面我们来添加一些交易。
添加一些交易
def initialize(context):
g.security = '600570.SS'
# 是否创建订单标识
g.flag = False
set_universe(g.security)
def handle_data(context, data):
if not g.flag:
order(g.security, 1000)
g.flag = True
这个策略里,当我们没有创建订单时就买入1000股’600570.SS’,具体的下单API请看order函数。这里我们有了交易,但是只是无意义的交易,没有依据当前的数据做出合理的分析。
实用的策略
下面我们来看一个真正实用的策略
在这个策略里,我们会根据历史价格做出判断:
- 如果上一时间点价格高出五天平均价1%,则全仓买入
- 如果上一时间点价格低于五天平均价,则空仓卖出
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
security = g.security
sid = g.security
# 取得过去五天的历史价格
df = get_history(5, '1d', 'close', security, fq=None, include=False)
# 取得过去五天的平均价格
average_price = round(df['close'][-5:].mean(), 3)
# 取得上一时间点价格
current_price = data[sid]['close']
# 取得当前的现金
cash = context.portfolio.cash
# 如果上一时间点价格高出五天平均价1%, 则全仓买入
if current_price > 1.01*average_price:
# 用所有 cash 买入股票
order_value(g.security, cash)
log.info('buy %s' % g.security)
# 如果上一时间点价格低于五天平均价, 则空仓卖出
elif current_price < average_price and get_position(security).amount > 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(g.security, 0)
log.info('sell %s' % g.security)
模拟盘和实盘注意事项
关于持久化
为什么要做持久化处理
服务器异常、策略优化等诸多场景,都会使得正在进行的模拟盘和实盘策略存在中断后再重启的需求,但是一旦交易中止后,策略中存储在内存中的全局变量就清空了,因此通过持久化处理为量化交易保驾护航必不可少。
量化框架持久化处理
使用pickle模块保存股票池、账户信息、订单信息、全局变量g定义的变量等内容。
注意事项:
- 框架会在before_trading_start(隔日开始)、handle_data、after_trading_end事件后触发持久化信息更新及保存操作
- 券商升级/环境重启后恢复交易时,框架会先执行策略initialize函数再执行持久化信息恢复操作
- 如果持久化信息保存有策略定义的全局对象g中的变量,将会以持久化信息中的变量覆盖掉initialize函数中初始化的该变量
- 全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以’__'开头
- 涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的
- 全局变量g中以’__'开头的变量为私有变量,持久化时将不会被保存
示例:
class Test(object):
count = 5
def print_info(self):
self.count += 1
log.info("a" * self.count)
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
# 初始化无法被序列化类对象,并赋值为私有变量,落地持久化信息时跳过保存该变量
g.__test_class = Test()
def handle_data(context, data):
# 调用私有变量中定义的方法
g.__test_class.print_info()
策略中持久化处理方法
使用pickle模块保存 g 对象(全局变量)。
示例:
import pickle
from collections import defaultdict
NOTEBOOK_PATH = '/home/fly/notebook/'
'''
持仓N日后卖出,仓龄变量每日pickle进行保存,重启策略后可以保证逻辑连贯
'''
def initialize(context):
#尝试启动pickle文件
try:
with open(NOTEBOOK_PATH+'hold_days.pkl','rb') as f:
g.hold_days = pickle.load(f)
#定义空的全局字典变量
except:
g.hold_days = defaultdict(list)
g.security = '600570.SS'
set_universe(g.security)
# 仓龄增加一天
def before_trading_start(context, data):
if g.hold_days:
g.hold_days[g.security] += 1
# 每天将存储仓龄的字典对象进行pickle保存
def handle_data(context, data):
if g.security not in list(context.portfolio.positions.keys()) and g.security not in g.hold_days:
order(g.security, 100)
g.hold_days[g.security] = 1
if g.hold_days:
if g.hold_days[g.security] > 5:
order(g.security, -100)
del g.hold_days[g.security]
with open(NOTEBOOK_PATH+'hold_days.pkl','wb') as f:
pickle.dump(g.hold_days,f,-1)
策略引擎简介
业务流程框架
ptrade量化引擎以事件触发为基础,通过初始化事件(initialize)、盘前事件(before_trading_start)、盘中事件(handle_data)、盘后事件(after_trading_end)来完成每个交易日的策略任务。
initialize和handle_data是一个允许运行策略的最基础结构,也就是必选项,before_trading_start和after_trading_end是可以按需运行的。
handle_data仅满足日线和分钟级别的盘中处理,tick级别的盘中处理则需要通过tick_data或者run_interval来实现。
ptrade还支持委托主推事件(on_order_respense)、交易主推事件(on_trade_response),可以通过委托和成交的信息来处理策略逻辑,是tick级的一个补充。
除了以上的一些事件以外,ptrade也支持通过定时任务来运行策略逻辑,可以通过run_daily接口实现。
initialize(必选)
函数原型: initialize(context)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数用于初始化一些全局变量,是策略运行的唯二必须定义函数之一。
注意事项:
- 该函数只会在回测和交易启动的时候运行一次
可调用接口:
接口类型 | 函数名 | 支持场景 |
---|---|---|
设置函数 | set_universe | 回测/交易 |
设置函数 | set_benchmark | 回测/交易 |
设置函数 | set_commission | 回测 |
其他 | run_daily | 回测/交易 |
其他 | permission_test | 交易 |
参数:
context
: Context对象,存放有当前的账户及持仓信息
返回值: None
示例:
def initialize(context):
#g为全局对象
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
order('600570.SS',100)
before_trading_start(可选)
函数原型: before_trading_start(context, data)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数在每天开始交易前被调用一次,用于添加每天都要初始化的信息,如无盘前初始化需求,该函数可以在策略中不做定义。
注意事项:
- 在回测中,该函数在每个回测交易日8:30分执行
- 在交易中,该函数在开启交易时立即执行,从隔日开始每天9:10分(默认)执行
- 当在9:10前开启交易时,受行情未更新原因在该函数内调用实时行情接口会导致数据有误
参数:
context
: Context对象,存放有当前的账户及持仓信息data
:保留字段暂无数据
返回值: None
示例:
def initialize(context):
#g为全局变量
g.security = '600570.SS'
set_universe(g.security)
def before_trading_start(context, data):
log.info(g.security)
def handle_data(context, data):
order('600570.SS',100)
handle_data(必选)
函数原型: handle_data(context, data)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数在交易时间内按指定的周期频率运行,是用于处理策略交易的主要模块,根据策略保存时的周期参数分为每分钟运行和每天运行,是策略运行的唯二必须定义函数之一。
注意事项:
- 该函数每个单位周期执行一次
- 如果是日线级别策略,每天执行一次。股票回测场景下,在15:00执行;股票交易场景下,执行时间为券商实际配置时间
- 如果是分钟级别策略,每分钟执行一次,股票回测场景下,执行时间为9:31 – 15:00,股票交易场景下,执行时间为9:30 – 14:59
- 回测与交易中,handle_data函数不会在非交易日触发
参数:
context
: Context对象,存放有当前的账户及持仓信息data
:一个字典(dict),key是标的代码,value是当时的SecurityUnitData对象,存放当前周期(日线策略,则是当天;分钟策略,则是这一分钟)的数据
注意: 为了加速,data中的数据只包含股票池中所订阅标的的信息,可使用data[security]的方式来获取当前周期对应的标的信息
返回值: None
示例:
def initialize(context):
#g为全局变量
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
order('600570.SS',100)
after_trading_end(可选)
函数原型: after_trading_end(context, data)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数会在每天交易结束之后调用,用于处理每天收盘后的操作,如无盘后处理需求,该函数可以在策略中不做定义。
注意事项:
- 该函数只会执行一次
- 该函数执行时间为由券商配置决定,一般为15:30
参数:
context
: Context对象,存放有当前的账户及持仓信息data
:保留字段暂无数据
返回值: None
示例:
def initialize(context):
#g为全局变量
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
order('600570.SS',100)
def after_trading_end(context, data):
log.info(g.security)
tick_data(可选)
函数原型: tick_data(context, data)
使用场景: 该函数仅交易模块可用
接口说明: 该函数可以用于处理tick级别策略的交易逻辑,每隔3秒执行一次,如无tick处理需求,该函数可以在策略中不做定义。
注意事项:
- 该函数执行时间为9:30 – 14:59
- 该函数中的data和handle_data函数中的data是不一样的,请勿混肴
- 参数data中包含的逐笔委托,逐笔成交数据需开通level2行情才能获取到数据,否则对应数据返回None
- 参数data中的tick数据取自get_snapshot()并转换为DataFrame格式,如要更快速的获取快照强烈建议直接使用get_snapshot()获取
- 当调用set_parameters()并设置tick_data_no_l2="1"时,参数data中将不包含逐笔委托、逐笔成交字段,当券商有l2行情时配置该参数可提升data取速
- 当策略执行时间超过3s时,将会丢弃中间堵塞的tick_data
- 在收盘后,将会清空队列中未执行的tick_data
参数:
context
: Context对象,存放有当前的账户及持仓信息data
: 一个字典(dict),key为对应的标的代码(如:‘600570.SS’),value为一个字典(dict),包含order(逐笔委托)、tick(当前tick数据)、transcation(逐笔成交)三项
数据结构:
{'股票代码':
{
'order(最近一条逐笔委托)':DataFrame/None,
'tick(当前tick数据)':DataFrame,
'transcation(最近一条逐笔成交)':DataFrame/None,
}
}
返回值: None
示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def tick_data(context,data):
# 获取买一价
security = g.security
current_price = eval(data[security]['tick']['bid_grp'][0])[1][0]
log.info(current_price)
if current_price > 38.19:
# 按买一档价格下单
order_tick(security, 100, 1)
def handle_data(context, data):
pass
策略API介绍
设置函数
set_universe - 设置股票池
函数原型: set_universe(security_list)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数用于设置或者更新此策略要操作的股票池。
注意事项: 股票策略中,该函数只用于设定get_history函数的默认security_list入参, 除此之外并无其他用处,因此为非必须设定的函数。
参数:
security_list
: 股票列表,支持单支或者多支股票(list[str]/str)
返回值: None
示例:
def initialize(context):
g.security = ['600570.SS','600571.SS']
# 将g.security中的股票设置为股票池
set_universe(g.security)
def handle_data(context, data):
# 获取初始化设定的股票池行情数据
his = get_history(5, '1d', 'close', security_list=None)
set_benchmark - 设置基准
函数原型: set_benchmark(sids)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数用于设置策略的比较基准,前端展现的策略评价指标都基于此处设置的基准标的。
注意事项: 此函数只能在initialize使用。
参数:
security
:股票/指数/ETF代码(str)
默认设置: 如果不做基准设置,默认选定沪深300指数(000300.SS)的每日价格作为判断策略好坏和一系列风险值计算的基准。如果要指定其他股票/指数/ETF的价格作为基准,就需要使用set_benchmark。
返回值: None
示例:
def initialize(context):
g.security = '000001.SZ'
set_universe(g.security)
#将上证50(000016.SS)设置为参考基准
set_benchmark('000016.SS')
def handle_data(context, data):
order('000001.SZ',100)
定时周期性函数
run_daily - 按日周期处理
函数原型: run_daily(context, func, time='9:31')
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该函数用于以日为单位周期性运行指定函数,可对运行触发时间进行指定。
注意事项:
- 该函数只能在初始化阶段initialize函数中调用
- 该函数可以多次设定,以实现多个定时任务
- 股票策略回测中,当回测周期为分钟时,time的取值指定在09:3111:30与13:0015:00之间,当回测周期为日时,无论设定值是多少都只会在15:00执行;交易中不受此时间限制
参数:
context
: Context对象,存放有当前的账户及持仓信息(Context)func
:自定义函数名称,此函数必须以context作为参数(Callable[[Context], None])time
:指定周期运行具体触发运行时间点,交易场景可设置范围:00:00~23:59,必传字段
返回值: None
示例:
# 定义一个财务数据获取函数,每天执行一次
def initialize(context):
run_daily(context, get_finance, time='9:31')
g.security = '600570.SS'
set_universe(g.security)
def get_finance(context):
re = get_fundamentals(g.security,'balance_statement','total_assets')
log.info(re)
def handle_data(context, data):
pass
run_interval - 按设定周期处理
函数原型: run_interval(context, func, seconds=10)
使用场景: 该函数仅在交易模块可用
接口说明: 该函数用于以设定时间间隔(单位为秒)周期性运行指定函数,可对运行触发时间间隔进行指定。
注意事项:
- 该函数只能在初始化阶段initialize函数中调用
- 该函数可以多次设定,会以多个线程并行运行,但要小心不同线程之间的逻辑关联处理
- seconds设置最小时间间隔为3秒,小于3秒默认设定为3秒
参数:
context
: Context对象,存放有当前的账户及持仓信息(Context)func
:自定义函数名称,此函数必须以context作为参数(Callable[[Context], None])seconds
:设定时间间隔(单位为秒),取值为正整数(int)
返回值: None
示例:
# 定义一个周期处理函数,每10秒执行一次
def initialize(context):
run_interval(context, interval_handle, seconds = 10)
g.security = '600570.SS'
set_universe(g.security)
def interval_handle(context):
snapshot = get_snapshot(g.security)
log.info(snapshot)
def handle_data(context, data):
pass
获取信息函数
get_trading_day - 获取交易日期
函数原型: get_trading_day(day)
使用场景: 该函数在研究、回测、交易模块可用
接口说明: 该函数用于获取当前时间数天前或数天后的交易日期。
注意事项:
- 默认情况下,回测中当前时间为策略中调用该接口的回测日日期(context.blotter.current_dt)
- 默认情况下,研究中当前时间为调用当天日期
- 默认情况下,交易中当前时间为调用当天日期
参数:
day
:表示天数,正的为数天后,负的为数天前,day取0表示获取当前交易日,如果当前日期为非交易日则返回下一交易日的日期。day默认取值为0,不建议获取交易所还未公布的交易日期(int)
返回值: date:datetime.date日期对象
示例:
def initialize(context):
g.security = ['600670.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 获取后一天的交易日期
previous_trading_date = get_trading_day(1)
log.info(previous_trading_date)
# 获取前一天的交易日期
next_trading_date = get_trading_day(-1)
log.info(next_trading_date)
交易相关函数
order - 按数量买卖
函数原型: order(security, amount, limit_price=None)
使用场景: 该函数仅在回测、交易模块可用
接口说明: 该接口用于买卖指定数量为amount的股票,同时支持国债逆回购
注意事项:
- 支持交易场景的逆回购交易。委托方向为卖出(amount必须为负数),逆回购最小申购金额为1000元(10张),因此本接口amount入参应大于等于10(10张),否则会导致委托失败
- 回测场景,amount有最小下单数量校验,股票、ETF、LOF:100股,可转债:10张;交易场景接口不做amount校验,直接报柜台
- 交易场景如果limit_price字段不入参,系统会默认用行情快照数据最新价报单,假如行情快照获取失败会导致委托失败,系统会在日志中增加提醒
- 由于下述原因,回测中实际买入或者卖出的股票数量有时候可能与委托设置的不一样,针对上述内容调整,系统会在日志中增加警告信息
参数:
security
: 股票代码(str)amount
: 交易数量,正数表示买入,负数表示卖出(int)limit_price
:买卖限价(float)
返回值: Order对象中的id或者None。如果创建订单成功,则返回Order对象的id,失败则返回None(str)
示例:
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
#以系统最新价委托
order('600570.SS', 100)
# 逆回购1000元
order('131810.SZ', -10)
#以39块价格下一个限价单
order('600570.SS', 100, limit_price=39)
对象
g - 全局对象
使用场景: 该对象仅支持回测、交易模块。
对象说明: 全局对象g,用于存储用户的各类可被不同函数(包括自定义函数)调用的全局数据
示例:
def initialize(context):
g.security = "600570.SS"
g.count = 1
g.flag = 0
set_universe(g.security)
def handle_data(context, data):
log.info(g.security)
log.info(g.count)
log.info(g.flag)
Context - 上下文对象
使用场景: 该对象仅支持回测、交易模块。
对象说明: 类型为业务上下文对象
内容:
capital_base
– 起始资金previous_date
–- 前一个交易日sim_params
– SimulationParameters对象capital_base
– 起始资金data_frequency
– 数据频率
portfolio
– 账户信息,可参考Portfolio对象initialized
– 是否执行初始化slippage
– 滑点,VolumeShareSlippage对象volume_limit
– 成交限量price_impact
– 价格影响力
commission
– 佣金费用,Commission对象tax
—印花税费率cost
—佣金费率min_trade_cost
—最小佣金
blotter
– Blotter对象(记录)current_dt
– 当前单位时间的开始时间,datetime.datetime对象(北京时间)
recorded_vars
– 收益曲线值
示例:
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
#获得当前回测相关时间
pre_date = context.previous_date
log.info(pre_date)
year = context.blotter.current_dt.year
log.info(year)
month = context.blotter.current_dt.month
log.info(month)
day = context.blotter.current_dt.day
log.info(day)
hour = context.blotter.current_dt.hour
log.info(hour)
minute = context.blotter.current_dt.minute
log.info(minute)
second = context.blotter.current_dt.second
log.info(second)
#得到"年-月-日"格式
date = context.blotter.current_dt.strftime("%Y-%m-%d")
log.info(date)
#得到周几
weekday = context.blotter.current_dt.isoweekday()
log.info(weekday)
Portfolio 对象
使用场景: 该对象仅支持回测、交易模块。
对象说明: 对象数据包含账户当前的资金,标的信息,即所有标的操作仓位的信息汇总
内容:
股票账户返回:
cash
当前可用资金(不包含冻结资金)positions
当前持有的标的(包含不可卖出的标的),dict类型,key是标的代码,value是Position对象portfolio_value
当前持有的标的和现金的总价值positions_value
持仓价值capital_used
已使用的现金returns
当前的收益比例, 相对于初始资金pnl
浮动盈亏start_date
开始时间
期货账户返回:
cash
当前可用资金(不包含冻结资金)positions
当前持有的标的(包含不可卖出的标的),dict类型,key是标的代码,value是Position对象portfolio_value
当前持有的标的和现金的总价值positions_value
持仓价值capital_used
已使用的现金returns
当前的收益比例, 相对于初始资金pnl
浮动盈亏start_date
开始时间
期权账户返回:
cash
当前可用资金(不包含冻结资金)positions
当前持有的标的(包含不可卖出的标的),dict类型,key是标的代码,value是Position对象portfolio_value
当前持有的标的和现金的总价值positions_value
持仓价值returns
当前的收益比例, 相对于初始资金pnl
浮动盈亏margin
保证金risk_degree
风险度start_date
开始时间
示例:
def initialize(context):
g.security = "600570.SS"
set_universe([g.security])
def handle_data(context, data):
log.info(context.portfolio.portfolio_value)
策略示例
集合竞价追涨停策略
def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
#每天9:23分运行集合竞价处理函数
run_daily(context, aggregate_auction_func, time='9:23')
def aggregate_auction_func(context):
stock = g.security
#最新价
snapshot = get_snapshot(stock)
price = snapshot[stock]['last_px']
#涨停价
up_limit = snapshot[stock]['up_px']
#如果最新价不小于涨停价,买入
if float(price) >= float(up_limit):
order(g.security, 100, limit_price=up_limit)
def handle_data(context, data):
pass
双均线策略
def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def handle_data(context, data):
security = g.security
#得到十日历史价格
df = get_history(10, '1d', 'close', security, fq=None, include=False)
# 得到五日均线价格
ma5 = round(df['close'][-5:].mean(), 3)
# 得到十日均线价格
ma10 = round(df['close'][-10:].mean(), 3)
# 取得昨天收盘价
price = data[security]['close']
# 得到当前资金余额
cash = context.portfolio.cash
# 如果当前有余额,并且五日均线大于十日均线
if ma5 > ma10:
# 用所有 cash 买入股票
order_value(security, cash)
# 记录这次买入
log.info("Buying %s" % (security))
# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(security).amount > 0:
# 全部卖出
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
支持的三方库
序号 | 三方库名称 | 版本号 |
---|---|---|
1 | APScheduler | 3.3.1 |
2 | arch | 3.2 |
3 | beautifulsoup4 | 4.6.0 |
4 | numpy | 1.11.2 |
5 | pandas | 0.23.4 |
6 | matplotlib | 1.5.3 |
7 | scikit-learn | 0.18 |
8 | scipy | 0.18.0 |
9 | tensorflow | 1.3.0rc1 |
10 | Keras | 2.2.4 |
… | … | … |
注:完整列表包含112个三方库,此处仅显示部分重要库
接口版本变动
当前版本: PBOXQT1.0V202202.01.016
主要版本变动
PBOXQT1.0V202201.00.000
- get_individual_transcation()新增返回buy_no(叫买方编号)、sell_no(叫卖方编号)等字段
- get_price()、get_history()新增支持:1月(mo)、1季度(1q)、1年(1y)频率行情获取
- 新增支持期货日盘回测功能、期货日盘交易功能
- 新增get_tick_direction()获取分时成交行情
- 新增get_sort_msg()获取版块、行业的涨幅排名
- 新增permission_test()权限校验
PBOXQT1.0V202202.01.000
- 委托流程调整,交易模式中非交易时间段内产生的委托直接发送柜台进行处理
- 优化tick_data触发逻辑:当策略执行时间超过3s时,将会丢弃中间堵塞的tick_data
- 交易场景中新增支持期权业务
- 新增多个期权相关API接口
- 新增set_parameters()设置策略配置参数
本文档最后更新:2022年2月