IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Backtrader(六) - 关于datafeed -> 正文阅读

[人工智能]Backtrader(六) - 关于datafeed

PandasData

将pandas的dataframe,对象加载到 bt.feeds.PandasData。生成回测的行情数据对象。
范例:
数据来源 akshare

import akshare as ak
# 获取历史行情数据
stock_zh_a_hist_df = ak.stock_zh_a_hist(
    symbol=g_stock_code,  # 股票代码
    period="daily",  # {'daily', 'weekly', 'monthly'}
    adjust='qfq'  # qfq:前复权;hfq:后复权
)

print(stock_zh_a_hist_df[:5])  # 查看前5行数据

注意:这里是一份dataframe数据,换行后分开两份展示

     日期     开盘     收盘     最高   最低     成交量    成交额      振幅  \
0 2021-08-18  14.50  18.00  19.88  14.50  780346  1.265741e+09  130.27   
1 2021-08-19  17.00  15.42  17.48  15.36  629396  1.026323e+09   11.78   
2 2021-08-20  15.16  14.81  16.48  14.71  486654  7.591273e+08   11.48   
3 2021-08-23  14.20  15.62  16.21  13.98  445712  6.849244e+08   15.06   
4 2021-08-24  15.27  15.51  16.20  14.82  445999  6.878077e+08    8.83
  涨跌幅    涨跌额    换手率  
0  335.84  13.87  88.95  
1  -14.33  -2.58  71.74  
2   -3.96  -0.61  55.47  
3    5.47   0.81  50.81  
4   -0.70  -0.11  50.84

下面定义一个函数,接收dataframe对象,生成一个行情数据对象

def get_feeds(dataframe):
    dataframe['日期'] = dataframe['日期'].apply(str)
    dataframe['日期'] = pd.to_datetime(dataframe['日期'])
    date_list = dataframe['日期'].to_list()

    begin_date = datetime.strptime(str(date_list[0]), "%Y-%m-%d %H:%M:%S")  # 数据的起始日期
    end_date = datetime.strptime(str(date_list[-1]), "%Y-%m-%d %H:%M:%S")  # 数据的起始日期

    feeds = bt.feeds.PandasData(
        dataname=dataframe,
        datetime=0,  # 日期行所在列
        open=1,  # 开盘价所在列
        high=3,  # 最高价所在列
        low=4,  # 最低价所在列
        close=2,  # 收盘价价所在列
        volume=5,  # 成交量所在列
        openinterest=-1,  # 无未平仓量列.(openinterest是期货交易使用的)
        fromdate=begin_date,  # 起始日
        todate=end_date
    )
    return feeds

## PandasData拓展line

可以看到原始的 bt.feeds.PandasData使用的line为:datetime、open、high、low、close、volume

希望将行情数据中的 换手率 加入行情数据需要如下操作:

# 自定义数据类,继承PandasData
from backtrader.feeds import PandasData
class PandasData_Change(PandasData):
    '''增加 换手率线的 数据源类'''
    # 增加pe线
    lines = ('change', )
    # 默认第8列
    params = (
        ('change', 8),
    )

将数据注入自定义的数据类,我们修改了一下生成行情数据对象的方法,增加了 change 参数,并定义为第10列数据:

def get_feeds(dataframe):

    dataframe['日期'] = dataframe['日期'].apply(str)
    dataframe['日期'] = pd.to_datetime(dataframe['日期'])
    date_list = dataframe['日期'].to_list()

    begin_date = datetime.strptime(str(date_list[0]), "%Y-%m-%d %H:%M:%S")  # 数据的起始日期
    end_date = datetime.strptime(str(date_list[-1]), "%Y-%m-%d %H:%M:%S")  # 数据的起始日期

    feeds = PandasData_Change(
        dataname=dataframe,
        datetime=0,  # 日期行所在列
        open=1,  # 开盘价所在列
        high=3,  # 最高价所在列
        low=4,  # 最低价所在列
        close=2,  # 收盘价价所在列
        volume=5,  # 成交量所在列
        openinterest=-1,  # 无未平仓量列.(openinterest是期货交易使用的)
        fromdate=begin_date,  # 起始日
        todate=end_date,
        change=10  # 新定义 换手率线 的索引
    )
    return feeds

运行策略查看 新的line可以像这样获取

class SmaCross(bt.Strategy):

    def __init__(self):

        '''获取 换手率线'''
        change_line = self.data.change
        lg.info(
            change_line
        )

    def next(self):
        pass


cerebro = bt.Cerebro()
cerebro.adddata(feed)
cerebro.addstrategy(SmaCross)
cerebro.broker.setcash(10000)
cerebro.run()

使用pandasDirectData

后期新版增加,作用是提高效率
使用pandasDirectData 需要遵循一下规则:
1、dataframe的日期时间列要设为索引列
2、dataframe里不能有字符串列,如:股票代号
3、bt.PandasDirectData(…)时,不能设置datatime列

继续使用上面的行情数据,修改生成行情数据对象的方法:
1、重新索引 dataframe.set_index()
2、删除字符串列 dataframe.drop() ,这里没有

def get_feeds(dataframe):
    dataframe['日期'] = dataframe['日期'].apply(str)
    dataframe['日期'] = pd.to_datetime(dataframe['日期'])
    date_list = dataframe['日期'].to_list()
		# 增加重新索引
    dataframe = dataframe.set_index(keys=['日期'], inplace=True)

    begin_date = datetime.strptime(str(date_list[0]), "%Y-%m-%d %H:%M:%S")  # 数据的起始日期
    end_date = datetime.strptime(str(date_list[-1]), "%Y-%m-%d %H:%M:%S")  # 数据的起始日期

    feeds = PandasDirectData(
        dataname=dataframe,
        open=1-1,  # 开盘价所在列
        high=3-1,  # 最高价所在列
        low=4-1,  # 最低价所在列
        close=2-1,  # 收盘价价所在列
        volume=5-1,  # 成交量所在列
        openinterest=-1,  # 无未平仓量列.(openinterest是期货交易使用的)
        fromdate=begin_date,  # 起始日
        todate=end_date,
        change=10-1  # 新定义 换手率线 的索引
    )
    return feeds
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:30:57  更:2022-01-17 11:32:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 21:24:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码