如何获取前复权价格或者真实价格?(仅支持真实价格和后复权价格)

真实价格
前复权
标签: #<Tag:0x00007fcf62f1eda0> #<Tag:0x00007fcf62f1eaa8>

(鲁鲁) #1

我在平台上直接获取的数据是后复权价格数据,很大,如下所示。想问问怎么获取前复权或者真实价格呢?

QQ图片20171222164348


为什么中国石化价格跟实际的不一样?
产品动态——持续更新,为您提供更好的研究体验
(iQuant) #2

D.history_data默认是后复权价格。即price_type=backward_adjusted

查看D.history_data函数的文档

定义: D.history_data(instruments, start_date='2005-01-01', end_date=None, fields=['open', 'close'], frequency='daily', groupped_by_instrument=False, price_type='backward_adjusted')
文档:
统一的API,读取历史数据

:param instruments: 字符串数组,股票代码列表,见 :doc:`data_instruments`
:param start_date: 字符串,开始日期
:param end_date: 字符串,结束日期
:param fields: 字符串数组,请求的字段列表,详见 `数据字段`_
:param frequency: 数据周期,日,分钟 传入'daily' or 'minute', 目前功能上只支持'daily'
:param groupped_by_instrument: 布尔类型,返回数据是否按instrument分组,如果为True,则返回dict,如果为False,返回的是DataFrame
:return: 历史数据
:rtype: DataFrame
类型: method

BigQuant平台高效使用指南
(hugo) #3

https://bigquant.com/docs/module_trade.html#BarData.history
history文档是否没更新?


(shen5455) #4


我是设置了price_type的参数的,价格看上去还是不对,我还没想到为什么,见上图。


再来看看官方api定义,上面写死了price_type=“backward_adjusted”,但是下面的参数没有price_type,会给我这个就是写死的,不支持自定义。

我使用的时候自定义price_type,也碰巧没有效果。

完整代码顺便给你(其实就是官方代码)。

start_date = '2017-05-01' # 开始日期
end_date = '2017-11-08' # 结束日期
# 获取股票列表
instruments = D.instruments(start_date, end_date)

# 加载原始数据
stock_raw_data = D.history_data(instruments=instruments, start_date=start_date, end_date=end_date, fields=['close','low'], price_type='original')
print(stock_raw_data)
m1 = D.features(instruments=instruments, start_date='2017-01-01', end_date='2017-02-07', fields=['close_1', 'close_0', 'volume_0', 'volume_1'])
# 计算多个周期均线的函数
def ma_calculate(df):
    ma_list = [5,10,20,40,120]
    for ma_len in ma_list:
        df['ma_'+str(ma_len)] = pd.rolling_mean(df['close'], ma_len)
    return df
# 包含多个周期均线值的股票数据
stock_ma_data = stock_raw_data.groupby('instrument').apply(ma_calculate)

# 函数:求满足开仓条件的股票列表
def open_pos_con(df):
    return list(df[(df['ma_5']>df['ma_10'])&(df['ma_10']>df['ma_20'])].instrument)

# 函数:求满足平仓条件的股票列表
def close_pos_con(df):
    return list(df[df['ma_5']<df['ma_20']].instrument)
# 每日买入股票的数据框
daily_stock_to_buy= stock_ma_data.groupby('date').apply(open_pos_con)
# 每日卖出股票的数据框
daily_stock_to_sell= stock_ma_data.groupby('date').apply(close_pos_con)

# 策略比较参考标准,以沪深300为例
benchmark = '000300.INDX'
# 起始资金
capital_base = 30000

# 策略主体函数

# 初始化虚拟账户状态,只在第一个交易日运行
def initialize(context):
    # 设置手续费,买入时万3,卖出是千分之1.3,不足5元以5元计
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    context.num_stock = 3 # 最多同时持有100只股票
    context.daily_stock_to_buy = daily_stock_to_buy # 符合买入条件的股票列表
    context.daily_stock_to_sell = daily_stock_to_sell # 符合卖出条件的股票列表

# 策略交易逻辑,每个交易日运行一次
def handle_data(context, data):
     
    date = data.current_dt.strftime('%Y-%m-%d')  # 日期
    buy_stock = context.daily_stock_to_buy[date]  # 当日符合买入条件的股票
    sell_stock = context.daily_stock_to_sell[date]  # 当日符合卖出条件的股票
    weight = 1/context.num_stock   # 等权重配置
     
    stock_hold_num = len(context.portfolio.positions)  # 目前持有的股票数量
    remain_num = context.num_stock - stock_hold_num   # 还可以买入的股票数量,需要把卖出的股票加回来
    
    # 初始化当日买入订单的数量为0 
    order_count = 0
    # 买入股票
    for i in buy_stock:
        # 如果发送买入订单的股票数量已经超过了还可以买入的股票数量,那么应退出for循环
        if order_count >= remain_num:
            break
        # 对于没有买入的股票且可以交易的股票,应买入
        
        if context.portfolio.positions[i].amount == 0 and data.can_trade(context.symbol(i)):
            order_target_percent(context.symbol(i), weight)
            order_count += 1  # 统计一下当天股票买入数量
    # 卖出股票
    for j in sell_stock:
        if context.portfolio.positions[context.symbol(j)].amount > 0 and data.can_trade(context.symbol(j)):
            order_target_percent(context.symbol(j), 0)
            
# 启动回测
# 策略回测接口: https://bigquant.com/docs/strategy_backtest.html
m = M.trade.v3(
    instruments=instruments,
    start_date=start_date,
    end_date=end_date,
    initialize=initialize,
    handle_data=handle_data,
    price_type='original',
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=capital_base,
    benchmark=benchmark,
)