这次我们导入3个feather文件。
每次执行增加数据命令 cerebro.adddata(data),都会使列表 self.datas 的长度增加1。
下图表示,加载了三次数据后,self.datas中共有3块数据,分别是:self.datas[0]、self.datas[1]、self.datas[2]
下图红框数据表示,数据块self.datas[2]中的全部收盘数据:self.datas[2].lines.close
下图红框中数据:数据块[2],close列(lines.close),索引为0(最近一期)的数据,即:elf.datas[2].lines.close[0]。0为最近一期数据,-1为前一期数据,-2为再前一期数据,以此类推。
所有代码:
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from datetime import datetime # For datetime objects
# Import the backtrader platform
import backtrader as bt
import pandas as pd
# 创建策略继承bt.Strategy
class TestStrategy(bt.Strategy):
def __init__(self):
print('所有数据块(self.datas)长度:', len(self.datas))
print('数据块[2],索引为4的列(line[4]),索引为0的数据:',self.datas[2].lines[4][0])
print('数据块[2],close列(lines.close),索引为0的数据:',self.datas[2].lines.close[0])
print('数据块[2],close列(lines.close),索引为-1的数据:',self.datas[2].lines.close[-1])
start = '2020-01-01'
end = '2022-01-31'
def get_data(code, start_date, end_date):
df_tdx = pd.read_feather(r'./dataout/tdx/'+code+r'.day.feather')
df_tdx.index=pd.to_datetime(df_tdx.date, format = '%Y%m%d')
df_tdx_b=df_tdx.truncate(before=start_date, after = end_date)
df_tdx_b['openinterest'] = 0
df_tdx_b['sec_code'] = code[2:]
df_tdx_b.rename(columns={'vol':'volume'}, inplace = True)
df_tdx_b=df_tdx_b[['sec_code', 'open','high','low','close','volume','openinterest']]
return df_tdx_b
if __name__ == '__main__':
# 初始化cerebro回测系统设置
cerebro = bt.Cerebro()
# ----第一次加载数据----
dataframe=get_data('sh600851', datetime.strptime(start,'%Y-%m-%d'), datetime.strptime(end,'%Y-%m-%d'))
# 取得股票历史数据
data = bt.feeds.PandasData(dataname=dataframe, fromdate = datetime.strptime(start,'%Y-%m-%d'), todate = datetime.strptime(end,'%Y-%m-%d'))
# 加载交易数据,每加载一次数据,self.datas长度增加1
cerebro.adddata(data)
# ====第一次加载数据====
# ----第二次加载数据----
dataframe=get_data('sh600853', datetime.strptime(start,'%Y-%m-%d'), datetime.strptime(end,'%Y-%m-%d'))
# 取得股票历史数据
data = bt.feeds.PandasData(dataname=dataframe, fromdate = datetime.strptime(start,'%Y-%m-%d'), todate = datetime.strptime(end,'%Y-%m-%d'))
# 加载交易数据,每加载一次数据,self.datas长度增加1
cerebro.adddata(data)
# ====第二次加载数据====
# ----第三次加载数据----
dataframe=get_data('sh600854', datetime.strptime(start,'%Y-%m-%d'), datetime.strptime(end,'%Y-%m-%d'))
# 取得股票历史数据
data = bt.feeds.PandasData(dataname=dataframe, fromdate = datetime.strptime(start,'%Y-%m-%d'), todate = datetime.strptime(end,'%Y-%m-%d'))
# 加载交易数据
cerebro.adddata(data)
# ====第三次加载数据====
# 为Cerebro引擎添加策略
cerebro.addstrategy(TestStrategy)
#运行回测系统
cerebro.run()
运行结果:
所有数据块(self.datas)长度: 3
数据块[2],索引为4的列(line[4]),索引为0的数据: 9763700.0
数据块[2],close列(lines.close),索引为0的数据: 4.9
数据块[2],close列(lines.close),索引为-1的数据: 5.05