标签:计算 数据表 pandas port sel ids symbol 输入参数 接口
基础设置:指定回测的起止日期、初始资金及回测频率
高级设置
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))
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)
index_components(order_book_id, date=None)
获取某一指数的股票构成列表,也支持指数的历史构成查询。
参数 类型 说明 order_book_id str 指数代码,可传入order_book_id date str, date, datetime, pandas Timestamp 查询日期,默认为策略当前日期。如指定,则应保证该日期不晚于策略当前日期
构成该指数股票的order_book_id list
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‘])
bar_dict[].item #只能获取当前运行日期的,不能获取之前日期
属性 | 类型 | 注释 |
---|---|---|
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)
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)
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)
# 增加条件过滤掉不符合的股票代码
# 默认直接获取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)
scheduler.run_daily(function)
每日运行一次指定的函数,只能在init内使用。
参数 | 类型 | 注释 |
---|---|---|
function | function | 使传入的function 每日运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数 |
无
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代表每月倒数第一个交易日,用户必须指定 |
无
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对象
order_shares(‘000001.XSHE‘, 2000)
order_shares(‘000001.XSHE‘, -2000)
order_shares(‘000001.XSHE‘, 1000, style=LimitOrder(10))
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对象
order_target_value(‘000001.XSHE‘, 10000)
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对象
order_target_percent(‘000001.XSHE‘, 0.15)
出现以下情况,我们的交易会被回测平台自动拒单:
投资组合是由投资人或金融机构所持有的股票、债券、金融衍生产品等组成的集合,目的是分散风险。
context属性中就包含了投资组合的信息
context.now
#使用以上的方式就可以在handle_bar中拿到当前的bar的时间,比如day bar的话就是那天的时间,minute bar的话就是这一分钟的时间点。
context.portfolio
#该投资组合在单一股票或期货策略中分别为股票投资组合和期货投资组合。在股票+期货的混合策略中代表汇总之后的总投资组合。
context.stock_account
#获取股票资金账户信息。
属性 | 类型 | 注释 |
---|---|---|
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的更多的信息可以在下面的部分找到。 |
position就代表着当前我们的仓位中有哪些股票正持有,position.keys()可以获取
属性 | 类型 | 注释 |
---|---|---|
order_book_id | str | 合约代码 |
quantity | *int* | 当前持仓股数 |
pnl | float | 持仓累计盈亏 |
sellable | int | 该仓位可卖出股数。T+1的市场中sellable = 所有持仓-今日买入的仓位 |
market_value | float | 获得该持仓的实时市场价值 |
value_percent | float | 获得该持仓的实时市场价值在总投资组合价值中所占比例,取值范围[0, 1] |
avg_price | float | 平均建仓成本 |
# 查看我们的投资组合信息,仓位、资金
# 查看股票账户信息
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.2 年化收益率
1.3 基准收益率
2.1 最大回撤
2.2 单位风险收益——夏普比率
标签:计算 数据表 pandas port sel ids symbol 输入参数 接口
原文地址:https://www.cnblogs.com/lizhihang/p/12611652.html