историческа цена на акциите десет дни преди празници за последните двадесет години

въпреки че все още съм нуб, ентусиазирано уча Python от известно време и ето един проект, върху който работя. Трябва да събера историческа цена на акциите десет дни преди официалните празници в САЩ през последните двадесет години и ето какво направих: (Използвах pandas_datareader и празници тук)

start=datetime.datetime(1995,1,1)
end=datetime.datetime(2015,12,31)
history_price=web.get_data_yahoo('SPY', start, end)
us_holidays=holidays.UnitedStates()
test=[]
for i in dates:
    if i in us_holidays:
        test.append((history_price['Adj Close'].ix[pd.date_range(end=i, periods=11, freq='B')]))
test

И резултатът е такъв:

Freq: B, Name: Adj Close, dtype: float64, 1995-02-06    32.707565
 1995-02-07    32.749946
 1995-02-08    32.749946
 1995-02-09    32.749946
 1995-02-10    32.792328
 1995-02-13    32.802975
 1995-02-14    32.845356
 1995-02-15    33.025457
 1995-02-16    32.983076
 1995-02-17    32.855933
 1995-02-20          NaN

Дължината на списъка "тест" е 233. Въпросът ми е: как мога да конвертирам този списък в речник, като празниците са ключовете, а цените на акциите са стойности под всеки ключ.

Благодаря ви предварително за насоките.


person wastetime909    schedule 27.07.2016    source източник
comment
Десетте дни преди Нова година ще се припокриват с Коледа. Вашата функция не отчита това.   -  person Alexander    schedule 27.07.2016
comment
Да, наясно съм с това. Технически все още мога да извлека цените на акциите десет работни дни преди Нова година, просто пропускам Коледа.   -  person wastetime909    schedule 27.07.2016


Отговори (1)


Това използва речник и разбиране на списък, за да генерира набор от десет работни дни в САЩ преди всеки празник. След това цените на акциите за тези дни се съхраняват в речник (въведен на празник) като списък с цени, най-новите първи (h-1) и последните последни (h-10).

from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay

holidays = USFederalHolidayCalendar().holidays(start='1995-1-1', end='2015-12-31')
bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar())

start = '1995-01-01'
end = '2015-12-31'
days = 10

dates = {holiday: [holiday - bday_us * n for n in range(1, days + 1)]  
         for holiday in USFederalHolidayCalendar().holidays(start=start, end=end)}

>>> dates
{...
Timestamp('2015-12-25 00:00:00'): [
    Timestamp('2015-12-24 00:00:00'),
    Timestamp('2015-12-23 00:00:00'),
    Timestamp('2015-12-22 00:00:00'),
    Timestamp('2015-12-21 00:00:00'),
    Timestamp('2015-12-18 00:00:00'),
    Timestamp('2015-12-17 00:00:00'),
    Timestamp('2015-12-16 00:00:00'),
    Timestamp('2015-12-15 00:00:00'),
    Timestamp('2015-12-14 00:00:00'),
    Timestamp('2015-12-11 00:00:00')]}

result = {holiday: history_price.ix[dates[holiday]].values for holiday in dates}

>>> result
{...
 Timestamp('2015-12-25 00:00:00'): 
   array([ 203.56598 ,  203.902497,  201.408393,  199.597201,  197.964166,
           201.55487 ,  204.673725,  201.722125,  199.626485,  198.622952])}
person Alexander    schedule 27.07.2016