我有这个函数可以计算一系列水下的周期(sp_500):
def period_under_water(series: pd.Series):
max_to_date = np.empty(len(series))
max_to_date[0] = series.iloc[0]
idx_max = np.empty(len(series), dtype='int')
idx_max[0] = 0
T = len(series.index)
HMW = []
control = False
for t in range(1, T):
current_val = series.iloc[t]
if current_val < max_to_date[t-1]:
max_to_date[t] = max_to_date[t-1]
idx_max[t] = idx_max[t-1]
if not control:
HMW.append(series.iloc[t-1])
control = True
else:
max_to_date[t] = current_val
idx_max[t] = t
control = False
starting_dates = series[series.isin(HMW)].index.tolist()
rel_loss = (max_to_date - series) / max_to_date
ending_dates = []
for i in range(1, len(rel_loss)):
if rel_loss[i] == 0 and rel_loss[i-1] > 0: # Condition for the end of drawdown
ending_dates.append(series.index[i])
return HMW, starting_dates, ending_dates
问题是starting_dates (240) 的长度与ending_dates (234) 的长度不匹配。我希望它们相等,或者最多,starting_dates = 240 和ending_dates = 239。我做错了什么?
HMW 代表高水位线,是价格指数中的点,在该点处指数值大于任何先前的指数值,随后出现亏损。 starting_dates 是存储所有 HMW 日期的列表,ending_dates 是存储再次超越 HMW 的日期的列表。
为了获得同一系列,我正在使用以下代码进行编码:
start_date = "2000-1-1"
end_date = "2022-12-31"
sp_500 = yf.download("SPY", start = start_date, end = end_date)[["Adj Close"]]
sp_500 = sp_500.squeeze()
提前致谢。
import pandas as pd
import numpy as np
def period_under_water(series: pd.Series):
max_to_date = np.empty(len(series))
max_to_date[0] = series.iloc[0]
idx_max = np.empty(len(series), dtype='int')
idx_max[0] = 0
T = len(series.index)
HMW = []
control = False
for t in range(1, T):
current_val = series.iloc[t]
if current_val < max_to_date[t-1]:
max_to_date[t] = max_to_date[t-1]
idx_max[t] = idx_max[t-1]
if not control:
HMW.append(series.iloc[t-1])
control = True
else:
max_to_date[t] = current_val
idx_max[t] = t
control = False
starting_dates = series[series.isin(HMW)].index.tolist()
rel_loss = (max_to_date - series) / max_to_date
ending_dates = []
for i in range(1, len(rel_loss)):
if rel_loss[i-1] > 0 and rel_loss[i] <= 0:
ending_dates.append(series.index[i])
# Catch any remaining open drawdowns
if rel_loss[-1] > 0:
ending_dates.append(series.index[-1])
# Align lengths
ending_dates = ending_dates[:len(starting_dates)]
return HMW, starting_dates, ending_dates
主要变化:
--希望这有帮助