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
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
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)