qka 2.4.5.dev2__tar.gz → 2.4.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {qka-2.4.5.dev2 → qka-2.4.6}/PKG-INFO +1 -1
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/indicator.py +7 -2
- {qka-2.4.5.dev2 → qka-2.4.6}/.github/workflows/release.yml +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/.gitignore +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/.vscode/settings.json +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/CHANGELOG.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/LICENSE +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/README.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/pyproject.toml +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/__init__.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/cli.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/__init__.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/accessor.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/analysis.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/backtest.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/broker.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/data.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/report.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/simulate.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/sizing.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/strategy.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/core/tdx.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/utils/__init__.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/qka/utils/logger.py +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/SKILL.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/references/analysis.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/references/backtest.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/references/broker.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/references/data.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/references/sizing.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/skills/qka/references/strategy.md +0 -0
- {qka-2.4.5.dev2 → qka-2.4.6}/tools/generate_api_ref.py +0 -0
|
@@ -105,8 +105,13 @@ def max_drawdown(df: pd.DataFrame, symbol: str, window: int) -> pd.Series:
|
|
|
105
105
|
cum_values = cum.values
|
|
106
106
|
result = np.full(len(cum_values), np.nan)
|
|
107
107
|
for i in range(window - 1, len(cum_values)):
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
seg = cum_values[i - window + 1 : i + 1]
|
|
109
|
+
# 窗口内逐日刷新峰值,再取「任意时刻从峰到谷」最深的那一次。
|
|
110
|
+
# 旧实现只算 (末值 - 窗口峰值) / 窗口峰值 —— 那是「当前回撤」(现在离最高点多远),
|
|
111
|
+
# 会漏掉中间已经发生过的深坑:净值 1 → 1.2 → 0.6 → 1.3,旧算法给 0,
|
|
112
|
+
# 实际最深跌过 -50%。与 analysis.max_drawdown 的口径也不一致。
|
|
113
|
+
peak = np.maximum.accumulate(seg)
|
|
114
|
+
result[i] = np.min(seg / peak - 1.0)
|
|
110
115
|
return pd.Series(result, index=cum.index)
|
|
111
116
|
|
|
112
117
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|