alpha-factory / README.md
gaurv007's picture
Update ML Intern artifact metadata
4eb54d8 verified
metadata
license: mit
tags:
  - quantitative-finance
  - alpha-generation
  - worldquant-brain
  - ml-intern

Alpha Factory v0.2.0

LLM-assisted alpha expression generator for WorldQuant BRAIN.

This is a Python application, not a model. It generates candidate BRAIN expressions for manual review and submission.

What It Actually Does

Mode What it does Needs LLM? Submits to BRAIN?
Proven Templates (--proven) Generates valid BRAIN expressions using hardcoded templates with novel fields No Optional (--enable-brain)
LLM Mode (default) Uses 1.5B-72B LLMs to generate hypothesis β†’ expression β†’ evaluation Yes (local/cloud) Optional

The pipeline runs:

  1. Theme sampling β€” picks under-explored themes from field registry
  2. Expression generation β€” deterministic templates OR LLM hypothesis + compile
  3. Static lint β€” validates BRAIN syntax (operator arity, look-ahead, parentheses)
  4. Deduplication β€” SHA256 hash to avoid duplicates
  5. Store β€” persists to DuckDB for review
  6. Crowd Scout β€” novelty assessment (LLM or heuristic)
  7. Performance Surgeon β€” diagnoses weak alphas, suggests mutations
  8. Gatekeeper β€” final go/no-go (LLM)
  9. BRAIN submission β€” live submission (requires BRAIN_SESSION_TOKEN)

Quick Start

git clone https://huggingface.co/gaurv007/alpha-factory
cd alpha-factory
pip install -e ".[all]"

Proven Templates (RECOMMENDED β€” no LLM, guaranteed valid)

python -m alpha_factory.run --proven --batch-size 10

Uses proven Alpha 15/6 structures with novel AC=0 fields. Every expression is syntactically valid.

LLM-Assisted Generation

# Needs Ollama or HF token
python -m alpha_factory.run --batch-size 5 --dry-run

Standalone Proven Generator

python -m alpha_factory.generate_proven

Run Tests

pytest tests/ -v

BRAIN Setup

BRAIN uses session-based authentication (browser cookies), not API keys. The session token expires quickly.

  1. Log in to brain.worldquant.com
  2. Open browser DevTools β†’ Network tab
  3. Run any simulation, look for request to api.worldquantbrain.com
  4. Copy the Cookie: session=... header value
  5. Set: export BRAIN_SESSION_TOKEN=your_token_here

No token = dry-run mode only. The pipeline will generate expressions but not submit them.

Architecture

Theme Sampler β†’ Expression Generation β†’ Static Lint β†’ Dedup β†’ Store
     ↓              (Templates or LLM)     ↓           ↓
Crowd Scout β†’ Performance Surgeon β†’ Gatekeeper β†’ BRAIN Submit
                   ↓ (iteration queue)
Winner Memory ← Mutator ← Performance Surgeon

Components

Module Purpose Status
proven_templates.py Deterministic expression generation βœ… Working
lint.py BRAIN syntax validation (arity, lookahead, parens) βœ… Working
pipeline.py Orchestrates all stages βœ… Working
expression_compiler.py Jinja2 templates + LLM fallback βœ… Working
crowd_scout.py Novelty / correlation assessment βœ… Working
performance_surgeon.py Diagnose failures, suggest mutations βœ… Working
gatekeeper.py Final go/no-go memo βœ… Working
wq_client.py BRAIN API submission ⚠️ Needs BRAIN_SESSION_TOKEN
brain_sim.py Local numpy backtest ⚠️ Not wired to pipeline
regime_tagger.py Vol/trend/rate/style regimes ⚠️ Not wired to pipeline

Key Features

  • Proven template mode: No LLM required. Generates valid BRAIN expressions instantly.
  • Field registry: 40+ real BRAIN fields with coverage, alpha counts, and sign conventions.
  • Novel group keys: Uses under-explored neutralization groups (AC ≀ 30) for lower correlation.
  • Static lint: Catches syntax errors before submission (operator arity, look-ahead, unbalanced parens).
  • Kill switches: Circuit breakers for runaway pipelines (consecutive fails, daily limits, token budget).
  • Winner memory: Tracks which field/archetype combinations work, feeds back to generation.
  • Expression mutator: Auto-generates decay, horizon, neutralization, and sign-flip variants.
  • DuckDB store: Persistent history of all alphas, metrics, and verdicts.
  • Retry logic: LLM client retries transient failures (429, 502, 503, 504, timeout) with exponential backoff.

Known Limitations

  1. BRAIN auth is session-based: Token expires. No automatic refresh. You must re-copy from browser.
  2. Local simulation is not wired: brain_sim.py exists but is not integrated into the pipeline. It needs price data (yfinance) and produces approximate results.
  3. Regime tagger not wired: regime_tagger.py exists but is not used by the Performance Surgeon.
  4. LLM generation can hallucinate fields: Static lint catches most errors, but field names from LLMs may not exist on BRAIN.
  5. Weights inside rank() are decorative: rank(0.6*a + 0.4*b) is monotonic β€” coefficients don't linearly combine. The signal comes from which fields are combined.
  6. Not a guarantee of profitable alphas: This generates candidates. BRAIN's simulation is the ground truth.

Configuration

All settings in alpha_factory/config.py. Key ones:

batch_size = 10                     # Candidates per run
use_proven_templates = False        # Set True for deterministic mode
enable_brain_client = False        # Set True for live BRAIN submission
max_parallel_candidates = 3        # Concurrent LLM calls

Or via CLI:

python -m alpha_factory.run --proven --batch-size 10 --enable-brain

Cost

Item Cost
Proven template mode $0 (no LLM)
Local Ollama (7B) $0 (your GPU)
HuggingFace Inference API Free tier / rate-limited
BRAIN submissions $0 (uses your existing BRAIN credits)

File Structure

alpha_factory/
β”œβ”€β”€ config.py                  # All settings (Pydantic v2)
β”œβ”€β”€ run.py                     # Entry point
β”œβ”€β”€ schemas/                   # Typed Pydantic contracts
β”œβ”€β”€ deterministic/
β”‚   β”œβ”€β”€ lint.py                # Static pre-flight (Layer 2)
β”‚   β”œβ”€β”€ theme_sampler.py       # Gap analysis (Layer 1)
β”‚   β”œβ”€β”€ fitness.py             # Composite scoring
β”‚   β”œβ”€β”€ proven_templates.py    # Deterministic generation
β”‚   β”œβ”€β”€ expression_mutator.py  # Evolutionary variants
β”‚   └── regime_tagger.py       # Vol/trend/rate/style regimes (not wired)
β”œβ”€β”€ infra/
β”‚   β”œβ”€β”€ model_manager.py       # Ollama + HF auto-detection
β”‚   β”œβ”€β”€ llm_client.py          # Unified LLM interface (token budget + retry)
β”‚   β”œβ”€β”€ factor_store.py        # DuckDB persistence
β”‚   β”œβ”€β”€ wq_client.py           # BRAIN API wrapper (session auth)
β”‚   └── winner_memory.py       # Feedback loop
β”œβ”€β”€ local/
β”‚   └── brain_sim.py           # Local BRAIN simulator (not wired)
β”œβ”€β”€ personas/
β”‚   β”œβ”€β”€ hypothesis_hunter.py   # Persona 1
β”‚   β”œβ”€β”€ expression_compiler.py # Persona 2
β”‚   β”œβ”€β”€ crowd_scout.py         # Persona 4
β”‚   β”œβ”€β”€ performance_surgeon.py # Persona 5
β”‚   └── gatekeeper.py          # Persona 6
└── orchestration/
    └── pipeline.py            # Full DAG

Changelog v0.2.0

  • Fixed: pv13_ustomergraphrank β†’ pv13_customergraphrank typos
  • Fixed: operators.csv arity mismatches (ts_mean, ts_std, ts_delta now correctly listed as 2-arg)
  • Fixed: cleanup.py no longer blacklists valid BRAIN fields (vwap, close, volume, etc.)
  • Fixed: personas/__init__.py imports real modules instead of stubs
  • Fixed: infra/__init__.py imports real BrainClient instead of stub class
  • Fixed: Expression compiler sign logic β€” now per-component, no global blind negation
  • Fixed: LLM client stops error amplification (no more 3x API calls on auth/network failures)
  • Fixed: LLM client enforces token budget (was declared but never checked)
  • Fixed: LLM client adds retry logic with exponential backoff for transient failures (429, 502, 503, 504, timeout)
  • Fixed: Removed dead enable_local_sim config field and --local-sim CLI flag (local sim exists but is not wired)
  • Fixed: Removed orphan rag.py (arXiv retrieval not wired, will be re-added when integrated)
  • Fixed: Added missing local/__init__.py for proper package structure
  • Fixed: Added GitHub Actions CI workflow (.github/workflows/ci.yml)
  • New: Proven template mode (--proven) generates expressions without any LLM
  • New: Winner memory integration in pipeline (records winners/failures/iterations)
  • New: Expression mutator integration (auto-generates decay/horizon/group/sign variants)
  • New: Parallel batch processing with max_parallel_candidates semaphore
  • New: 32 comprehensive tests covering templates, lint, mutations, config, fitness, fields, groups
  • Updated: Honest README that accurately describes what works and what doesn't

License

MIT β€” use at your own risk. This is not financial advice. BRAIN simulations are the ground truth.

Generated by ML Intern

This model repository was generated by ML Intern, an agent for machine learning research and development on the Hugging Face Hub.

Usage

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = 'gaurv007/alpha-factory'
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)

For non-causal architectures, replace AutoModelForCausalLM with the appropriate AutoModel class.