Python

在 python 中計算 YTD 回報/查找一年的第一個可用數據點

  • July 31, 2018

我需要計算給定數據集的年初至今相對回報。我通常用這個簡單的函式來計算累積相對回報:

def RelPerf(price):
   RelPerf = (price/price[0])
   return RelPerf  

問題在於我需要設置而不是“價格

$$ 0 $$" 每年年初的價格(一年中的第一個可用數據點)。由於數據集不包含一年中每一天的數據,我不能簡單地使用 +365 之類的東西。所以問題是我如何得到動態地將第一個可用數據點的位置放入公式中? 這是使用的數據框的一個簡短範例:

             CLOSE_SPX    Close_iBoxx  A_Returns  B_Returns  A_Vola    B_Vola
2014-05-15    1870.85      234.3017    -0.009362   0.003412   0.170535  0.075468   
2014-05-16    1877.86      234.0216     0.003747  -0.001195   0.170153  0.075378
2014-05-19    1885.08      233.7717     0.003845  -0.001068   0.170059  0.075384   
2014-05-20    1872.83      234.2596    -0.006498   0.002087   0.170135  0.075410   
2014-05-21    1888.03      233.9101     0.008116  -0.001492   0.169560  0.075326   
2014-05-22    1892.49      233.5429     0.002362  -0.001570   0.169370  0.075341   
2014-05-23    1900.53      233.8605     0.004248   0.001360   0.168716  0.075333   
2014-05-27    1911.91      234.0368     0.005988   0.000754   0.168797  0.075294   
2014-05-28    1909.78      235.4454    -0.001114   0.006019   0.168805  0.075474   
2014-05-29    1920.03      235.1813     0.005367  -0.001122   0.168866  0.075451   
2014-05-30    1923.57      235.2161     0.001844   0.000148   0.168844  0.075430   
2014-06-02    1924.97      233.8868     0.000728  -0.005651   0.168528  0.075641   
2014-06-03    1924.24      232.9049    -0.000379  -0.004198   0.167852  0.075267

您需要使用 groupby、timegrouper 及其年度選項,並在每個組中取第一個值。

例如,如果我抓取雅虎數據:

import pandas as pd
import pandas.io.data as web

# Grab S&P 500 data going back to beginning of 2011
SPY_Dat = web.DataReader('SPY', 'yahoo', datetime.date(2011,1,1), end)

# Convert to annual data:
SPY_Ann_Dat = SPY_Dat.groupby(pd.TimeGrouper('A')).nth(0)

在這種情況下,我們使用的是年度時間分組 (‘A’)。我們還可以使用每月 (M)、每季度 (Q) 或每週 (W)。

有趣的是,nth 也可以使用負索引,所以如果我們想得到每年的最後一天,我們可以將最後一行更改為:

SPY_Last_Ann_Dat = SPY_Dat.groupby(pd.TimeGrouper('A')).nth(-1)

所以,現在,如果我們想像您的範例一樣計算 YTD 回報,我們可以稍微調整一下,不僅要獲取第一個日期,還可以使用每個組中第一個日期的數據進行轉換:

import pandas as pd
import pandas.io.data as web

# Grab S&P 500 data going back to beginning of 2011
SPY_Dat = web.DataReader('SPY', 'yahoo', datetime.date(2011,1,1))

# Group the data with the same TimeGrouper to get things grouped by year
SPY_GroupedDat = SPY_Dat.groupby(pd.TimeGrouper('A'))

# Create a new column with YTD data of adjusted close, using a transformation lambda function applied to our group data.
SPY_Dat["YTD"] = SPY_GroupedDat['Adj Close'].transform(lambda x: x/x.iloc[0]-1.0)

這將在 SPY_Dat 中產生一列,該列是 YTD 的執行回報,在每年的第一個交易日重置。

引用自:https://quant.stackexchange.com/questions/18085