两个列表的长度差异

问题描述 投票:0回答:1

我有这个函数可以计算一系列水下的周期(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()

提前致谢。

python list time-series series
1个回答
0
投票
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

主要变化:

  • 检查 rel_loss[i-1] > 0 和 rel_loss[i] <= 0 to catch endings at 0
  • 明确处理最后的任何开放性提款
  • 截断结束日期以匹配起始日期长度

--希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.