mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-06 21:17:44 +00:00
feat: add ADF (Augmented Dickey-Fuller) indicator
- Core implementation with Cholesky OLS, MacKinnon p-value, AIC lag selection - Three regression models: NoConstant, Constant, ConstantAndTrend - NormCdf via Abramowitz & Stegun 7.1.26 erf approximation - Quantower adapter, Python bridge (NativeAOT export + ctypes + wrapper) - 69 tests (41 unit + 12 validation + 14 Quantower + 2 consistency) - Documentation with Schwert table, MacKinnon coefficients, PineScript ref - All 19,095 tests pass, zero warnings
This commit is contained in:
@@ -254,6 +254,7 @@ HAS_WAD = _bind("qtl_wad", [_dp, _dp, _dp, _dp, _dp, _ci])
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# Statistics
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
HAS_ADF = _bind("qtl_adf", [_dp, _dp, _ci, _ci, _ci, _ci])
|
||||
HAS_ACF = _bind("qtl_acf", [_dp, _dp, _ci, _ci, _ci])
|
||||
HAS_GEOMEAN = _bind("qtl_geomean", [_dp, _dp, _ci, _ci])
|
||||
HAS_GRANGER = _bind("qtl_granger", [_dp, _dp, _dp, _ci, _ci])
|
||||
|
||||
@@ -8,6 +8,7 @@ from ._helpers import _arr, _ptr, _out, _wrap, _wrap_multi, _check, _lib
|
||||
|
||||
|
||||
__all__ = [
|
||||
"adf",
|
||||
"acf",
|
||||
"geomean",
|
||||
"granger",
|
||||
@@ -43,6 +44,19 @@ __all__ = [
|
||||
]
|
||||
|
||||
|
||||
def adf(close: object, period: int = 50, max_lag: int = 0, regression: int = 1, offset: int = 0, **kwargs) -> object:
|
||||
"""Augmented Dickey-Fuller test p-value."""
|
||||
period = int(kwargs.get("length", period))
|
||||
max_lag = int(max_lag)
|
||||
regression = int(regression)
|
||||
offset = int(offset)
|
||||
src, idx = _arr(close)
|
||||
n = len(src)
|
||||
output = _out(n)
|
||||
_check(_lib.qtl_adf(_ptr(src), _ptr(output), n, period, max_lag, regression))
|
||||
return _wrap(output, idx, f"ADF_{period}", "statistics", offset)
|
||||
|
||||
|
||||
def acf(close: object, period: int = 14, lag: int = 10, offset: int = 0, **kwargs) -> object:
|
||||
"""Autocorrelation Function."""
|
||||
period = int(kwargs.get("length", period))
|
||||
|
||||
@@ -105,6 +105,19 @@ public static unsafe partial class Exports
|
||||
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(EntryPoint = "qtl_adf")]
|
||||
public static int QtlAdf(double* source, double* output, int n, int period, int maxLag, int regression)
|
||||
{
|
||||
if (source == null || output == null) return StatusCodes.QTL_ERR_NULL_PTR;
|
||||
if (n <= 0) return StatusCodes.QTL_ERR_INVALID_LENGTH;
|
||||
try
|
||||
{
|
||||
Adf.Batch(Src(source, n), Dst(output, n), period, maxLag, (Adf.AdfRegression)regression);
|
||||
return StatusCodes.QTL_OK;
|
||||
}
|
||||
catch { return StatusCodes.QTL_ERR_INTERNAL; }
|
||||
}
|
||||
|
||||
[UnmanagedCallersOnly(EntryPoint = "qtl_adl")]
|
||||
public static int QtlAdl(double* high, double* low, double* close, double* volume, double* output, int n)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user