{"slug":"llm-generated-alpha-factors","qid":"noise_sweep","label":"240 coin flip factors scored on real prices: annualized Sharpe, Jan 2016 to Jun 2021","post_title":"Can an LLM Find Alpha Factors?","post_url":"/blog/llm-generated-alpha-factors#q-noise_sweep","columns":["sharpe_bucket","factor_count","share_pct"],"rows":[{"sharpe_bucket":"below -1.2","factor_count":1,"share_pct":0.4},{"sharpe_bucket":"-1.2 to -0.8","factor_count":10,"share_pct":4.2},{"sharpe_bucket":"-0.8 to -0.4","factor_count":32,"share_pct":13.3},{"sharpe_bucket":"-0.4 to 0.0","factor_count":77,"share_pct":32.1},{"sharpe_bucket":"0.0 to 0.4","factor_count":71,"share_pct":29.6},{"sharpe_bucket":"0.4 to 0.8","factor_count":40,"share_pct":16.7},{"sharpe_bucket":"0.8 to 1.2","factor_count":8,"share_pct":3.3},{"sharpe_bucket":"1.2 and above","factor_count":1,"share_pct":0.4}],"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('2021-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           avg(long_short_ret) / stddevSamp(long_short_ret) * sqrt(12) AS sharpe\n    FROM factor_month\n    GROUP BY trial_id\n    HAVING stddevSamp(long_short_ret) > 0\n)\nSELECT multiIf(sharpe < -1.2, 'below -1.2',\n               sharpe < -0.8, '-1.2 to -0.8',\n               sharpe < -0.4, '-0.8 to -0.4',\n               sharpe <  0.0, '-0.4 to 0.0',\n               sharpe <  0.4, '0.0 to 0.4',\n               sharpe <  0.8, '0.4 to 0.8',\n               sharpe <  1.2, '0.8 to 1.2',\n               '1.2 and above') AS sharpe_bucket,\n       count() AS factor_count,\n       round(100 * count() / 240, 1) AS share_pct\nFROM scored\nGROUP BY sharpe_bucket\nORDER BY min(sharpe)","computed_at":"2026-08-02T08:34:24.436461+00:00","elapsed":27.027397441}