Python
在 python 中計算 YTD 回報/查找一年的第一個可用數據點
我需要計算給定數據集的年初至今相對回報。我通常用這個簡單的函式來計算累積相對回報:
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 的執行回報,在每年的第一個交易日重置。