根据彭博 python pandas 中选定的季度数据计算 return API

Calculate return from selected quarterly data in python pandas from Bloomberg API

目前,我正在使用 Bloomberg API,并处理一些 web crawler 到 Python pandas 数据框。我已经检索了数据,并努力对它们进行一些分析以创建某种模拟。比方说,我有这个数据:

                  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

Objective

我想添加新的列来计算 return 基于这个标准:

  1. 它从季度间隔数据中获取值,在本例中为 2011-04-012011-07-012011-10-032011-01-03
  2. 对它们进行平均并将它们与来自 2011-01-03 的数据相除,并将结果放入 2012-01-03[=46] 的新列中=]行
  3. 下一行也适用

预期

                 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

这段代码反而产生了 "rolling" 意思,不是我所期望的。

有人知道如何破解这个问题吗?我花了几天时间才弄明白。我是 Python 的新手,如果这是基本问题,我深表歉意。

您可以使用pd.date_range设置比较季度。您只需选择开始日期,select 您想要的周期数,然后通过设置 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)

确保您的索引是日期时间索引。如果不是,你可以这样做:

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

注意:您的示例包含 2 个日期为 2011-01-03 的值。如果最后一个值有误,您可能希望从 2011-04-01 开始您的季度,这将使您的最后一个季度日期为 2012-01-02。如果它们都有效但您想排除平均值中的第一个,则需要将 .iloc[1:] 添加到上面的第一行。

让我们从第一组开始:

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