Python Pandas ETF时间序列数据计算每个ETF的跟踪时间段

rkkpypqq  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(123)

我有13只ETF基金的回报率时间序列。我检索了yfinance从2017年1月31日到2023年3月31日的月度历史回报- 5.25年的月度回报。

import yfinance as yf
   
tickers_list = ['IVV', 'SPY', 'VOO', 'IWM', 'VTWO', 'VUG', 'MGK', 'IYW', 'SMH','SOXL', 'TECL', 'QQQ', 'IWP']

# Fetch the data
data = yf.download(tickers_list,'2016-12-31', '2023-03-31')['Adj Close'].resample('M').ffill().pct_change()*100

print(data)

[*********************100%***********************]  13 of 13 completed
                 IVV       IWM       IWP        IYW        MGK        QQQ  \
Date                                                                        
2018-01-31       NaN       NaN       NaN        NaN        NaN        NaN   
2018-02-28 -3.804348 -3.843673 -3.147805   0.406958  -2.802898  -1.292810   
2018-03-31 -2.477626  1.217483 -0.132897  -3.782773  -3.168533  -4.078817   
2018-04-30  0.354223  0.981397 -0.992279  -0.118908   0.409860   0.505834   
2018-05-31  2.410717  6.163581  3.770650   7.499553   4.649504   5.672917   
...              ...       ...       ...        ...        ...        ...   
2022-11-30  5.551971  2.203672  5.362622   6.584629   4.494448   5.544149   
2022-12-31 -5.728810 -6.514127 -6.024389  -8.342131  -8.791930  -9.013667   
2023-01-31  6.272610  9.818770  8.720104  11.008199  10.722378  10.642924   
2023-02-28 -2.532388 -1.723420 -1.023219   0.737697  -1.459161  -0.359781   
2023-03-31  2.290707 -6.564785 -0.550342   9.668837   7.127450   7.701563   

                  SMH       SOXL       SPY       TECL       VOO      VTWO  \
Date                                                                        
2018-01-31        NaN        NaN       NaN        NaN       NaN       NaN   
2018-02-28   0.028171  -2.869297 -3.636015  -4.143532 -3.726007 -3.846475   
2018-03-31  -2.121285  -9.531145 -2.741069 -12.784944 -2.467635  1.133835   
2018-04-30  -6.827767 -20.226410  0.516831  -1.433560  0.346994  1.057984   
2018-05-31  10.323185  35.518003  2.430893  20.565807  2.416443  6.086664   
...               ...        ...       ...        ...       ...       ...   
2022-11-30  20.351965  54.932731  5.559164  14.424575  5.505000  2.146921   
2022-12-31  -9.872508 -29.779331 -5.762832 -24.745740 -5.732450 -6.447269   
2023-01-31  16.832563  50.155129  6.288740  27.737546  6.290209  9.776884   
2023-02-28   0.970050   0.895312 -2.514271  -0.885582 -2.498403 -1.695793   
2023-03-31   9.177110  22.710299  2.266375  27.753202  2.281491 -6.527044   

                  VUG  
Date                   
2018-01-31        NaN  
2018-02-28  -2.921836  
2018-03-31  -2.490675  
2018-04-30   0.274836  
2018-05-31   4.386032  
...               ...  
2022-11-30   4.624219  
2022-12-31  -8.363891  
2023-01-31  10.384313  
2023-02-28  -1.424080  
2023-03-31   5.852608  

[63 rows x 13 columns]

我想检索市场价值,并在资产ID列中计算ETF基金的3个月、1年和3年回报。我使用ETF价格计算的市场价值。ETF数据源,并希望输出如下所示:

这是我迄今为止的脚本,但只适用于一个ETF基金-我需要做所有13个基金,并像图中的输出一样布局它们。

enter code here import datetime 
from datetime import datetime
import dateutil.relativedelta
from pandas.tseries.offsets import DateOffset
from dateutil.relativedelta import relativedelta
from datetime import date, timedelta
import pandas as pd
import numpy as np

#As of Date:
VME = '3/31/2023'

#3 Month Return
df_3m = df_data.loc[(df_data['SecurityID'] =='VOO')  & (df_data['Date'] >= pd.to_datetime(VME)-pd.DateOffset(months= 2)) & (df_data['Date'] <= VME)]
df_3mror = (np.prod(df_3m['Return']/100+1)-1)*100

#1 Year Return
df_1yr = df_data.loc[(df_data['SecurityID'] =='VOO')  & (df_data['Date'] >= pd.to_datetime(VME)-pd.DateOffset(months= 11)) & (df_data['Date'] <= VME)]
df_1ror = (np.prod(df_1yr['Return']/100+1)-1)*100

#3 Year Return
df_3yr = df_data.loc[(df_data['SecurityID'] =='VOO')  & (df_data['Date'] >= pd.to_datetime(VME)-pd.DateOffset(months= 35)) & (df_data['Date'] <= VME)]
df_3ror = (np.prod(df_3yr['Return']/100+1)**(12/36)-1)*100
   
print(df_3mror)
print(df_1ror)
print(df_3ror)

我希望有人能指导我或能够弄清楚如何做所有的ETF基金在一个镜头,并奠定了它一样,在图片。再次感谢您为我们新学员提供的帮助。

zf9nrax1

zf9nrax11#

我不能自己检查你在你的帖子中提供了什么,但我建议你重构你的代码:

  • 定义一个空的 Dataframe 名称results,例如
  • 迭代ETF代码以计算每个代码的不同回报
  • 在每次迭代结束时将结果与Pandas concat一起追加

就像这样:

results = pd.DataFrame()
for etf in df_data["SecurityID"].unique():
    # 3 Month Return
    df_3m = df_data.loc[
        (df_data["SecurityID"] == etf)
        & (df_data["Date"] >= pd.to_datetime(VME) - pd.DateOffset(months=2))
        & (df_data["Date"] <= VME)
    ]
    df_3mror = (np.prod(df_3m["Return"] / 100 + 1) - 1) * 100

    # 1 Year Return
    df_1yr = df_data.loc[
        (df_data["SecurityID"] == etf)
        & (df_data["Date"] >= pd.to_datetime(VME) - pd.DateOffset(months=11))
        & (df_data["Date"] <= VME)
    ]
    df_1ror = (np.prod(df_1yr["Return"] / 100 + 1) - 1) * 100

    # 3 Year Return
    df_3yr = df_data.loc[
        (df_data["SecurityID"] == etf)
        & (df_data["Date"] >= pd.to_datetime(VME) - pd.DateOffset(months=35))
        & (df_data["Date"] <= VME)
    ]
    df_3ror = (np.prod(df_3yr["Return"] / 100 + 1) ** (12 / 36) - 1) * 100

    results = pd.concat(
        [
            results,
            pd.DataFrame(
                {
                    "AccountNumber": [85150],
                    "AssetID": [etf],
                    "3 Months": [df_3mror],
                    "1 YR ROR": [df_1ror],
                    "3 YRS ROR": [df_3ror],
                }
            ),
        ]
    )

相关问题