根据彭博API中选定的季度数据计算回报

2024-09-22 14:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

                  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-012011-07-012011-10-032011-01-03
  2. 取平均值,用2011-01-03中的数据除以,并将结果放入2012-01-03行的新列中
  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

这段代码反而产生了“滚动”的意思,而不是我所期望的。你知道吗

有人知道如何解决这个问题吗?,我花了好几天的时间来解决这个问题。我是Python的新手,如果这是基本问题,我很抱歉。你知道吗


Tags: 数据apiweb目标dfreturnon条件
1条回答
网友
1楼 · 发布于 2024-09-22 14:29:25

您可以使用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)

确保您的索引是datetimeindex。如果不是这样,你可以做:

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

注:您的样本包含2个日期为2011-01-03的值。如果最后一个值是错误的,您可能希望在2011-04-01开始您的季度,这将给您2012-01-02作为您的最后一个季度日期。如果它们都有效,但要排除平均值中的第一个,则需要在上面的第一行中添加.iloc[1:]。你知道吗

相关问题 更多 >