예제 #1
0
def history_bars(instrument, frequency, fields, dt, bar_count=0):
    """
    取得某列的历史数据。
        Args :
            instrument  : 数据提供者.标识
            frequency   : 周期
            fields      : 列名
            dt          : 日期
            bar_count   : 需要返回多少个数据
        return : 返回某个列的历史数据"""
    # 这个仅仅支持日线
    # tushare 的k线数据未对停牌日期做补齐,所以遇到不跳过停牌日期的情况我们先甩锅。有兴趣的开发者欢迎提交代码补齐停牌日数据。
    if frequency != '1d':
        return None

    # 首先判断是否有相关数据吧。
    if (instrument not in kdata.keys()):
        # 到这里就是没有相关数据了,需要加载了
        data_supplier, code = str(instrument).split('.')
        # 加载数据
        kdata[instrument] = init_data.get_data(data_supplier, code)
        # 然后选择区间啦
    try:
        # 取得结束日期
        dt_end = dt.strftime('%Y-%m-%d')
        # 切片
        bar_data = kdata[instrument][:dt_end]
        # 如果需要的只是指定天数的数据
        if bar_count != 0:
            bar_data = bar_data[(0 - bar_count - 1):-1]
        if bar_data is None or bar_data.empty:
            return None
        else:
            # 注意传入的 fields 参数可能会有不同的数据类型
            # if isinstance(fields, str):
            #     fields = [fields]
            # fields = [field for field in fields if field in bar_data.columns]
            # as_matrix可以转化为ta-lib方便使用的格式。
            bar_data = bar_data[fields]
            bar_data = bar_data.as_matrix()
            return bar_data
    except Exception as e:
        print(e)
        return None
예제 #2
0
def get_tushare_k_data(instrument, start_dt, end_dt):
    """获得K线数据
        Args : instrument : 我打算这个参数分2部分,第一部分是数据提供者,第二部分是代码
        Args : start_dt : 开始日期
        Args : end_dt   : 结束日期
    """
    # 首先判断是否已经有数据啊。
    # format date
    dt_start = start_dt.strftime('%Y-%m-%d')
    dt_end = end_dt.strftime('%Y-%m-%d')
    if (instrument not in kdata.keys()):
        # 到这里就是没有相关数据了,需要加载了
        data_supplier, code = str(instrument).split('.')
        # 加载数据
        kdata[instrument] = init_data.get_data(data_supplier, code)
        # 然后选择区间啦
    try:
        return kdata[instrument][dt_start:dt_end]
    except Exception as e:
        print(e)
        return None
예제 #3
0
if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro()

    # Add a strategy
    cerebro.addstrategy(Strategy_MA)

    # 设置佣金杠杆
    # 上海黄金交易所手续费为万分之8,白银的递延费为万分之1.5, * 362 = 0.05475,这里不考虑杠杆。
    cerebro.broker.setcommission(commission=0.0008, interest=0.05475)

    # Create a Data Feed
    # 本地数据,笔者用Wind获取的东风汽车数据以csv形式存储在本地。
    # parase_dates = True是为了读取csv为dataframe的时候能够自动识别datetime格式的字符串,big作为index
    # 注意,这里最后的pandas要符合backtrader的要求的格式
    dataframe = init_data.get_data(init_data.str_tonghuashun,
                                   init_data.tonghuashun_AGTD)
    dataframe['openinterest'] = 0
    data = bt.feeds.PandasData(dataname=dataframe)
    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    # 每股固定10个
    # cerebro.addsizer(bt.sizers.PercentSizer, percents=10)

    # 加入分析师
    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='SharpeRatio')
    cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DW')

    # Set our desired cash start
    cerebro.broker.setcash(50000.0)