在Backtrader中使用:
self.datas[0].getlinealiases()
:获得数据的列名list(self.datas[0].lines)
:行的值
因此组合一下:
dict(zip(
self.datas[0].getlinealiases(), # key
[i[0] for i in list(self.datas[0].lines)] # value
))
即可得到当前数据的全部值,其中zip()
函数是将两个列表对应匹配并打包;dict()
则是解包并转换为python字典格式
示例代码
from datetime import datetime
import backtrader
import pandas as pd
import efinance
def get_k_data(stock_code, begin: datetime, end: datetime) -> pd.DataFrame:
"""根据efinance工具包获取股票数据
:param stock_code:股票代码
:param begin: 开始日期
:param end: 结束日期
"""
# stock_code = '600519' # 股票代码,茅台
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 # 这里加一个数据引用,方便后续操作
def next(self): # 固定的函数,框架执行过程中会不断循环next(),过一个K线,执行一次next()
line_value = dict(zip(
self.datas[0].getlinealiases(), # key
[i[0] for i in list(self.datas[0].lines)] # value
))
print('========================================')
print("今天是:", self.datetime.date())
print("当前数据的所有值:", line_value)
if __name__ == '__main__':
# 获取数据
start_time = datetime(2020, 1, 1)
end_time = datetime(2021, 1, 1)
dataframe = get_k_data('600519', begin=start_time, end=end_time)
# =============== 为系统注入数据 =================
# 加载数据
data = backtrader.feeds.PandasData(dataname=dataframe, fromdate=start_time, todate=end_time)
# 初始化cerebro回测系统
cerebral_system = backtrader.Cerebro() # Cerebro引擎在后台创建了broker(经纪人)实例,系统默认每个broker的初始资金量为10000
# 将数据传入回测系统
cerebral_system.adddata(data) # 导入数据,在策略中使用 self.datas 来获取数据源
# 将交易策略加载到回测系统中
cerebral_system.addstrategy(MyStrategy1)
# =============== 系统设置 ==================
# 设置启动资金为 100000
start_cash = 1000000
cerebral_system.broker.setcash(start_cash)
# 设置手续费 万2.5
cerebral_system.broker.setcommission(commission=0.00025)
# 运行回测系统
cerebral_system.run()