【问题标题】:How do you pull WEEKLY historical data from yahoo finance?你如何从雅虎财经中提取每周历史数据?
【发布时间】:2014-01-02 07:00:06
【问题描述】:
import datetime   
import pandas.io.data

sp  =  pd.io.data.get_data_yahoo('^IXIC',start = datetime.datetime(1972, 1, 3),
                       end = datetime.datetime(2010, 1, 3))

我使用了上面的示例,但是当我想每周提取时,它只是将 DAILY 数据提取到数据框中。 get_data_yahoo 似乎没有一个参数,您可以从每天、每周或每月中进行选择,就像雅虎本身提供的选项一样。您知道的任何其他软件包或想法可能有助于实现这一点?

【问题讨论】:

  • 为什么需要每周通过数据?如果你白天拥有它,你不应该能够进行适当的聚合。你能提供一些关于最终结果应该是什么的见解吗?可能有助于提出更合适的建议。
  • 因此,如果您查看此链接:finance.yahoo.com/q/…,您将看到有每日、每周、每月选项。我想将每周数据放入数据框中。

标签: python pandas time-series yahoo-finance


【解决方案1】:

您可以随时重新索引到您想要的频率:

sp.reindex( pd.date_range( start=sp.index.min( ),
                           end=sp.index.max( ),
                           freq='W-WED' ) )  # weekly, Wednesdays

编辑:您可以添加, method='ffill' 以转发填充NaN 值。

作为建议,请选择星期三,因为这往往具有最少的缺失值。 (即周三纽约证券交易所假期减少)。我认为雅虎每周数据给出了每周一的股价,这是基于 2000 年以来标准普尔数据的最差每周频率:

import pandas.io.data as web
sp = web.DataReader("^GSPC", "yahoo", start=dt.date( 2000, 1, 1 ) )

weekday = { 0:'MON', 1:'TUE', 2:'WED', 3:'THU', 4:'FRI' }
sp[ 'weekday' ] = list( map( weekday.get, sp.index.dayofweek ) )
sp.weekday.value_counts( )

输出:

WED    722
TUE    717
THU    707
FRI    705
MON    659

【讨论】:

    【解决方案2】:

    一种选择是在您想要的星期几进行屏蔽。

    sp[sp.index.dayofweek == 0]
    

    另一种选择是重新采样。

    sp.resample('W', how='mean')
    

    【讨论】:

      【解决方案3】:

      您可以使用asfreq 方法进行下采样:

      sp = sp.asfreq('W-FRI', method='pad')
      

      pad 方法将向前传播最后一个有效观察。

      使用resample(如@tshauck 所示)是另一种可能性。 如果您想保证下采样中的值是在原始数据集中找到的值,请使用 asfreq。如果您希望从原始数据集中聚合行组(例如,通过取平均值),请使用 resample。如果原始数据集在重新索引指定的日期没有值,reindex 可能会引入 NaN 值——尽管(正如@behzad.nouri 指出的那样)您也可以使用method=pad 在这里传播最后的观察结果。

      【讨论】:

        【解决方案4】:

        如果你在 github 上查看最新的 pandas source code,你会看到间隔参数包含在最新的 master 分支中。您可以通过覆盖 Site-Packages/pandas/io 文件夹下的相同 data.py 来手动修改本地副本

        【讨论】:

          【解决方案5】:

          这就是我将每日价格数据转换为每周价格数据的方式:

          import datetime
          import pandas as pd
          import pandas_datareader.data as web
          
          start = datetime.datetime(1972, 1, 3)
          end = datetime.datetime(2010, 1, 3)
          
          stock_d = web.DataReader('^IXIC', 'yahoo', start, end)
          
          def week_open(array_like):
              return array_like[0]
          
          def week_close(array_like):
              return array_like[-1]
          
          stock_w = stock_d.resample('W',
                              how={'Open': week_open, 
                                   'High': 'max',
                                   'Low': 'min',
                                   'Close': week_close,
                                   'Volume': 'sum'}, 
                              loffset=pd.offsets.timedelta(days=-6))
          
          stock_w = stock_w[['Open', 'High', 'Low', 'Close', 'Volume']]
          

          更多信息:

          https://pandas-datareader.readthedocs.io/en/latest/remote_data.html#yahoo-finance https://gist.github.com/prithwi/339f87bf9c3c37bb3188

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-16
            • 1970-01-01
            • 2021-06-03
            • 2018-04-21
            • 1970-01-01
            • 2022-12-05
            • 2015-05-07
            相关资源
            最近更新 更多