使用Backtrader的内置类 backtrader.feeds.PandasData
读取dataframe数据后,会按照列名称,将已有的数据列名映射到 backtrader
的PandasData类中,默认只会包含以下数据:
* close
* low
* high
* open
* volume
* openinterest
* datetime
如果想要获取更多数据,需要手动添加,详情请参考自定义数据集部分
import backtrader
import efinance
import pandas as pd
from datetime import datetime
def get_k_data(stock_code, begin: datetime, end: datetime) -> pd.DataFrame:
"""
根据efinance工具包获取股票数据
:param stock_code:股票代码
:param begin: 开始日期
:param end: 结束日期
:return:
"""
k_dataframe: pd.DataFrame = efinance.stock.get_quote_history(
stock_code, beg=begin.strftime("%Y%m%d"), end=end.strftime("%Y%m%d"))
k_dataframe = k_dataframe.iloc[:, :9]
k_dataframe.columns = ['name', 'code', 'date', 'open', 'close', 'high', 'low', 'volume', 'turnover']
k_dataframe.index = pd.to_datetime(k_dataframe.date)
k_dataframe.drop(['name', 'code', "date"], axis=1, inplace=True)
return k_dataframe
class MyStrategy1(backtrader.Strategy):
def __init__(self):
self.close_price = self.datas[0].close
this_data = self.getdatabyname("stock_600519")
print("全部列名:", this_data.getlinealiases())
print("总交易日:", self.datas[0].buflen())
def next(self):
print('==========================')
print("今日{}, 是第{}个交易日 , 收盘价:{}".format(self.datetime.date(), len(self.datas[0]), self.datas[0].close[0]))
print("前天、昨天、今天的收盘价:", list(self.datas[0].close.get(ago=0, size=3)))
if len(self.datas[0]) self.datas[0].buflen() - 2:
print("明天、后天的收盘价:", self.datas[0].close[1], self.datas[0].close[2])
if __name__ == '__main__':
start_time = datetime(2015, 1, 1)
end_time = datetime(2015, 1, 10)
dataframe = get_k_data('600519', begin=start_time, end=end_time)
data = backtrader.feeds.PandasData(dataname=dataframe, fromdate=start_time, todate=end_time)
cerebral_system = backtrader.Cerebro()
cerebral_system.adddata(data, name="stock_600519")
cerebral_system.addstrategy(MyStrategy1)
cerebral_system.run()
可以看到打印的结果:
全部列名: ('close', 'low', 'high', 'open', 'volume', 'openinterest', 'datetime')
总交易日: 5
==========================
今日2015-01-05, 是第1个交易日 , 收盘价:105.32
前天、昨天、今天的收盘价: []
明天、后天的收盘价: 101.06 96.61
==========================
今日2015-01-06, 是第2个交易日 , 收盘价:101.06
前天、昨天、今天的收盘价: []
明天、后天的收盘价: 96.61 95.54
==========================
今日2015-01-07, 是第3个交易日 , 收盘价:96.61
前天、昨天、今天的收盘价: [105.32, 101.06, 96.61]
明天、后天的收盘价: 95.54 94.22
==========================
今日2015-01-08, 是第4个交易日 , 收盘价:95.54
前天、昨天、今天的收盘价: [101.06, 96.61, 95.54]
==========================
今日2015-01-09, 是第5个交易日 , 收盘价:94.22
前天、昨天、今天的收盘价: [96.61, 95.54, 94.22]
如果看原始的数据,可以发现原有的数据集列名称是:’open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘turnover’
但是在策略中列名变成了:(‘close’, ‘low’, ‘high’, ‘open’, ‘volume’, ‘openinterest’, ‘datetime’)
这是因为backtrader对原有的数据做了一层封装,查看源码中的 class PandasData(feed.DataBase):
可以看到, PandasData
类接受的输入是:(’nocase’, ‘close’, ‘low’, ‘high’, ‘open’, ‘volume’, ‘openinterest’, ‘datetime’),如果要拓展,需要继承自这个类然后重写 params
这个参数:
添加自定义列只需要两步:
import backtrader
import efinance
import pandas as pd
from datetime import datetime
def get_k_data(stock_code, begin: datetime, end: datetime) -> pd.DataFrame:
"""
根据efinance工具包获取股票数据
:param stock_code:股票代码
:param begin: 开始日期
:param end: 结束日期
:return:
"""
k_dataframe: pd.DataFrame = efinance.stock.get_quote_history(
stock_code, beg=begin.strftime("%Y%m%d"), end=end.strftime("%Y%m%d"))
k_dataframe = k_dataframe.iloc[:, :9]
k_dataframe.columns = ['name', 'code', 'date', 'open', 'close', 'high', 'low', 'volume', 'turnover']
k_dataframe.index = pd.to_datetime(k_dataframe.date)
k_dataframe.drop(['name', 'code', "date"], axis=1, inplace=True)
return k_dataframe
class PandasDataPlus(backtrader.feeds.PandasData):
lines = ('turnover',)
params = (
('turnover', -1),
)
class MyStrategy1(backtrader.Strategy):
def __init__(self):
self.close_price = self.datas[0].close
this_data = self.getdatabyname("stock_600519")
print("全部列名:", this_data.getlinealiases())
def next(self):
pass
if __name__ == '__main__':
start_time = datetime(2015, 1, 1)
end_time = datetime(2015, 1, 10)
dataframe = get_k_data('600519', begin=start_time, end=end_time)
data = PandasDataPlus(dataname=dataframe, fromdate=start_time, todate=end_time)
cerebral_system = backtrader.Cerebro()
cerebral_system.adddata(data, name="stock_600519")
cerebral_system.addstrategy(MyStrategy1)
cerebral_system.run()
可以看到新增了turnover列的数据,在策略中就可以选择了:
全部列名: ('close', 'low', 'high', 'open', 'volume', 'openinterest', 'datetime', 'turnover')
Original: https://blog.csdn.net/weixin_35757704/article/details/124601943
Author: 呆萌的代Ma
Title: Backtrader量化&回测2——在策略中读取Pandas数据,添加更多自定义数据列到策略中
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/674083/
转载文章受原作者版权保护。转载请注明原作者出处!