0

我正在尝试使用 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.0000000000,0000,0000,40107.65000000,12.53749700,162380999999999999999999999999999999778878787877,0854977878797787978977,778978978978979789797,779797897979797,779797979797999979性小士范子范中

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

4

1 回答 1

0

文档显示:

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"

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

于 2021-07-26T12:52:31.380 回答