获取信息函数

策略离不开数据。PTrade 的数据 API 分几层:当前周期 K 线(data 对象)、历史 K 线(get_history / get_price)、实时快照(get_snapshot)、财务基本面(get_fundamentals)、证券属性与成分(get_index_stocks / get_stock_status)。本章把最常用的整理成速查表。

一、当前周期行情:data 对象

handle_data 中,data[code] 返回当前周期的 BarData,直接取属性即可,无需调用接口:

def handle_data(context, data):
    bar = data['600570.SS']
    log.info('收 %s%s' % (bar.close, bar.volume))

属性:open / high / low / close / volume / money / price,日线另有 preclose / high_limit / low_limit / is_open。分钟级别 preclose 等填充为 0。

二、历史行情:get_history

取最近 N 根 K 线,最常用:

get_history(count, frequency='1d', field=None, security_list=None,
            fq=None, include=False, fill='nan', is_dict=False)
参数说明
countK 线根数
frequency'1d'(默认)、'1m'/'5m'/'15m'/'30m'/'60m'/'120m''1w''mo'
field单字段 str 或多字段 list,默认 OHLCV+money+price
security_list单代码 str 或代码 list,不传则用 set_universe 设的股票池
fqNone 不复权、'pre' 前复权、'post' 后复权、'dypre' 动态前复权
include是否包含当前周期,默认 False
is_dictTrue 返回 dict 格式,取数更快
# 取股票池全部股票近 5 日收盘价
df = get_history(5, '1d', 'close', security_list=g.security)
# 单只股票取近 20 日 OHLCV
df = get_history(20, '1d', ['open','high','low','close','volume'],
                 security_list='600570.SS', fq='dypre')
close_arr = df['close'].values   # 转 numpy 数组供计算

停牌日不跳过,用停牌前数据填充、成交量为 0,可据此过滤停牌。该接口只能取 2005 年之后的数据。不要在 run_daily / run_interval 里和 handle_data 同时刻调用,否则可能返回空。

三、历史行情:get_price

按日期段或按根数取历史行情,比 get_history 更灵活:

get_price(security, start_date=None, end_date=None, frequency='1d',
          fields=None, fq=None, count=None, is_dict=False)
  • start_datecount 二选一,不能同时传。
  • 返回 DataFrame,索引为 datetime,列为字段名。
# 取 2015 年 1 月日线开盘价
price_open = get_price('600570.SS', start_date='20150101',
                       end_date='20150131', frequency='1d')['open']

四、实时快照:get_snapshot

取盘中实时行情快照(仅交易),字段非常全:

snapshot = get_snapshot('600570.SS')
last_px  = snapshot['600570.SS']['last_px']      # 最新价
up_px    = snapshot['600570.SS']['up_px']        # 涨停价
down_px  = snapshot['600570.SS']['down_px']      # 跌停价
vol_ratio = snapshot['600570.SS']['vol_ratio']   # 量比
trade_status = snapshot['600570.SS']['trade_status']  # 'TRADE' 等

常用字段:last_px / open_px / high_px / low_px / preclose_px / business_amount / business_balance / px_change_rate / vol_ratio / turnover_ratio / pe_rate / pb_rate / bid_grp / offer_grp(五档买卖盘)。

五、档位行情:get_gear_price

取指定代码的五档/十档买卖盘价格(仅交易):

gear = get_gear_price('600570.SS')
bid1 = gear['bid_grp'][1]      # 买一档 [价格, 委托量, 委托笔数]
offer1 = gear['offer_grp'][1]  # 卖一档

六、交易日期

函数含义
get_trading_day(day)距当前 day 天前/后的交易日,day=0 取当日;返回 datetime.date
get_trade_days(start_date=None, end_date=None, count=None)指定范围的交易日数组
get_all_trades_days(date=None)某日之前的全部交易日,最早 2005-01-04
get_trading_day_by_date(query_date, day=0)按自然日映射到交易日,适合固定日调仓
prev = get_trading_day(-1)                   # 上一交易日
days = get_trade_days(count=10)              # 含当日在内的近 10 个交易日

七、证券属性与成分

函数含义
get_stock_name(stocks)证券名称字典
get_stock_info(stocks, field=None)基础信息(名称、上市日、退市日)
get_stock_status(stocks, query_type, query_date=None)是否 ST / 停牌 / 退市
filter_stock_by_status(stocks, filter_type, query_date=None)一次性剔除 ST/停牌/退市(仅 before_trading_start
get_index_stocks(index_code, date=None)指数成分股列表
get_industry_stocks(industry_code)行业成分股(代码尾缀 .XBHS
get_stock_blocks(stock_code)证券所属板块(行业/概念/地域,注意未来函数)
get_Ashares(date=None)指定日期全部 A 股代码
check_limit(security, query_date=None)涨跌停状态:1 涨停、-1 跌停、0 正常
# 盘前过滤 ST、停牌、退市,得到干净股票池
def before_trading_start(context, data):
    pool = get_index_stocks('000300.SS')
    g.pool = filter_stock_by_status(pool, ['ST', 'HALT', 'DELISTING'])
    set_universe(g.pool)

八、财务数据:get_fundamentals

取三大报表、估值、各项能力指标,支持按日期或按年份两种模式:

get_fundamentals(security, table, fields=None, date=None,
                 start_year=None, end_year=None, report_types=None, ...)

table 取值:valuation(估值)、balance_statement(资产负债表)、income_statement(利润表)、cashflow_statement(现金流量表)、growth_ability / profit_ability / eps / operating_ability / debt_paying_ability

# 取资产总计
df = get_fundamentals('600570.SS', 'balance_statement',
                      fields='total_assets', date='20160628')

回测中建议不传 merge_type(默认首次发布数据)以避免未来函数;growth_ability 等五张表是非 pit 数据,未发布的财报期返回 None,按日期请求要确认已披露。

九、持仓查询

函数含义
get_position(security)单只标的持仓对象
get_positions(security=None)多只/全部持仓字典(不传取全部)
get_all_positions()账户全部持仓(仅交易,含非量化标的)
pos = get_position('600570.SS')
if pos and pos.enable_amount > 0:
    order('600570.SS', -pos.enable_amount)   # 卖出全部可用

十、指标计算函数

PTrade 内置常见技术指标,输入为 numpy 数组、输出为序列:

函数返回
get_MACD(close, short=12, long=26, m=9)(dif, dea, macd) 三个序列
get_KDJ(high, low, close, n=9, m1=3, m2=3)(k, d, j) 三个序列
get_RSI(close, n=6)rsi 序列
get_CCI(high, low, close, n=14)cci 序列
def handle_data(context, data):
    h = get_history(100, '1d', ['close','high','low'], security_list=g.security)
    dif, dea, macd = get_MACD(h['close'].values, 12, 26, 9)
    if dif[-1] > 0 and dea[-1] > 0 and macd[-2] < 0 and macd[-1] >= 0:
        log.info('MACD 强势金叉')

十一、日志与其他

log.info('买入 %s' % g.security)      # info / debug / warning / error / critical
is_trade()                              # True 交易 / False 回测
get_frequency()                         # 'daily' / 'minute'
get_business_type()                     # 'stock' / 'rzrq' / 'future'

小结

记住几组:data 对象取当前周期、get_history / get_price 取历史、get_snapshot 取实时、get_fundamentals 取财务、get_index_stocks / filter_stock_by_status 管股票池、get_position 查持仓。下一步学两融专属 API:融资融券函数