Search code examples
pandasyahoo-finance

multiple rics yahoo finance data download issue


I am unable to download data for multiple securities via pandas in yahoo finance.

import pandas as pd
import numpy as np
import pandas_datareader.data as web
df=pd.DataFrame()
symbols = pd.read_excel('C:\Users\alpha\Desktop/sym.xlsx')#eader=None,skiprows=1)
symbols = symbols['values_index'].values.tolist()
for sym in range(2,4):
    df[sym]=web.DataReader(symbols[sym],data_source='yahoo',start='2017-2-21',end='2017-2-24')

I get the following error

RemoteDataError: Unable to read URL: http://ichart.finance.yahoo.com/table.csv

though all securities are valid in sym.xlsx

In [] Symbols
Out [] [u"'NESN.VX'", u"'NOVN.VX'", u"'ROG.VX'", u"'HSBA.L'", u"'FP.PA'", u"'BATS.L'"]

Solution

  • You have extra single quotes in symbols.

    Demo:

    In [12]: web.DataReader("'NESN.VX'", 'yahoo', '2017-02-21', '2017-02-24')
    ...
    skipped
    ...
    RemoteDataError: Unable to read URL: http://ichart.finance.yahoo.com/table.csv
    
    In [13]: web.DataReader("NESN.VX", 'yahoo', '2017-02-21', '2017-02-24')
    Out[13]:
                  Open    High    Low  Close   Volume  Adj Close
    Date
    2017-02-21  73.075  73.750  73.00  73.45   756500      73.45
    2017-02-22  73.250  74.550  73.20  74.40  1371200      74.40
    2017-02-23  74.200  74.900  73.90  74.70   727000      74.70
    2017-02-24  74.575  74.775  74.05  74.45   965300      74.45
    

    Here is a bit improved solution:

    get rid of extra single quotes

    In [71]: s = [x.replace("'",'') for x in symbols]
    
    In [72]: s
    Out[72]: ['NESN.VX', 'NOVN.VX', 'ROG.VX', 'HSBA.L', 'FP.PA', 'BATS.L']
    

    read all tickers into Pandas.Panel in one step

    In [73]: p = web.DataReader(s, 'yahoo', '2017-02-21', '2017-02-24')
    
    In [74]: p
    Out[74]:
    <class 'pandas.core.panel.Panel'>
    Dimensions: 6 (items) x 4 (major_axis) x 6 (minor_axis)
    Items axis: Open to Adj Close
    Major_axis axis: 2017-02-21 00:00:00 to 2017-02-24 00:00:00
    Minor_axis axis: BATS.L to ROG.VX
    

    create a dictionary of DataFrames from Panel

    In [75]: df_dict = {sym:p.loc[:,:,sym] for sym in p.minor_axis}
    

    check

    In [76]: df_dict['FP.PA']
    Out[76]:
                  Open    High     Low   Close     Volume  Adj Close
    Date
    2017-02-21  47.750  48.815  47.605  48.400  5859500.0   47.78588
    2017-02-22  48.920  48.985  47.990  48.305  5448400.0   47.69208
    2017-02-23  48.215  48.585  48.100  48.290  3904200.0   47.67727
    2017-02-24  48.110  48.350  47.120  47.735  4937300.0   47.12931
    
    In [77]: df_dict['NESN.VX']
    Out[77]:
                  Open    High    Low  Close     Volume  Adj Close
    Date
    2017-02-21  73.075  73.750  73.00  73.45   756500.0      73.45
    2017-02-22  73.250  74.550  73.20  74.40  1371200.0      74.40
    2017-02-23  74.200  74.900  73.90  74.70   727000.0      74.70
    2017-02-24  74.575  74.775  74.05  74.45   965300.0      74.45
    
    In [78]: df_dict.keys()
    Out[78]: dict_keys(['BATS.L', 'FP.PA', 'HSBA.L', 'NESN.VX', 'NOVN.VX', 'ROG.VX'])