{"slug":"why-rsi-differs-between-platforms","qid":"warmup_drift","label":"One session, one formula, different amounts of warm-up","post_title":"Why Your RSI Differs Between Platforms","post_url":"/blog/why-rsi-differs-between-platforms#q-warmup_drift","columns":["warmup_bars","rsi_wilder","rsi_simple"],"rows":[{"warmup_bars":"0","rsi_wilder":49.07,"rsi_simple":49.07},{"warmup_bars":"1","rsi_wilder":42.35,"rsi_simple":49.07},{"warmup_bars":"2","rsi_wilder":39.73,"rsi_simple":49.07},{"warmup_bars":"5","rsi_wilder":38.03,"rsi_simple":49.07},{"warmup_bars":"10","rsi_wilder":43.08,"rsi_simple":49.07},{"warmup_bars":"20","rsi_wilder":46.95,"rsi_simple":49.07},{"warmup_bars":"40","rsi_wilder":47.14,"rsi_simple":49.07},{"warmup_bars":"80","rsi_wilder":46.92,"rsi_simple":49.07},{"warmup_bars":"160","rsi_wilder":46.91,"rsi_simple":49.07},{"warmup_bars":"250","rsi_wilder":46.91,"rsi_simple":49.07}],"shape":"ranking","sql":"WITH\n    daily AS\n    (\n        SELECT arraySort(groupArray((day, px))) AS pts\n        FROM\n        (\n            SELECT\n                date                  AS day,\n                toFloat64(max(close)) AS px\n            FROM global_markets.stocks_daily_aggs\n            WHERE ticker = 'AAPL'\n              AND date >= '2025-01-02'\n              AND date <= '2026-06-30'\n            GROUP BY day\n        )\n    ),\n    steps AS\n    (\n        SELECT arrayPopFront(arrayDifference(arrayMap(p -> p.2, pts))) AS chg\n        FROM daily\n    ),\n    grid AS\n    (\n        SELECT\n            arrayMap(x -> greatest(x, 0.0),  chg) AS up,\n            arrayMap(x -> greatest(-x, 0.0), chg) AS dn,\n            toInt64(length(chg))                  AS e,\n            toInt64(arrayJoin([0, 1, 2, 5, 10, 20, 40, 80, 160, 250])) AS warmup\n        FROM steps\n    ),\n    seeded AS\n    (\n        SELECT\n            warmup,\n            (arraySum(arraySlice(up, e - warmup - 13, 14)) / 14) * pow(13.0 / 14.0, warmup)\n                + arraySum(arrayMap((g, j) -> g * pow(13.0 / 14.0, toInt64(j) - 1),\n                      arrayReverse(arraySlice(up, e - warmup + 1, warmup)),\n                      arrayEnumerate(arraySlice(up, e - warmup + 1, warmup)))) / 14 AS up_wilder,\n            (arraySum(arraySlice(dn, e - warmup - 13, 14)) / 14) * pow(13.0 / 14.0, warmup)\n                + arraySum(arrayMap((g, j) -> g * pow(13.0 / 14.0, toInt64(j) - 1),\n                      arrayReverse(arraySlice(dn, e - warmup + 1, warmup)),\n                      arrayEnumerate(arraySlice(dn, e - warmup + 1, warmup)))) / 14 AS dn_wilder,\n            arraySum(arraySlice(up, e - 13, 14)) / 14 AS up_simple,\n            arraySum(arraySlice(dn, e - 13, 14)) / 14 AS dn_simple\n        FROM grid\n    )\nSELECT\n    toString(warmup)                                                      AS warmup_bars,\n    round(100 - 100 / (1 + up_wilder / greatest(dn_wilder, 0.000001)), 2) AS rsi_wilder,\n    round(100 - 100 / (1 + up_simple / greatest(dn_simple, 0.000001)), 2) AS rsi_simple\nFROM seeded\nORDER BY warmup","computed_at":"2026-08-17T15:36:40.498958+00:00","elapsed":0.036518874}