{"slug":"llm-generated-alpha-factors","qid":"holdout_decay","label":"The twelve best trials in training, re-scored on five untouched years (Jul 2021 to Jun 2026)","post_title":"Can an LLM Find Alpha Factors?","post_url":"/blog/llm-generated-alpha-factors#q-holdout_decay","columns":["factor_label","in_sample_sharpe","out_of_sample_sharpe"],"rows":[{"factor_label":"trial 151","in_sample_sharpe":1.59,"out_of_sample_sharpe":-0.51},{"factor_label":"trial 147","in_sample_sharpe":1.18,"out_of_sample_sharpe":-0.6},{"factor_label":"trial 96","in_sample_sharpe":1.1,"out_of_sample_sharpe":0.04},{"factor_label":"trial 224","in_sample_sharpe":1.06,"out_of_sample_sharpe":-0.3},{"factor_label":"trial 183","in_sample_sharpe":0.96,"out_of_sample_sharpe":0.02},{"factor_label":"trial 221","in_sample_sharpe":0.91,"out_of_sample_sharpe":0.07},{"factor_label":"trial 77","in_sample_sharpe":0.9,"out_of_sample_sharpe":-0.11},{"factor_label":"trial 171","in_sample_sharpe":0.86,"out_of_sample_sharpe":0.57},{"factor_label":"trial 152","in_sample_sharpe":0.82,"out_of_sample_sharpe":-0.52},{"factor_label":"trial 198","in_sample_sharpe":0.78,"out_of_sample_sharpe":-0.31},{"factor_label":"trial 223","in_sample_sharpe":0.78,"out_of_sample_sharpe":0.46},{"factor_label":"trial 206","in_sample_sharpe":0.74,"out_of_sample_sharpe":0.49}],"shape":"ranking","sql":"WITH month_end AS (\n    SELECT ticker,\n           toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,\n           argMax(toFloat64(close), window_start) AS close_px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('AAPL','ADBE','AMZN','BA','CAT','COST','CRM','CSCO','CVX','DE',\n                     'DUK','GE','GOOGL','HD','HON','IBM','INTC','JNJ','JPM','KO',\n                     'LMT','MCD','MMM','MRK','MSFT','NKE','NVDA','ORCL','PEP','PFE',\n                     'PG','QCOM','SO','T','TGT','TXN','UNP','VZ','WMT','XOM')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2015-12-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')\n      AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) >= 22\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker, month_start\n),\nlagged AS (\n    SELECT ticker,\n           month_start,\n           close_px,\n           lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY month_start\n                                      ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_px\n    FROM month_end\n),\nmonthly_return AS (\n    SELECT ticker, month_start, close_px / prev_px - 1 AS ret\n    FROM lagged\n    WHERE prev_px > 0\n      AND month_start >= toDate('2016-01-01')\n),\ntrial AS (\n    SELECT arrayJoin(range(1, 241)) AS n\n),\nfactor_month AS (\n    SELECT t.n AS trial_id,\n           m.month_start AS month_start,\n           avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1)\n         - avgIf(m.ret, bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) AS long_short_ret\n    FROM monthly_return AS m\n    CROSS JOIN trial AS t\n    GROUP BY trial_id, month_start\n    HAVING countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 1) > 0\n       AND countIf(bitAnd(cityHash64(m.ticker, toString(m.month_start), t.n), 1) = 0) > 0\n),\nscored AS (\n    SELECT trial_id,\n           avgIf(long_short_ret, month_start <  toDate('2021-07-01'))\n             / stddevSampIf(long_short_ret, month_start <  toDate('2021-07-01')) * sqrt(12) AS in_sample_sharpe,\n           avgIf(long_short_ret, month_start >= toDate('2021-07-01'))\n             / stddevSampIf(long_short_ret, month_start >= toDate('2021-07-01')) * sqrt(12) AS out_of_sample_sharpe\n    FROM factor_month\n    GROUP BY trial_id\n    HAVING countIf(month_start <  toDate('2021-07-01')) >= 24\n       AND countIf(month_start >= toDate('2021-07-01')) >= 24\n)\nSELECT concat('trial ', toString(trial_id)) AS factor_label,\n       round(in_sample_sharpe, 2) AS in_sample_sharpe,\n       round(out_of_sample_sharpe, 2) AS out_of_sample_sharpe\nFROM scored\nORDER BY in_sample_sharpe DESC\nLIMIT 12","computed_at":"2026-08-02T08:35:46.156259+00:00","elapsed":53.067333442}