Backtrader:导入3只股票数据简单探究其数据格式

这次我们导入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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要安装akshare和backtrader这两个库,可以使用以下命令进行安装: ``` pip install akshare pip install backtrader ``` 接着,你需要从akshare获取股票数据。以获取上证指数为例,你可以使用以下代码: ```python import akshare as ak stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sh000001", start_date="20000101") ``` 这将获取从2000年1月1日起的上证指数日线数据,并存储在一个名为`stock_zh_index_daily_df`的DataFrame中。 接下来,你需要使用backtrader来编写回测程序。以下是一个简单的回测例子: ```python import backtrader as bt class MyStrategy(bt.Strategy): def __init__(self): self.data_close = self.datas[0].close def next(self): if self.data_close[0] > self.data_close[-1]: self.buy() elif self.data_close[0] < self.data_close[-1]: self.sell() cerebro = bt.Cerebro() data = bt.feeds.PandasData(dataname=stock_zh_index_daily_df) cerebro.adddata(data) cerebro.addstrategy(MyStrategy) cerebro.run() ``` 这个例子中,我们定义了一个简单的策略:如果当前收盘价比前一天的收盘价高,则买入;反之,则卖出。我们使用`bt.feeds.PandasData()`将从akshare获取的数据转换成backtrader所需的数据格式,并将其添加到回测系统中。然后,我们将策略添加到回测系统中,并运行回测。 注意,这只是一个简单的例子,你需要根据你的具体需求编写你自己的策略和回测程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值