RiceQuant米筐量化回测框架介绍

RiceQuant米筐量化回测框架介绍

一、RiceQuant平台

二、策略创建流程

1.1 创建策略

1.2 策略界面

2 完成一个策略所需做的事

  • 选择策略的运行基本条件:

    • 运行区间、初始资金
    • 回测频率
  • 编写策略:
    • 选择的股票池
    • 获取股票的行情、基本面数据
    • 交易时间、数量的设置
  • 分析回测结果:
    • 策略指标的分析
2.1策略初始设置
  • 基础设置:指定回测的起止日期、初始资金及回测频率

    • 起止日期:策略运行的时间区间(自动选择交易日)
    • 初始资金:用于策略投资的总资金
    • 回测频率:日回测or分钟回测,股票量化一般选择日回测(股票不可卖空)
  • 高级设置

2.2策略主体运行流程

  • init方法:实现策略初始化逻辑

    • 股票池的选择
  • before方法:执行每日开盘前的操作
    • 获取历史行情数据
    • 获取当前账户信息
  • handle_bar方法:实现策略的具体逻辑
    • 交易信号的产生
    • 交易订单的创建
2.3策略回测结果的分析
  • 收益指标
  • 风险指标

三、基本数据获取接口

1、数据接口种类:

  • industry():行业股票列表的获取
  • sector():板块股票列表的获取
  • index_components():指数成分股列表的获取
  • history_bar():某一股票历史行情数据的获取
  • get_fundamentals():股票财务数据的获取

1.1 行业股票列表的获取

industry(code)	#获得属于某一行业的所有股票列表
参数
参数 类型 注释
code str OR industry_code item 行业名称或行业代码。例如,农业可填写industry_code.A01‘A01‘
返回

获得属于某一行业的所有股票的order_book_id list。

范例
def init(context):
    stock_list = industry(‘A01‘)
    logger.info("农业股票列表:" + str(stock_list))

1.2 板块股票列表的获取

sector(code)

获得属于某一板块的所有股票列表。

参数
参数 类型 注释
code str OR sector_code items 板块名称或板块代码。例如,能源板块可填写‘Energy‘‘能源‘或sector_code.Energy
返回

属于该板块的股票order_book_id或order_book_id list.

范例
def init(context):
    ids1 = sector("consumer discretionary")
    ids2 = sector("非必需消费品")
    ids3 = sector("ConsumerDiscretionary")
    assert ids1 == ids2 and ids1 == ids3
    logger.info(ids1)

1.3 指数成分股列表的获取

index_components(order_book_id, date=None)

获取某一指数的股票构成列表,也支持指数的历史构成查询。

参数
参数 类型 说明
order_book_id str 指数代码,可传入order_book_id
date str, date, datetime, pandas Timestamp 查询日期,默认为策略当前日期。如指定,则应保证该日期不晚于策略当前日期
返回

构成该指数股票的order_book_id list

1.4 某一股票历史行情数据的获取

history_bars(order_book_id, bar_count, frequency, fields=None, skip_suspended=True, include_now=False)

获取指定合约的历史行情,同时支持日以及分钟历史数据。不能在init中调用。

参数
参数 类型 注释
order_book_id str 合约代码,必填项
bar_count int 获取的历史数据数量,必填项
frequency str 获取数据什么样的频率进行。‘1d‘或‘1m‘分别表示每日和每分钟,必填项。您可以指定不同的分钟频率,例如‘5m‘代表5分钟线
fields str OR str list 返回数据字段。必填项。见下方列表
skip_suspended bool 是否跳过停牌,默认True,跳过停牌
include_now bool 是否包括不完整的bar数据。默认为False,不包括。举例来说,在09:39的时候获取上一个5分钟线,默认将获取到09:3109:35合成的5分钟线。如果设置为True,则将获取到09:3609:39之间合成的"不完整"5分钟线
返回

ndarray ,方便直接与talib等计算库对接,效率较history返回的DataFrame更高。

获取到的字段
fields 字段名
datetime 时间戳
open 开盘价
high 最高价
low 最低价
close 收盘价
volume 成交量
total_turnover 成交额
datetime int类型时间戳
open_interest 持仓量(期货专用)
basis_spread 期现差(股指期货专用)
settlement 结算价(期货日线专用)
prev_settlement 结算价(期货日线专用)
范例
# 如果想在今天运行,获取从几天开始前几天一些数据
# 获取前5天的收盘价,开盘价
# 股票代号,间隔,频率,交易指标
data = history_bars(context.s1, 5, ‘1d‘, ‘close‘)

# 获取多个指标
data = history_bars(context.s1, 5, ‘1d‘, [‘close‘, ‘open‘])

# 如果回测是每日的,不支持获取分钟数据
data = history_bars(context.s1, 5, ‘1m‘, [‘close‘, ‘open‘])

1.5 获取股票当前价格

bar_dict[].item  #只能获取当前运行日期的,不能获取之前日期
Bar_dict对象
属性 类型 注释
order_book_id str 合约代码
symbol str 合约简称
datetime datetime.datetime 时间戳
open float 开盘价
close float 收盘价
high float 最高价
low float 最低价
volume float 成交量
total_turnover float 成交额
prev_close float 昨日收盘价
limit_up float 涨停价
limit_down float 跌停价
isnan bool 当前bar数据是否有行情。例如,获取已经到期的合约数据,isnan此时为True
suspended bool 是否全天停牌
prev_settlement float 昨结算(期货日线数据专用)
settlement float 结算(期货日线数据专用)
范例
# 获取上文中s1股票今天收盘价数据
logger.info(bar_dict[context.s1].close)
注:
  • 在股票策略中bar_dict对象可以拿到所有股票合约的bar信息
  • bar_dict只能获取当前运行日期的,不能获取之前日期

1.6 股票财务数据的获取

get_fundamentals(query, entry_date=None, interval=‘1d‘, report_quarter=False)

获取历史财务数据表格。目前支持中国市场超过400个指标,具体请参考财务数据文档。目前仅支持中国市场。需要注意,一次查询过多股票的财务数据会导致系统运行缓慢。(entry_date在回测当中不去要提供)

参数
参数 类型 说明
query SQLAlchemyQueryObject SQLAlchmey的Query对象。其中可在‘query‘内填写需要查询的指标,‘filter‘内填写数据过滤条件。具体可参考 sqlalchemy‘s query documentation学习使用更多的方便的查询语句。从数据科学家的观点来看,sqlalchemy的使用比sql更加简单和强大
entry_date str, datetime.date, datetime.datetime, pandasTimestamp 查询财务数据的基准日期,应早于策略当前日期。默认为策略当前日期前一天。
interval str 查询财务数据的间隔,默认为‘1d‘。例如,填写‘5y‘,则代表从entry_date开始(包括entry_date)回溯5年,返回数据时间以为间隔。‘d‘ - 天,‘m‘ - 月, ‘q‘ - 季,‘y‘ - 年
report_quarter bool 是否显示报告期,默认为False,不显示。‘Q1‘ - 一季报,‘Q2‘ - 半年报,‘Q3‘ - 三季报,‘Q4‘ - 年报
返回

pandas DataPanel 如果查询结果为空,返回空pandas DataFrame 如果给定间隔为1d, 1m, 1q, 1y,返回pandas DataFrame

范例
# 获取财务数据,默认获取的是dataframe,entry_date在回测当中不去要提供,默认为策略当前日期前一天
fund = get_fundamentals(q)

2 获取财务指标——query查询

fundamentals是一个重要的对象,其中包括了估值指标表(eod_derivative_indicator),财务指标表(financial_indicator),利润表(income_statement),资产负债表(balance_sheet),现金流量表(cash_flow_statement)以及股票列表(stock_code)等内容。结合SQLAlchemy的查找方式,能够满足用户多种查找需求。

通过fundamentals获取以上的属性

q = query(fundamentals.eod_derivative_indicator.pe_ratio)
2.1过滤指标条件
  • query().filter:过滤大小
  • query().order_by:排序
  • query().limit():限制数量
  • fundamentals.stockcode.in_():在指定的股票池当中过滤
范例
# 增加条件过滤掉不符合的股票代码
# 默认直接获取A股是所有的股票这个指标数据
# order_by默认是升序
# limit:选择固定数量的股票,获取20个股票交易
q = query(fundamentals.eod_derivative_indicator.pe_ratio,
             fundamentals.eod_derivative_indicator.pcf_ratio).filter(
                 fundamentals.eod_derivative_indicator.pe_ratio > 20,
                 fundamentals.eod_derivative_indicator.pcf_ratio > 15,
                 ).order_by(
                     fundamentals.eod_derivative_indicator.pe_ratio
                     ).limit(20)

# 想要从沪深300指数的一些股票去进行筛选
# 通过fundamentals.stockcode.in_去限定股票池
    q = query(fundamentals.eod_derivative_indicator.pe_ratio,
             fundamentals.eod_derivative_indicator.pcf_ratio).filter(
                 fundamentals.eod_derivative_indicator.pe_ratio > 20,
                 ).order_by(
                     fundamentals.eod_derivative_indicator.pe_ratio
                     ).filter(
                         fundamentals.stockcode.in_(context.hs300)
                         ).limit(20)

# 获取财务数据,默认获取的是dataframe,entry_date在回测当中不去要提供
fund = get_fundamentals(q)

3 定时获取数据——scheduler定时器

  • scheduler.run_daily - 每天运行
  • scheduler.run_weekly - 每周运行
  • scheduler.run_monthly - 每月运行
3.1.1 scheduler.run_daily - 每天运行
scheduler.run_daily(function)

每日运行一次指定的函数,只能在init内使用

  • schedule一定在其对应时间点的handle_bar之前执行,如果定时运行函数运行时间较长,则中间的handle_bar事件将会被略过。
参数
参数 类型 注释
function function 使传入的function每日运行。注意function函数一定要包含(并且只能包含)context, bar_dict两个输入参数
返回

3.1.2 scheduler.run_monthly - 每月运行
scheduler.run_monthly(function,tradingday=t)

每月运行一次指定的函数,只能在init内使用

  • tradingday的负数表示倒数。
  • tradingday表示交易日,如某月只有三个交易日,则此月的tradingday=3与tradingday=-1表示同一。
参数
参数 类型 注释
function function 使传入的function每日交易开始前运行。注意function函数一定要包含(并且只能包含)context, bar_dict两个输入参数
tradingday int 范围为[-23,1], [1,23] ,例如,1代表每月第一个交易日,-1代表每月倒数第一个交易日,用户必须指定
返回

3.2 添加定时器之后的策略运行顺序

四、基本回测交易接口

1、股票交易接口

1.1 order_shares - 指定股数交易(股票专用)
order_shares(id_or_ins, amount, style=MarketOrder())

#落指定股数的买/卖单,最常见的落单方式之一。如有需要落单类型当做一个参量传入,如果忽略掉落单类型,那么默认是市价单(market order)
参数
参数 类型 注释
id_or_ins str或instrument对象 order_book_id或symbol或instrument对象,用户必须指定
amount float-required 需要落单的股数。正数代表买入,负数代表卖出。将会根据一手xx股来向下调整到一手的倍数,比如中国A股就是调整成100股的倍数。
style OrderType 订单类型,默认是市价单。目前支持的订单类型有:style=MarketOrder() and style=LimitOrder(limit_price)
返回

Order对象

范例
  • 购买Buy 2000 股的平安银行股票,并以市价单发送:
order_shares(‘000001.XSHE‘, 2000)
  • 卖出2000股的平安银行股票,并以市价单发送:
order_shares(‘000001.XSHE‘, -2000)
  • 购买1000股的平安银行股票,并以限价单发送,价格为¥10:
order_shares(‘000001.XSHE‘, 1000, style=LimitOrder(10))
1.2 order_target_value - 目标价值下单(股票专用)
order_target_value(id_or_ins, cash_amount, style=OrderType)

#买入/卖出并且自动调整该证券的仓位到一个目标价值(暂不支持卖空)。如果还没有任何该证券的仓位,那么会买入全部目标价值的证券。如果已经有了该证券的仓位,则会买入/卖出调整该证券的现在仓位和目标仓位的价值差值的数目的证券。需要注意,如果资金不足,该API将不会创建发送订单。
参数
参数 类型 注释
id_or_ins str或instrument对象 order_book_id或symbol或instrument object,用户必须指定
cash_amount float-required 最终的该证券的仓位目标价值
style OrderType 订单类型,默认是市价单。目前支持的订单类型有:style=MarketOrder()style=LimitOrder(limit_price)
返回

Order对象

范例
  • 如果现在的投资组合中持有价值¥3000的平安银行股票的仓位并且设置其目标价值为¥10000,以下代码范例会发送价值¥7000的平安银行的买单到市场。(向下调整到最接近每手股数即100的倍数的股数):
order_target_value(‘000001.XSHE‘, 10000)
1.3 order_target_percent - 目标比例下单(股票专用)
order_target_percent(id_or_ins, percent, style=OrderType)

#买入/卖出证券以自动调整该证券的仓位到占有一个指定的投资组合的目标百分比(暂不支持卖空,如果资金不足,该API将不会创建发送订单)。

#投资组合价值等于所有已有仓位的价值和剩余现金的总和。买/卖单会被下舍入一手股数(A股是100的倍数)的倍数。目标百分比应该是一个小数,并且最大值应该<=1,比如0.5表示50%。
参数
参数 类型 注释
id_or_ins str或instrument对象 order_book_id或symbol或instrument object,用户必须指定
percent float-required 仓位最终所占投资组合总价值的目标百分比。
style OrderType 订单类型,默认是市价单。目前支持的订单类型有:style=MarketOrder()style=LimitOrder(limit_price)
返回

order对象

范例
  • 如果投资组合中已经有了平安银行股票的仓位,并且占据目前投资组合的10%的价值,那么以下代码会买入平安银行股票最终使其占据投资组合价值的15%:
order_target_percent(‘000001.XSHE‘, 0.15)
1.4 交易注意事项

出现以下情况,我们的交易会被回测平台自动拒单:

  • portfolio内可用资金不足
  • 下单数量不足一手(股票为100股)
  • 下单价格超过当日涨跌停板限制
  • 当前可卖(可平)仓位不足
  • 股票当日停牌
  • 合约已经退市(到期)或尚未上市

五、投资组合操作接口

1、投资组合定义

投资组合是由投资人或金融机构所持有的股票、债券、金融衍生产品等组成的集合,目的是分散风险。

2、查看投资组合的信息——context属性

context属性中就包含了投资组合的信息

  • now - 当前时间
context.now

#使用以上的方式就可以在handle_bar中拿到当前的bar的时间,比如day bar的话就是那天的时间,minute bar的话就是这一分钟的时间点。
  • portfolio - 投资组合信息
context.portfolio

#该投资组合在单一股票或期货策略中分别为股票投资组合和期货投资组合。在股票+期货的混合策略中代表汇总之后的总投资组合。
  • stock_account - 股票资金账户信息
context.stock_account

#获取股票资金账户信息。
2.1 context.portfolio对象
  • portfolio对象 资产组合(总资产)
属性 类型 注释
cash *float* 可用资金,为子账户可用资金的加总
frozen_cash float 冻结资金,为子账户冻结资金加总
total_returns float 投资组合至今的累积收益率
daily_returns float 投资组合每日收益率
daily_pnl float 当日盈亏,子账户当日盈亏的加总
market_value *float* 投资组合当前的市场价值,为子账户市场价值的加总
total_value *float* 总权益,为子账户总权益加总
units float 份额。在没有出入金的情况下,策略的初始资金
unit_net_value float 单位净值
static_unit_net_value float 静态单位权益
transaction_cost float 当日费用
pnl float 当前投资组合的累计盈亏
start_date datetime.datetime 策略投资组合的回测/实时模拟交易的开始日期
annualized_returns float 投资组合的年化收益率
positions *dict* 一个包含所有仓位的字典,以order_book_id作为键,position对象作为值,关于position的更多的信息可以在下面的部分找到。
2.1.1 context.portfolio.position对象

position就代表着当前我们的仓位中有哪些股票正持有,position.keys()可以获取

  • 股票position对象 (持仓)
属性 类型 注释
order_book_id str 合约代码
quantity *int* 当前持仓股数
pnl float 持仓累计盈亏
sellable int 该仓位可卖出股数。T+1的市场中sellable = 所有持仓-今日买入的仓位
market_value float 获得该持仓的实时市场价值
value_percent float 获得该持仓的实时市场价值在总投资组合价值中所占比例,取值范围[0, 1]
avg_price float 平均建仓成本

3、范例

# 查看我们的投资组合信息,仓位、资金
# 查看股票账户信息
logger.info("股票账户信息:")
logger.info(context.stock_account)

# 卖出股票就要从持有的这些股票当中去选择
logger.info(context.portfolio.positions)

# 交易的价格计算
# 当日的:close * 股数
logger.info("投资组合的资金:%f" % context.portfolio.cash)
logger.info("投资组合的市场价值:%f" % context.portfolio.market_value)
logger.info("投资组合的总价值:%f" % context.portfolio.total_value)

六、策略回测评价指标

1、收益指标

1.1 回测收益率

1.2 年化收益率

1.3 基准收益率

2、风险指标

2.1 最大回撤

2.2 单位风险收益——夏普比率

  • 举例而言,假如国债的回报是4%,而您的投资组合预期回报是16%,您的投资组合的标准偏差是5%,那么用16%-4%,可以得出12%(代表您超出无风险投资的回报),再用12%÷5%=2.4,代表投资者风险每增长1%,换来的是2.4%的多余收益。夏普比率越大,说明单位风险所获得的风险回报越高。
  • 最终夏普比率越高越好,达到1.5以上已经是很好的结果

原文地址:https://www.cnblogs.com/lizhihang/p/12611652.html

时间: 2024-10-03 22:40:00

RiceQuant米筐量化回测框架介绍的相关文章

量化学习 | GTquant量化回测框架之双均线策略(一)

做过量化投资或者对量化投资感兴趣的朋友想必对双均线策略是非常熟悉了. 作为技术分析中最基本的策略,双均线策略大概就是新手村的第一个任务,所以作为本系列第一篇,我们也从双均线策略开始吧! 双均线策略是非常经典的趋势交易策略,它的构造方式也非常简单:计算长期和短期均线,短线上穿长线则是买入信号,反之则为卖出信号.别看它简单,有的基金公司就是靠这两条线,赚了很多的钱呢! 均线,顾名思义就是平均线(好像说了一句废话..) 举个例子??,5日均线就是对前五日股票收盘价进行平均.比如下图中,蓝线为某股票每日

量化投资策略:常见的几种Python回测框架(库)

量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量化策略方向,研究了Zipline一段时间,但是后续发现他仅支持美国股票,收集量化策略文章,转载到博客中. 在实盘交易之前,必须对量化交易策略进行回测.在此,我们评价一下常用的Python回测框架(库).评价的尺度包括用途范围(回测.虚盘交易.实盘交易),易用程度(结构良好.文档完整)和扩展性(速度快

用Python徒手撸一个股票回测框架

通过纯Python完成股票回测框架的搭建. 什么是回测框架? 无论是传统股票交易还是量化交易,无法避免的一个问题是我们需要检验自己的交易策略是否可行,而最简单的方式就是利用历史数据检验交易策略,而回测框架就是提供这样的一个平台让交易策略在历史数据中不断交易,最终生成最终结果,通过查看结果的策略收益,年化收益,最大回测等用以评估交易策略的可行性. 代码地址在最后. 本项目并不是一个已完善的项目, 还在不断的完善. 回测框架 回测框架应该至少包含两个部分, 回测类, 交易类.回测类提供各种钩子函数,

市场回测与对冲套利

市场回测与对冲套利 冲套利交易:买入某种商品(合约),同时卖出的另一种商品(合约) ,赚取合约的价差. 套利交易特点:逻辑性 从套利机制上讲,商品期货的套利划分为两种套利类型:内因套利和关联套利 内因套利:是指当商品期货投资对象间价格关系因某种原因过分背离时,通过内在纠正力量而产生的套利行为. 例如:大豆和豆油期货的价格同向波动 :黄金和珠宝 关联套利:是指套利对象之间没有必然的内因约束,但价格受共同因素所主导,但受影响的程度不同,通过两种对象对同一影响因素表现不同而建立的套利关系称之为关联套利

Foundation框架介绍

1.Foundation框架介绍 什么是框架? 众多功能\API的集合 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易,在OS X下的Mac操作系统中大约有80个框架,为所有程序开发奠定基础的框架称为Foundation 框架 Foundation框架的作用 Foundation框架是Mac\iOS中其他框架的基础 Foundation框架包含了很多开发中常用的数据类型: 结构体 枚举 类 如何使用Foundation框架 Foundation框架中大约有

如何在程序开发项目中选择合适的 JavaScript 框架,节省时间和成本的9款极佳的JavaScript框架介绍

从技术上来看,iOS,Android 和 Windows Phone 上的移动应用是使用不同的程序语言开发的,iOS 应用使用 Objective-C,Android 应用使用 Java,而 Windows Phone 应用使用 .NET. .随着 JavaScript,CSS 和 HTML 知识技能的提升,相信你也可以构建一个超赞的移动应用.在这篇博客里,我们将会介绍一些极好的 JavaScript 移动应用程序开发框架. 说到网络开发,就不得不说 JavaScript,这是一款很有前途的程序

用Python编写的第一个回测程序

2016-08-06 1 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): 2 import datetime 3 fmt= '%Y_%m_%d_%H_%M_%S' 4 now = datetime.datetime.now() 5 fname_savfig = fn_prefix1 + fn_prefix2 + now.strftime(fmt)+ '.png' 6 figureObj.savefig(fname_

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 2015-04-05 15:25 2482人阅读 评论(1) 收藏 举报开源框架 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.      下载:https://github.com/mwaterfall/MWPhotoBrowser目前比较活跃的社区仍旧是Github,

ERPSYSTEM开发教程01 框架介绍

从今天开始我将给大家带来一套有关Delphi开发的教程 主要开发ERP软件 我个人觉得,ERP软件的开发,技术层面的不是最大问题, 而是对客户需求的认知程度以及如何管理复杂多样的需求. 因此一个开发框架显得非常重要! 这里我推荐一套来自网络的开源框架 Tangram Plugin Framework 框架特点 1.采用模块化插件开发,支持DLL和BPL两种模块方式 2.自动或手动动态加载模块 3.模块与模块或主程序之间均使用统一的接口方式进行访问 源代码下载地址  http://code.goo