191 lines
7.6 KiB
Markdown
191 lines
7.6 KiB
Markdown
# /iterate
|
|
|
|
Analyze recent discovery runs and P&L outcomes, update learning files in
|
|
`docs/iterations/`, implement concrete code improvements in `tradingagents/`,
|
|
then commit everything. In CI (`CI=true`), stop before git operations — the
|
|
workflow handles branching and PR creation.
|
|
|
|
---
|
|
|
|
## Step 1: Determine What to Analyze
|
|
|
|
Read `docs/iterations/LEARNINGS.md` to find the **Last analyzed run** date.
|
|
If the file does not exist (first run), treat the Last analyzed run date as `1970-01-01` and proceed.
|
|
|
|
Then scan `results/discovery/` for all run directories with dates AFTER the
|
|
last analyzed date. Each run directory contains `discovery_result.json`. Collect all unanalyzed runs.
|
|
|
|
Also scan `data/recommendations/` for JSON files dated 5 or more days ago.
|
|
Load each file and extract all recommendations. These are mature enough to
|
|
have played out — analyze them regardless of `status` field value.
|
|
For P&L analysis you need: `ticker`, `strategy_match`, `final_score`,
|
|
`confidence`, `discovery_date`, `entry_price`, `status`.
|
|
|
|
Set your analysis mode:
|
|
- If unanalyzed runs exist → include **fast-loop** (output quality analysis)
|
|
- If mature recommendations exist → include **P&L loop** (outcome analysis)
|
|
- If neither → print "No new data to analyze since last run." and exit.
|
|
|
|
## Step 2: Load Domain Context
|
|
|
|
For each scanner that appears in the unanalyzed runs (check `strategy_match`
|
|
field in discovery results), read the corresponding file from
|
|
`docs/iterations/scanners/<scanner_name>.md`.
|
|
|
|
Also read `docs/iterations/pipeline/scoring.md`.
|
|
Also read `docs/iterations/LEARNINGS.md` for full index awareness.
|
|
|
|
## Step 3: Analyze
|
|
|
|
### Fast-Loop Analysis (output quality)
|
|
For each unanalyzed run's `discovery_result.json`:
|
|
- **Signal specificity**: Does each candidate have a concrete, specific thesis
|
|
or a generic one? Flag candidates with vague context.
|
|
- **Scanner noise rate**: How many candidates per scanner? Scanners producing
|
|
10+ candidates with low scores (<65) are noisy.
|
|
- **Confidence calibration**: Is confidence (1-10) consistent with score (0-100)?
|
|
A score of 85 with confidence 5 suggests miscalibration.
|
|
- **Duplicate candidates**: Same ticker appearing from 2+ scanners — note as
|
|
confluence (positive) or redundancy (negative, if identical thesis).
|
|
|
|
### P&L Loop Analysis (outcome analysis)
|
|
For each mature recommendation:
|
|
- Group by `strategy_match` (scanner). Compute per-scanner: how many
|
|
recommendations were made, what was the average final_score, and whether
|
|
`status` fields suggest positive or negative outcomes.
|
|
- Flag scanners where final_score > 80 but outcomes appear poor — overconfident.
|
|
- Flag scanners where final_score < 65 but outcomes appear good — undervalued.
|
|
- Note patterns: do high-confidence (9-10) picks outperform low-confidence (6-7)?
|
|
|
|
## Step 4: Write Learnings
|
|
|
|
**CRITICAL: All file writes in this step must be performed using file-writing tools.
|
|
Do not narrate or describe what you would write — actually write it. Every scanner
|
|
you mention in your analysis MUST have its domain file updated on disk before
|
|
proceeding to Step 5.**
|
|
|
|
For each scanner that appeared in the analysis, update its domain file in
|
|
`docs/iterations/scanners/<scanner_name>.md`:
|
|
|
|
1. **Append to Evidence Log**: Add a dated entry with your specific observations.
|
|
Use this format:
|
|
```
|
|
### YYYY-MM-DD — <run date or "P&L review">
|
|
- What was observed
|
|
- What it implies
|
|
- Confidence: low / medium / high
|
|
```
|
|
2. **Update Current Understanding**: If your new evidence is medium or high
|
|
confidence AND contradicts or meaningfully extends the current understanding,
|
|
rewrite that section. Otherwise leave it unchanged.
|
|
3. **Update Pending Hypotheses**: Check off any hypotheses that are now answered.
|
|
Add new ones that your analysis surfaced.
|
|
|
|
Update `docs/iterations/LEARNINGS.md` (write to disk):
|
|
- Set **Last analyzed run** to today's date
|
|
- Update the one-line summary and Last Updated date for each scanner you touched
|
|
|
|
## Step 5: Implement Code Changes
|
|
|
|
Based on your learnings, identify concrete improvements. For each improvement:
|
|
|
|
**Translate one learning → one code change.** Examples:
|
|
- "ML signal threshold is worse than a coin flip" → raise threshold in
|
|
`tradingagents/dataflows/discovery/scanners/ml_signal.py`
|
|
- "Options flow premium filter is configured but not applied" → add the check
|
|
- "Reddit DD LLM score computed but unused" → use it for priority assignment
|
|
|
|
For each change:
|
|
1. Read the relevant scanner file to understand current implementation
|
|
2. Make the minimal change that encodes the learning
|
|
3. Do not refactor surrounding code — change only what the learning motivates
|
|
|
|
Implement all changes before proceeding to Step 5.5.
|
|
|
|
## Step 5.5: Register Hypotheses for Actionable Learnings
|
|
|
|
After implementing direct code changes, check if any learnings require
|
|
**forward-testing validation** — i.e. a code change was made but its effect
|
|
can only be confirmed with live data over multiple days.
|
|
|
|
For each such learning (max 1 new hypothesis per run to avoid flooding the queue):
|
|
|
|
1. Read `docs/iterations/hypotheses/active.json`.
|
|
2. Skip if a hypothesis for this scanner+change already exists (status: running or pending).
|
|
3. Count running implementation hypotheses. If at `max_active`, add as `status: "pending"`.
|
|
Otherwise add as `status: "running"` and create the branch:
|
|
```bash
|
|
git checkout -b "hypothesis/<scanner>-<slug>"
|
|
git push -u origin "hypothesis/<scanner>-<slug>"
|
|
```
|
|
Open a draft PR:
|
|
```bash
|
|
gh pr create --repo Aitous/TradingAgents \
|
|
--title "hypothesis(<scanner>): <title>" \
|
|
--body "<description>" \
|
|
--draft --base main
|
|
```
|
|
4. Add the entry to `docs/iterations/hypotheses/active.json` on `main`:
|
|
```json
|
|
{
|
|
"id": "<scanner>-<slug>",
|
|
"scanner": "<scanner>",
|
|
"title": "<title>",
|
|
"description": "<description>",
|
|
"branch": "hypothesis/<scanner>-<slug>",
|
|
"pr_number": <N>,
|
|
"status": "running",
|
|
"priority": <1-9>,
|
|
"expected_impact": "<high|medium|low>",
|
|
"hypothesis_type": "implementation",
|
|
"created_at": "<YYYY-MM-DD>",
|
|
"min_days": 14,
|
|
"days_elapsed": 0,
|
|
"picks_log": [],
|
|
"baseline_scanner": "<scanner>",
|
|
"conclusion": null
|
|
}
|
|
```
|
|
5. Create the picks tracker file on the hypothesis branch:
|
|
```bash
|
|
git checkout "hypothesis/<scanner>-<slug>"
|
|
mkdir -p docs/iterations/hypotheses/<id>
|
|
echo '{"hypothesis_id":"<id>","scanner":"<scanner>","picks":[]}' \
|
|
> docs/iterations/hypotheses/<id>/picks.json
|
|
git add docs/iterations/hypotheses/<id>/picks.json
|
|
git commit -m "hypothesis(<scanner>): add picks tracker"
|
|
git push origin "hypothesis/<scanner>-<slug>"
|
|
git checkout main
|
|
```
|
|
|
|
If no learnings require forward-testing, skip this step entirely.
|
|
|
|
## Step 6: Commit (skip if CI=true)
|
|
|
|
If the environment variable `CI` is set, stop here. The workflow handles git.
|
|
|
|
Otherwise:
|
|
```bash
|
|
git add docs/iterations/ tradingagents/
|
|
```
|
|
|
|
Run `git commit` with a message in the format: `learn(iterate): YYYY-MM-DD — <your one-sentence summary of findings>`
|
|
|
|
Then check for an existing open PR on branch `iterate/current`:
|
|
```bash
|
|
EXISTING=$(gh pr list --repo Aitous/TradingAgents --head iterate/current --state open --json number --jq '.[0].number // empty')
|
|
```
|
|
|
|
If one exists: push to that branch and update the PR description with your findings appended.
|
|
If none exists: create branch `iterate/current`, push, open PR against `main`:
|
|
```bash
|
|
git checkout -b iterate/current
|
|
git push -u origin iterate/current
|
|
gh pr create \
|
|
--repo Aitous/TradingAgents \
|
|
--title "learn(iterate): automated improvements — $(date +%Y-%m-%d)" \
|
|
--body "$(cat docs/iterations/LEARNINGS.md)" \
|
|
--label "automated,iteration" \
|
|
--base main
|
|
```
|