【问题标题】:How do I feed in my own data into PyAlgoTrade?如何将自己的数据输入 PyAlgoTrade?
【发布时间】:2016-05-03 12:11:11
【问题描述】:

I'm trying to use PyAlogoTrade's event profiler

但是我不想使用来自 yahoo!finance 的数据,我想使用自己的但不知道如何在 >CSV,格式为:

Timestamp      Low  Open   Close       High        BTC_vol     USD_vol       [8]      [9]
2013-11-23 00  800  860    847.666666  886.876543  853.833333   6195.334452  5248330  0
2013-11-24 00  745  847.5  815.01      860         831.255     10785.94131   8680720  0

The complete CSV is here

我想做类似的事情:

def main(plot):
    instruments = ["AA", "AES", "AIG"]
    feed = yahoofinance.build_feed(instruments, 2008, 2009, ".")

然后将yahoofinance.build_feed(instruments, 2008, 2009, ".")替换为我的CSV

我试过了:

import csv

with open( 'FinexBTCDaily.csv', 'rb' ) as csvfile:
     data = csv.reader( csvfile )

def main( plot ):
    feed = data

但它会引发属性错误。任何想法如何做到这一点?

【问题讨论】:

    标签: csv algorithmic-trading quantitative-finance pyalgotrade back-testing


    【解决方案1】:

    我建议创建自己的 Rowparser 和 Feed,这比听起来容易得多,请看这里:yahoofeed

    这还允许您处理日内数据并在需要时清理数据,例如您的时间戳。

    当然,另一种可能性是解析您的文件并保存它,因此它看起来像一个 yahoo 提要。在您的情况下,您必须调整列和时间戳。

    【讨论】:

      【解决方案2】:

      步骤 A:GenericBarFeed 类中关注 PyAlgoTrade 文档

      On this link see the addBarsFromCSV() in CSV section of the BarFeed class in v0.16

      On this link see the addBarsFromCSV() in CSV section of the BarFeed class in v0.17

      Note

      - CSV 文件必须在第一行包含列名。
      - 如果Adj Close 为空也可以。
      - 使用多种乐器时:
      --- 如果加载的所有工具都在同一个时区,则可以不指定时区参数。
      --- 如果加载的任何仪器处于不同的时区,则应设置时区参数。

      addBarsFromCSV( instrument, path, timezone = None )
      从 CSV 格式的文件中加载给定工具的条形图。工具在条形提要中注册。

      Parameters:
      (string) instrument – 工具标识符。
      (string) path – CSV 文件的路径。(pytz) timezone – 用于本地化条形图的时区。
      检查 pyalgotrade.marketsession


      下一步:
      BarFeed 从具有以下格式的 CSV 文件加载条形图:

      Date       Time,    Open,    High, Low,  Close,   Volume,      Adj Close
      2013-01-01 13:59:00,13.51001,13.56,13.51,13.56789,273.88014126,13.51001
      

      步骤 B: 实施记录在案的 CSV 文件预格式化

      您的 CSV 数据需要一点理智(之前将能够在 PyAlgoTrade 方法中使用),
      但是它是可行的,您可以通过以下方式创建一个简单的转换器手动或使用强大的 numpy.genfromtxt() lambda-based converters 设施。

      此示例代码用于说明目的,以便您立即了解 converters 的强大功能,因为 CSV 结构不同。

      with  open( getCsvFileNAME( ... ), "r" ) as aFH:
                               numpy.genfromtxt(  aFH,
                                                  skip_header     = 1,    # Ref. pyalgotrade
                                                  delimiter       = ",",
                                                  #                                v     v       v       v       v       v 
                                                  #                       2011.08.30,12:00,1791.20,1792.60,1787.60,1789.60,835
                                                  #                       2011.08.30,13:00,1789.70,1794.30,1788.70,1792.60,550
                                                  #                       2011.08.30,14:00,1792.70,1816.70,1790.20,1812.10,1222
                                                  #                       2011.08.30,15:00,1812.20,1831.50,1811.90,1824.70,2373
                                                  #                       2011.08.30,16:00,1824.80,1828.10,1813.70,1817.90,2215
                                                  converters      = { 0:  lambda aString: mPlotDATEs.date2num( datetime.datetime.strptime( aString, "%Y.%m.%d" ) ),       #_______________________________________asFloat ( 1.0, +++ )
                                                                      1:  lambda aString: ( ( int( aString[0:2] ) * 60 + int( aString[3:] ) ) / 60. / 24. )               #           ( 15*60 + 00 ) / 60. / 24.__asFloat < 0.0, 1.0 )
                                                                      #                                    HH:                       :MM                                                HH      MM
                                                                      }
                                                  )
      

      【讨论】:

        【解决方案3】:

        您可以将pyalgotrade.barfeed.addBarsFromSequence 与列表理解一起使用,以逐行/逐条从CSV 中输入数据。基本上,您从每一行创建一个条形图,将 OHLCV 作为初始化参数传递,并在字典中传递带有附加数据的额外列。您可以尝试这样的事情(包含所有必需的导入):

        data = pd.DataFrame(index=pd.date_range(start='2021-11-01', end='2021-11-05'), columns=['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume', 'ExtraCol1', 'ExtraCol3', 'ExtraCol4', 'ExtraCol5'], data=np.random.rand(5, 10))
        feed = yahoofeed.Feed()
        feed.addBarsFromSequence('instrumentID', data.index.map(lambda i:
                BasicBar(
                    i,      
                    data.loc[i, 'Open'],
                    data.loc[i, 'High'],            
                    data.loc[i, 'Low'],             
                    data.loc[i, 'Close'],           
                    data.loc[i, 'Volume'],          
                    data.loc[i, 'Adj Close'],           
                    Frequency.DAY,        
                    data.loc[i, 'ExtraCol1':].to_dict())    
        ).values)
        

        输入数据框是使用随机值创建的,以使此示例更易于重现,但鉴于使用了有效的列名,将条形添加到提要中的部分对于来自 CSV 的数据框的工作方式应该相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多