Python中最大水位下降的开始、结束和持续时间

2024-04-26 10:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个时间序列,我想计算最大下降,我也想找到最大下降的起点和终点,这样我就可以计算持续时间。我想在时间序列图上标记缩编的开始和结束,如下所示:

a busy cat

到目前为止,我已经有了生成随机时间序列的代码,还有计算最大下降的代码。如果有人知道如何确定开始和结束的地方,我真的很感激!

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# create random walk which I want to calculate maximum drawdown for:

T = 50
mu = 0.05
sigma = 0.2
S0 = 20
dt = 0.01
N = round(T/dt)
t = np.linspace(0, T, N)
W = np.random.standard_normal(size = N) 
W = np.cumsum(W)*np.sqrt(dt) ### standard brownian motion ###
X = (mu-0.5*sigma**2)*t + sigma*W 

S = S0*np.exp(X) ### geometric brownian motion ###
plt.plot(S)

# Max drawdown function      

def max_drawdown(X):
    mdd = 0
    peak = X[0]
    for x in X:
        if x > peak: 
            peak = x
        dd = (peak - x) / peak
        if dd > mdd:
            mdd = dd
    return mdd    

drawSeries = max_drawdown(S)
MaxDD = abs(drawSeries.min()*100)
print MaxDD


plt.show()

Tags: 代码importforasnp时间dtplt
2条回答

你的最大降幅已经记录了峰值位置。修改if以便在存储mdd和return mdd, peak, mdd_end时也存储结束位置mdd_end

只需找出运行最大值减去当前值的最大值:

n = 1000
xs = np.random.randn(n).cumsum()
i = np.argmax(np.maximum.accumulate(xs) - xs) # end of the period
j = np.argmax(xs[:i]) # start of period

plt.plot(xs)
plt.plot([i, j], [xs[i], xs[j]], 'o', color='Red', markersize=10)

drawdown

相关问题 更多 >