Рассчитать доходность от выбранных квартальных данных в пандах Python из Bloomberg API - PullRequest
0 голосов
/ 27 июня 2019

В настоящее время я работаю с Bloomberg API и делаю web crawler для фрейма данных Python для панд. Я получил данные и работаю над тем, чтобы провести с ними некоторый анализ, чтобы создать какую-то симуляцию. Допустим, у меня есть эти данные:

                  ABC US Equity
      2011-01-03    243.00
      2011-01-04    243.58
      2011-01-05    243.45
      2011-01-06    244.28
      2011-01-07    244.13
      2011-01-10    244.32
      2011-01-11    245.83
      2011-01-12    246.31
      2011-01-13    247.05
      2011-01-14    247.39
      2011-01-17    249.24
      2011-01-18    248.93
      2011-01-19    248.68
      2011-01-20    248.30
      2011-01-21    249.81
               ...  
      2011-04-01    437.32
               ...
      2011-07-01    438.40
               ...
      2011-10-03    438.79
               ... 
      2012-01-03    438.79

Цель

Я хотел бы добавить новый столбец, который рассчитывает доходность по этим критериям:

  1. Значение берется из квартальных данных, в данном случае из 2011-04-01 , 2011-07-01 , 2011-10-03 и 2011-01-03
  2. Усредните их и разделите их с данными из 2011-01-03 и поместите результат в новый столбец в 2012-01-03 строка
  3. Это применимо и к следующему ряду

Expectation

                 ABC US Equity   Return
      2011-01-03    243.00      #The result should be (average(437.32+438.40+438.79+439.81)/243.00)-1
      2011-01-04    243.58       and so on, same calculation on the next row
      2011-01-05    243.45       ... 
      2011-01-06    244.28       ...
      2011-01-07    244.13       ... 
      2011-01-10    244.32
      2011-01-11    245.83
      2011-01-12    246.31
      2011-01-13    247.05
      2011-01-14    247.39
      2011-01-17    249.24
      2011-01-18    248.93
      2011-01-19    248.68
      2011-01-20    248.30
      2011-01-21    249.81
               ...  
      2011-04-01    437.32
               ...
      2011-07-01    438.40
               ...
      2011-10-03    438.79
               ... 
      2012-01-03    439.81

До сих пор я пытался вычислить только среднее значение, но сам результат все еще далек от моих ожиданий

df['Return'] = [
    df2.loc[
        edt - pd.tseries.offsets.DateOffset(months=4):edt,
        'ABC US Equity'].mean() 
        for edt in df.index

Этот код вместо этого производит "скользящее" среднее, а не то, что я ожидаю.

Кто-нибудь знает, как решить эту проблему? Я потратил несколько дней, чтобы понять это. Я новичок в Python, извиняюсь, если это основная проблема.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Давайте начнем с первого набора кварталов:

quarters = pd.date_range(pd.Timestamp(2011,4,1), periods=4, freq='BQS')

Чтобы сделать их на 1 день вперед, вы можете использовать понимание списка:

rolling_quarters = [quarters + pd.Timedelta(days=i) for i in range(len(df))]

Тогда ваши значения сравнения:

comp_values = [df.reindex(q).values.mean() for q in rolling_quarters]

Ваши результаты будут:

comp_values/df['ABC US Equity']-1 
0 голосов
/ 27 июня 2019

Вы можете использовать pd.date_range для установки кварталов сравнения. Вы просто выбираете дату начала, выбираете, сколько периодов вы хотите, и, установив freq='BQS', вы получаете начало рабочего квартала:

quarters = pd.date_range(pd.Timestamp(2011,4,1), periods=4, freq='BQS')

Затем вы можете установить свой столбец результатов на:

(df.loc[df['date_column'].isin(quarters), ['ABC US Equity']]
   .apply(lambda x: x.mean()/df['ABC US Equity']-1))

РЕДАКТИРОВАТЬ: Если ваш столбец даты является индексом, вы можете сделать:

df.reindex(quarters).apply(lambda x: x.mean()/df['ABC US Equity']-1)

Убедитесь, что ваш индекс - индекс datetime. Если это не так, вы можете сделать:

df.index = pd.to_datetime(df.index)

Примечание. Ваш образец содержит 2 значения с датой 2011-01-03. Если последнее значение является ошибкой, вы можете начать свои кварталы в 2011-04-01, что даст вам 2012-01-02 в качестве даты последнего квартала. Если они оба действительны, но вы хотите исключить первое в среднем, вам нужно будет добавить .iloc[1:] к первой строке выше.

...