【问题标题】:How to resolve datafeeds error for backtesting using Backtrader and Python with local csv file?如何解决使用带有本地 csv 文件的 Backtrader 和 Python 进行回测的数据馈送错误?
【发布时间】:2021-09-30 05:40:52
【问题描述】:

我正在尝试使用 backtrader 和 python 构建用于回测加密策略的代码,但每次尝试连接数据馈送时都会出错,我尝试了不同的数据馈送方法并尝试了许多其他连接方式,但出现了一些或其他类型的错误每次,似乎都没有任何效果。请帮忙!

提到了我在代码中尝试使用的两种方法。

代码:

import backtrader as bt
import os
import sys
import datetime

cerebro = bt.Cerebro()

#Method 1: YahooFinanceCSVData
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
datapath = os.path.join(modpath, 'C:/Users/admin/xx/xx2/xx.csv')
data = bt.feeds.YahooFinanceCSVData(dataname=datapath, reverse=False)

#Method 2: GenericCSVData
data = bt.feeds.GenericCSVData (dataname='filename.csv', dtformat=1)

cerebro.adddata(data)

cerebro.run()

cerebro.plot()
<end>

数据文件的第一个字符串: 1623809640000,40124.02000000,40129.70000000,40100.00000000,40107.65000000,12.53749700,1623809699999,502950.08549781,339,4.72578400,189573.50347000,0 P>

#错误 #Method 1 #ValueError 月份必须在1..12 #Method 2 #OSError [Errno 22] 参数无效

【问题讨论】:

    标签: python oserror backtrader


    【解决方案1】:

    文档显示:

    dtformat:用于解析日期时间 CSV 字段的格式。有关格式,请参阅 python strptime/strftime 文档。

    如果指定了数值,则如下解释

    1:该值是一个 int 类型的 Unix 时间戳,表示自 1970 年 1 月 1 日以来的秒数

    2:该值为浮点类型的 Unix 时间戳

    如果你尝试直接转换你的日期时间,你会得到:

    from datetime import datetime
    ts = 1623809640000
    print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
    

    错误:

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-15-2bb3006fc757> in <module>
          4 # if you encounter a "year is out of range" error the timestamp
          5 # may be in milliseconds, try `ts /= 1000` in that case
    ----> 6 print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
    
    ValueError: year 53426 is out of range
    

    这是因为您的日期时间以毫秒为单位。除以 1000 校正为秒,您得到:

    from datetime import datetime
    ts = 1623809640000 / 1000
    print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))
    

    导致:

    
    "2021-06-16 02:14:00"
    

    我相信这可能是您问题的根源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2016-01-26
      • 2018-07-07
      • 2019-11-22
      • 1970-01-01
      • 2019-02-14
      • 2014-07-05
      相关资源
      最近更新 更多