diff --git a/.github/workflows/daily-discovery.yml b/.github/workflows/daily-discovery.yml new file mode 100644 index 00000000..96df31ca --- /dev/null +++ b/.github/workflows/daily-discovery.yml @@ -0,0 +1,120 @@ +name: Daily Discovery + +on: + schedule: + # 8:30 AM ET (13:30 UTC) on weekdays + - cron: "30 13 * * 1-5" + workflow_dispatch: + # Manual trigger with optional overrides + inputs: + date: + description: "Analysis date (YYYY-MM-DD, blank = today)" + required: false + default: "" + provider: + description: "LLM provider" + required: false + default: "google" + type: choice + options: + - google + - openai + - anthropic + +env: + PYTHON_VERSION: "3.10" + +jobs: + discovery: + runs-on: ubuntu-latest + environment: TradingAgent + timeout-minutes: 30 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION }} + cache: pip + + - name: Install dependencies + run: | + pip install --upgrade pip + pip install -e . + + - name: Determine analysis date + id: date + run: | + if [ -n "${{ github.event.inputs.date }}" ]; then + echo "analysis_date=${{ github.event.inputs.date }}" >> "$GITHUB_OUTPUT" + else + echo "analysis_date=$(date -u +%Y-%m-%d)" >> "$GITHUB_OUTPUT" + fi + + - name: Run discovery pipeline + env: + # LLM keys (set whichever provider you use) + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + # Data source keys + FINNHUB_API_KEY: ${{ secrets.FINNHUB_API_KEY }} + ALPHA_VANTAGE_API_KEY: ${{ secrets.ALPHA_VANTAGE_API_KEY }} + FMP_API_KEY: ${{ secrets.FMP_API_KEY }} + REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }} + REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }} + TRADIER_API_KEY: ${{ secrets.TRADIER_API_KEY }} + run: | + python scripts/run_daily_discovery.py \ + --date "${{ steps.date.outputs.analysis_date }}" \ + --no-update-positions + + - name: Commit recommendations to repo + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Stage new/updated recommendation files + git add data/recommendations/ || true + git add results/ || true + + # Only commit if there are changes + if git diff --cached --quiet; then + echo "No new recommendations to commit" + else + git commit -m "chore: daily discovery ${{ steps.date.outputs.analysis_date }}" + git push + fi + + - name: Update positions + if: success() + env: + FINNHUB_API_KEY: ${{ secrets.FINNHUB_API_KEY }} + run: | + python scripts/update_positions.py + + - name: Commit position updates + if: success() + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add data/recommendations/ || true + if git diff --cached --quiet; then + echo "No position updates" + else + git commit -m "chore: update positions ${{ steps.date.outputs.analysis_date }}" + git push + fi + + - name: Upload results as artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: discovery-${{ steps.date.outputs.analysis_date }} + path: | + data/recommendations/${{ steps.date.outputs.analysis_date }}*.json + results/discovery/${{ steps.date.outputs.analysis_date }}/ + retention-days: 30 diff --git a/data/recommendations/performance_database.json b/data/recommendations/performance_database.json index fe63e7b4..9556b915 100644 --- a/data/recommendations/performance_database.json +++ b/data/recommendations/performance_database.json @@ -1,6 +1,6 @@ { - "last_updated": "2026-02-10 22:26:47", - "total_recommendations": 185, + "last_updated": "2026-02-11 12:47:48", + "total_recommendations": 200, "recommendations_by_date": { "2026-02-10": [ { @@ -13,10 +13,12 @@ "entry_price": 24.889999389648438, "discovery_date": "2026-02-10", "status": "open", - "current_price": 24.81999969482422, - "return_pct": -0.28, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 24.15999984741211, + "return_pct": -2.93, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -2.79, + "win_1d": false }, { "ticker": "AVR", @@ -28,10 +30,12 @@ "entry_price": 5.829999923706055, "discovery_date": "2026-02-10", "status": "open", - "current_price": 5.789999961853027, - "return_pct": -0.69, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 5.670000076293945, + "return_pct": -2.74, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -2.14, + "win_1d": false }, { "ticker": "PEGA", @@ -43,10 +47,12 @@ "entry_price": 42.525001525878906, "discovery_date": "2026-02-10", "status": "open", - "current_price": 43.029998779296875, - "return_pct": 1.19, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 38.189998626708984, + "return_pct": -10.19, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -13.7, + "win_1d": false }, { "ticker": "BLKB", @@ -58,10 +64,12 @@ "entry_price": 49.790000915527344, "discovery_date": "2026-02-10", "status": "open", - "current_price": 47.68000030517578, - "return_pct": -4.24, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 50.150001525878906, + "return_pct": 0.72, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -2.73, + "win_1d": false }, { "ticker": "INMD", @@ -73,10 +81,12 @@ "entry_price": 15.300000190734863, "discovery_date": "2026-02-10", "status": "open", - "current_price": 14.619999885559082, - "return_pct": -4.44, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 14.225000381469727, + "return_pct": -7.03, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -6.73, + "win_1d": false }, { "ticker": "TMC", @@ -88,10 +98,12 @@ "entry_price": 6.460000038146973, "discovery_date": "2026-02-10", "status": "open", - "current_price": 6.400000095367432, - "return_pct": -0.93, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 6.545000076293945, + "return_pct": 1.32, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -2.24, + "win_1d": false }, { "ticker": "DDOG", @@ -103,10 +115,12 @@ "entry_price": 131.63499450683594, "discovery_date": "2026-02-10", "status": "open", - "current_price": 129.6699981689453, - "return_pct": -1.49, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 126.83999633789062, + "return_pct": -3.64, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -4.87, + "win_1d": false }, { "ticker": "PATH", @@ -118,10 +132,12 @@ "entry_price": 13.074999809265137, "discovery_date": "2026-02-10", "status": "open", - "current_price": 12.949999809265137, - "return_pct": -0.96, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 11.645000457763672, + "return_pct": -10.94, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -11.01, + "win_1d": false }, { "ticker": "PMN", @@ -133,10 +149,12 @@ "entry_price": 13.550000190734863, "discovery_date": "2026-02-10", "status": "open", - "current_price": 14.289999961853027, - "return_pct": 5.46, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 14.510000228881836, + "return_pct": 7.08, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": 8.12, + "win_1d": true }, { "ticker": "IGV", @@ -148,10 +166,12 @@ "entry_price": 86.29499816894531, "discovery_date": "2026-02-10", "status": "open", - "current_price": 85.41000366210938, - "return_pct": -1.03, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 82.99659729003906, + "return_pct": -3.82, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -4.19, + "win_1d": false }, { "ticker": "POET", @@ -163,10 +183,12 @@ "entry_price": 6.114999771118164, "discovery_date": "2026-02-10", "status": "open", - "current_price": 5.840000152587891, - "return_pct": -4.5, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 5.815000057220459, + "return_pct": -4.91, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -5.81, + "win_1d": false }, { "ticker": "ASTS", @@ -178,10 +200,12 @@ "entry_price": 99.80999755859375, "discovery_date": "2026-02-10", "status": "open", - "current_price": 96.2699966430664, - "return_pct": -3.55, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 97.70500183105469, + "return_pct": -2.11, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -4.8, + "win_1d": false }, { "ticker": "APH", @@ -193,10 +217,12 @@ "entry_price": 145.18910217285156, "discovery_date": "2026-02-10", "status": "open", - "current_price": 144.13999938964844, - "return_pct": -0.72, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 144.24000549316406, + "return_pct": -0.65, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -1.45, + "win_1d": false }, { "ticker": "META", @@ -208,10 +234,12 @@ "entry_price": 671.3660278320312, "discovery_date": "2026-02-10", "status": "open", - "current_price": 670.719970703125, - "return_pct": -0.1, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 671.5800170898438, + "return_pct": 0.03, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": -1.03, + "win_1d": false }, { "ticker": "WRB", @@ -223,10 +251,12 @@ "entry_price": 69.02999877929688, "discovery_date": "2026-02-10", "status": "open", - "current_price": 69.91999816894531, - "return_pct": 1.29, - "days_held": 0, - "last_updated": "2026-02-10" + "current_price": 71.52999877929688, + "return_pct": 3.62, + "days_held": 1, + "last_updated": "2026-02-11", + "return_1d": 2.1, + "win_1d": true } ], "2026-02-06": [ @@ -240,10 +270,10 @@ "entry_price": 24.93000030517578, "discovery_date": "2026-02-06", "status": "open", - "current_price": 24.81999969482422, - "return_pct": -0.44, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 24.15999984741211, + "return_pct": -3.09, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -0.44, "win_1d": false }, @@ -257,10 +287,10 @@ "entry_price": 12.289999961853027, "discovery_date": "2026-02-06", "status": "open", - "current_price": 10.5, - "return_pct": -14.56, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 10.395000457763672, + "return_pct": -15.42, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -14.56, "win_1d": false }, @@ -274,10 +304,10 @@ "entry_price": 394.7300109863281, "discovery_date": "2026-02-06", "status": "open", - "current_price": 413.2699890136719, - "return_pct": 4.7, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 403.8500061035156, + "return_pct": 2.31, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 4.7, "win_1d": true }, @@ -291,10 +321,10 @@ "entry_price": 410.4100036621094, "discovery_date": "2026-02-06", "status": "open", - "current_price": 425.2099914550781, - "return_pct": 3.61, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 426.9999084472656, + "return_pct": 4.04, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 3.61, "win_1d": true }, @@ -308,10 +338,10 @@ "entry_price": 279.0199890136719, "discovery_date": "2026-02-06", "status": "open", - "current_price": 273.67999267578125, - "return_pct": -1.91, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 276.17999267578125, + "return_pct": -1.02, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -1.91, "win_1d": false }, @@ -325,10 +355,10 @@ "entry_price": 5.569900035858154, "discovery_date": "2026-02-06", "status": "open", - "current_price": 5.840000152587891, - "return_pct": 4.85, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 5.815000057220459, + "return_pct": 4.4, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 4.85, "win_1d": true }, @@ -342,10 +372,10 @@ "entry_price": 35.709999084472656, "discovery_date": "2026-02-06", "status": "open", - "current_price": 40.45000076293945, - "return_pct": 13.27, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 44.02000045776367, + "return_pct": 23.27, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 13.27, "win_1d": true }, @@ -359,10 +389,10 @@ "entry_price": 109.41999816894531, "discovery_date": "2026-02-06", "status": "open", - "current_price": 112.27999877929688, - "return_pct": 2.61, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 113.41000366210938, + "return_pct": 3.65, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 2.61, "win_1d": true }, @@ -376,10 +406,10 @@ "entry_price": 220.76499938964844, "discovery_date": "2026-02-06", "status": "open", - "current_price": 206.5800018310547, - "return_pct": -6.43, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 207.5, + "return_pct": -6.01, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -6.43, "win_1d": false }, @@ -393,10 +423,10 @@ "entry_price": 271.44000244140625, "discovery_date": "2026-02-06", "status": "open", - "current_price": 274.07000732421875, - "return_pct": 0.97, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 270.80999755859375, + "return_pct": -0.23, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 0.97, "win_1d": true }, @@ -410,10 +440,10 @@ "entry_price": 185.42999267578125, "discovery_date": "2026-02-06", "status": "open", - "current_price": 182.69000244140625, - "return_pct": -1.48, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 186.33070373535156, + "return_pct": 0.49, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -1.48, "win_1d": false }, @@ -427,10 +457,10 @@ "entry_price": 182.40069580078125, "discovery_date": "2026-02-06", "status": "open", - "current_price": 188.5399932861328, - "return_pct": 3.37, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 191.2100067138672, + "return_pct": 4.83, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 3.37, "win_1d": true }, @@ -444,10 +474,10 @@ "entry_price": 150.97999572753906, "discovery_date": "2026-02-06", "status": "open", - "current_price": 148.94000244140625, - "return_pct": -1.35, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 146.69000244140625, + "return_pct": -2.84, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -1.35, "win_1d": false }, @@ -461,10 +491,10 @@ "entry_price": 12.345000267028809, "discovery_date": "2026-02-06", "status": "open", - "current_price": 12.949999809265137, - "return_pct": 4.9, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 11.645000457763672, + "return_pct": -5.67, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": 4.9, "win_1d": true }, @@ -478,10 +508,10 @@ "entry_price": 322.0899963378906, "discovery_date": "2026-02-06", "status": "open", - "current_price": 318.5799865722656, - "return_pct": -1.09, - "days_held": 4, - "last_updated": "2026-02-10", + "current_price": 310.6000061035156, + "return_pct": -3.57, + "days_held": 5, + "last_updated": "2026-02-11", "return_1d": -1.09, "win_1d": false } @@ -497,10 +527,10 @@ "entry_price": 718.7100219726562, "discovery_date": "2026-01-30", "status": "open", - "current_price": 670.719970703125, - "return_pct": -6.68, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 671.5800170898438, + "return_pct": -6.56, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": -6.68, "win_1d": false, "return_7d": -6.68, @@ -516,10 +546,10 @@ "entry_price": 56.5, "discovery_date": "2026-01-30", "status": "open", - "current_price": 47.54999923706055, - "return_pct": -15.84, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 45.494998931884766, + "return_pct": -19.48, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": -15.84, "win_1d": false, "return_7d": -15.84, @@ -535,10 +565,10 @@ "entry_price": 22.950000762939453, "discovery_date": "2026-01-30", "status": "open", - "current_price": 21.8799991607666, - "return_pct": -4.66, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 21.84000015258789, + "return_pct": -4.84, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": -4.66, "win_1d": false, "return_7d": -4.66, @@ -554,10 +584,10 @@ "entry_price": 78.58000183105469, "discovery_date": "2026-01-30", "status": "open", - "current_price": 86.29000091552734, - "return_pct": 9.81, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 85.375, + "return_pct": 8.65, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": 9.81, "win_1d": true, "return_7d": 9.81, @@ -573,10 +603,10 @@ "entry_price": 37.064998626708984, "discovery_date": "2026-01-30", "status": "open", - "current_price": 41.61000061035156, - "return_pct": 12.26, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 42.5369987487793, + "return_pct": 14.76, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": 12.26, "win_1d": true, "return_7d": 12.26, @@ -592,10 +622,10 @@ "entry_price": 192.41000366210938, "discovery_date": "2026-01-30", "status": "open", - "current_price": 188.5399932861328, - "return_pct": -2.01, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 191.2100067138672, + "return_pct": -0.62, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": -2.01, "win_1d": false, "return_7d": -2.01, @@ -611,10 +641,10 @@ "entry_price": 5.989999771118164, "discovery_date": "2026-01-30", "status": "open", - "current_price": 6.840000152587891, - "return_pct": 14.19, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 6.730000019073486, + "return_pct": 12.35, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": 14.19, "win_1d": true, "return_7d": 14.19, @@ -630,10 +660,10 @@ "entry_price": 39.91999816894531, "discovery_date": "2026-01-30", "status": "open", - "current_price": 47.4900016784668, - "return_pct": 18.96, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 48.22999954223633, + "return_pct": 20.82, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": 18.96, "win_1d": true, "return_7d": 18.96, @@ -649,10 +679,10 @@ "entry_price": 248.30999755859375, "discovery_date": "2026-01-30", "status": "open", - "current_price": 262.55999755859375, - "return_pct": 5.74, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 274.1600036621094, + "return_pct": 10.41, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": 5.74, "win_1d": true, "return_7d": 5.74, @@ -668,10 +698,10 @@ "entry_price": 331.6199951171875, "discovery_date": "2026-01-30", "status": "open", - "current_price": 340.44000244140625, - "return_pct": 2.66, - "days_held": 11, - "last_updated": "2026-02-10", + "current_price": 342.4800109863281, + "return_pct": 3.27, + "days_held": 12, + "last_updated": "2026-02-11", "return_1d": 2.66, "win_1d": true, "return_7d": 2.66, @@ -689,10 +719,10 @@ "entry_price": 24.010000228881836, "discovery_date": "2026-01-26", "status": "open", - "current_price": 24.81999969482422, - "return_pct": 3.37, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 24.15999984741211, + "return_pct": 0.62, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": 3.37, "win_1d": true, "return_7d": 3.37, @@ -708,10 +738,10 @@ "entry_price": 56.290000915527344, "discovery_date": "2026-01-26", "status": "open", - "current_price": 59.150001525878906, - "return_pct": 5.08, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 61.119998931884766, + "return_pct": 8.58, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": 5.08, "win_1d": true, "return_7d": 5.08, @@ -727,10 +757,10 @@ "entry_price": 19.920000076293945, "discovery_date": "2026-01-26", "status": "open", - "current_price": 27.329999923706055, - "return_pct": 37.2, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 26.915000915527344, + "return_pct": 35.12, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": 37.2, "win_1d": true, "return_7d": 37.2, @@ -746,10 +776,10 @@ "entry_price": 36.18000030517578, "discovery_date": "2026-01-26", "status": "open", - "current_price": 37.470001220703125, - "return_pct": 3.57, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 36.36309814453125, + "return_pct": 0.51, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": 3.57, "win_1d": true, "return_7d": 3.57, @@ -765,10 +795,10 @@ "entry_price": 238.4199981689453, "discovery_date": "2026-01-26", "status": "open", - "current_price": 206.9600067138672, - "return_pct": -13.2, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 204.5500030517578, + "return_pct": -14.21, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": -13.2, "win_1d": false, "return_7d": -13.2, @@ -784,10 +814,10 @@ "entry_price": 136.63999938964844, "discovery_date": "2026-01-26", "status": "open", - "current_price": 129.6699981689453, - "return_pct": -5.1, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 126.83999633789062, + "return_pct": -7.17, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": -5.1, "win_1d": false, "return_7d": -5.1, @@ -803,10 +833,10 @@ "entry_price": 98.33999633789062, "discovery_date": "2026-01-26", "status": "open", - "current_price": 73.41000366210938, - "return_pct": -25.35, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 76.43000030517578, + "return_pct": -22.28, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": -25.35, "win_1d": false, "return_7d": -25.35, @@ -822,10 +852,10 @@ "entry_price": 186.47000122070312, "discovery_date": "2026-01-26", "status": "open", - "current_price": 188.5399932861328, - "return_pct": 1.11, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 191.2100067138672, + "return_pct": 2.54, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": 1.11, "win_1d": true, "return_7d": 1.11, @@ -841,10 +871,10 @@ "entry_price": 236.7100067138672, "discovery_date": "2026-01-26", "status": "open", - "current_price": 219.75, - "return_pct": -7.16, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 219.86000061035156, + "return_pct": -7.12, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": -7.16, "win_1d": false, "return_7d": -7.16, @@ -860,10 +890,10 @@ "entry_price": 173.32000732421875, "discovery_date": "2026-01-26", "status": "open", - "current_price": 201.1199951171875, - "return_pct": 16.04, - "days_held": 15, - "last_updated": "2026-02-10", + "current_price": 206.02000427246094, + "return_pct": 18.87, + "days_held": 16, + "last_updated": "2026-02-11", "return_1d": 16.04, "win_1d": true, "return_7d": 16.04, @@ -881,10 +911,10 @@ "entry_price": 1.7899999618530273, "discovery_date": "2026-02-01", "status": "open", - "current_price": 1.559999942779541, - "return_pct": -12.85, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 1.5, + "return_pct": -16.2, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": -12.85, "win_1d": false, "return_7d": -12.85, @@ -900,10 +930,10 @@ "entry_price": 200.92999267578125, "discovery_date": "2026-02-01", "status": "open", - "current_price": 195.19000244140625, - "return_pct": -2.86, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 196.8350067138672, + "return_pct": -2.04, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": -2.86, "win_1d": false, "return_7d": -2.86, @@ -919,10 +949,10 @@ "entry_price": 306.70001220703125, "discovery_date": "2026-02-01", "status": "open", - "current_price": 291.760009765625, - "return_pct": -4.87, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 273.17010498046875, + "return_pct": -10.93, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": -4.87, "win_1d": false, "return_7d": -4.87, @@ -938,10 +968,10 @@ "entry_price": 23.8799991607666, "discovery_date": "2026-02-01", "status": "open", - "current_price": 24.81999969482422, - "return_pct": 3.94, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 24.15999984741211, + "return_pct": 1.17, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": 3.94, "win_1d": true, "return_7d": 3.94, @@ -957,10 +987,10 @@ "entry_price": 46.470001220703125, "discovery_date": "2026-02-01", "status": "open", - "current_price": 47.130001068115234, - "return_pct": 1.42, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 48.31169891357422, + "return_pct": 3.96, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": 1.42, "win_1d": true, "return_7d": 1.42, @@ -976,10 +1006,10 @@ "entry_price": 29.110000610351562, "discovery_date": "2026-02-01", "status": "open", - "current_price": 33.33000183105469, - "return_pct": 14.5, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 32.005001068115234, + "return_pct": 9.95, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": 14.5, "win_1d": true, "return_7d": 14.5, @@ -995,10 +1025,10 @@ "entry_price": 146.58999633789062, "discovery_date": "2026-02-01", "status": "open", - "current_price": 139.50999450683594, - "return_pct": -4.83, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 135.25, + "return_pct": -7.74, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": -4.83, "win_1d": false, "return_7d": -4.83, @@ -1014,10 +1044,10 @@ "entry_price": 250.22999572753906, "discovery_date": "2026-02-01", "status": "open", - "current_price": 262.55999755859375, - "return_pct": 4.93, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 274.1600036621094, + "return_pct": 9.56, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": 4.93, "win_1d": true, "return_7d": 4.93, @@ -1033,10 +1063,10 @@ "entry_price": 1.0399999618530273, "discovery_date": "2026-02-01", "status": "open", - "current_price": 0.7020000219345093, - "return_pct": -32.5, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 0.6459000110626221, + "return_pct": -37.89, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": -32.5, "win_1d": false, "return_7d": -32.5, @@ -1052,10 +1082,10 @@ "entry_price": 48.02000045776367, "discovery_date": "2026-02-01", "status": "open", - "current_price": 57.47999954223633, - "return_pct": 19.7, - "days_held": 9, - "last_updated": "2026-02-10", + "current_price": 55.56999969482422, + "return_pct": 15.72, + "days_held": 10, + "last_updated": "2026-02-11", "return_1d": 19.7, "win_1d": true, "return_7d": 19.7, @@ -1073,10 +1103,10 @@ "entry_price": 672.969970703125, "discovery_date": "2026-01-27", "status": "open", - "current_price": 670.719970703125, - "return_pct": -0.33, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 671.5800170898438, + "return_pct": -0.21, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": -0.33, "win_1d": false, "return_7d": -0.33, @@ -1092,10 +1122,10 @@ "entry_price": 109.73999786376953, "discovery_date": "2026-01-27", "status": "open", - "current_price": 128.10000610351562, - "return_pct": 16.73, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 133.27999877929688, + "return_pct": 21.45, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": 16.73, "win_1d": true, "return_7d": 16.73, @@ -1111,10 +1141,10 @@ "entry_price": 101.58999633789062, "discovery_date": "2026-01-27", "status": "open", - "current_price": 73.41000366210938, - "return_pct": -27.74, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 76.43000030517578, + "return_pct": -24.77, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": -27.74, "win_1d": false, "return_7d": -27.74, @@ -1130,10 +1160,10 @@ "entry_price": 270.42999267578125, "discovery_date": "2026-01-27", "status": "open", - "current_price": 282.3800048828125, - "return_pct": 4.42, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 282.8900146484375, + "return_pct": 4.61, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": 4.42, "win_1d": true, "return_7d": 4.42, @@ -1149,10 +1179,10 @@ "entry_price": 1.5199999809265137, "discovery_date": "2026-01-27", "status": "open", - "current_price": 1.7699999809265137, - "return_pct": 16.45, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 1.7166999578475952, + "return_pct": 12.94, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": 16.45, "win_1d": true, "return_7d": 16.45, @@ -1168,10 +1198,10 @@ "entry_price": 196.6300048828125, "discovery_date": "2026-01-27", "status": "open", - "current_price": 220.9199981689453, - "return_pct": 12.35, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 226.22000122070312, + "return_pct": 15.05, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": 12.35, "win_1d": true, "return_7d": 12.35, @@ -1187,10 +1217,10 @@ "entry_price": 1616.3299560546875, "discovery_date": "2026-01-27", "status": "open", - "current_price": 1430.8399658203125, - "return_pct": -11.48, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 1485.239990234375, + "return_pct": -8.11, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": -11.48, "win_1d": false, "return_7d": -11.48, @@ -1206,10 +1236,10 @@ "entry_price": 116.0, "discovery_date": "2026-01-27", "status": "open", - "current_price": 107.20999908447266, - "return_pct": -7.58, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 104.9800033569336, + "return_pct": -9.5, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": -7.58, "win_1d": false, "return_7d": -7.58, @@ -1225,10 +1255,10 @@ "entry_price": 2.75, "discovery_date": "2026-01-27", "status": "open", - "current_price": 2.240000009536743, - "return_pct": -18.55, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 2.0729000568389893, + "return_pct": -24.62, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": -18.55, "win_1d": false, "return_7d": -18.55, @@ -1244,10 +1274,10 @@ "entry_price": 95.98999786376953, "discovery_date": "2026-01-27", "status": "open", - "current_price": 99.2699966430664, - "return_pct": 3.42, - "days_held": 14, - "last_updated": "2026-02-10", + "current_price": 100.15499877929688, + "return_pct": 4.34, + "days_held": 15, + "last_updated": "2026-02-11", "return_1d": 3.42, "win_1d": true, "return_7d": 3.42, @@ -1265,10 +1295,10 @@ "entry_price": 1.7899999618530273, "discovery_date": "2026-01-31", "status": "open", - "current_price": 1.559999942779541, - "return_pct": -12.85, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 1.5, + "return_pct": -16.2, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -12.85, "win_1d": false, "return_7d": -12.85, @@ -1284,10 +1314,10 @@ "entry_price": 206.1199951171875, "discovery_date": "2026-01-31", "status": "open", - "current_price": 248.19000244140625, - "return_pct": 20.41, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 239.71499633789062, + "return_pct": 16.3, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": 20.41, "win_1d": true, "return_7d": 20.41, @@ -1303,10 +1333,10 @@ "entry_price": 6.639999866485596, "discovery_date": "2026-01-31", "status": "open", - "current_price": 6.21999979019165, - "return_pct": -6.33, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 5.760000228881836, + "return_pct": -13.25, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -6.33, "win_1d": false, "return_7d": -6.33, @@ -1322,10 +1352,10 @@ "entry_price": 489.44000244140625, "discovery_date": "2026-01-31", "status": "open", - "current_price": 466.2900085449219, - "return_pct": -4.73, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 464.9200134277344, + "return_pct": -5.01, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -4.73, "win_1d": false, "return_7d": -4.73, @@ -1341,10 +1371,10 @@ "entry_price": 113.83000183105469, "discovery_date": "2026-01-31", "status": "open", - "current_price": 106.98999786376953, - "return_pct": -6.01, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 100.47000122070312, + "return_pct": -11.74, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -6.01, "win_1d": false, "return_7d": -6.01, @@ -1360,10 +1390,10 @@ "entry_price": 146.58999633789062, "discovery_date": "2026-01-31", "status": "open", - "current_price": 139.50999450683594, - "return_pct": -4.83, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 135.25, + "return_pct": -7.74, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -4.83, "win_1d": false, "return_7d": -4.83, @@ -1379,10 +1409,10 @@ "entry_price": 78.91999816894531, "discovery_date": "2026-01-31", "status": "open", - "current_price": 82.01000213623047, - "return_pct": 3.92, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 81.4000015258789, + "return_pct": 3.14, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": 3.92, "win_1d": true, "return_7d": 3.92, @@ -1398,10 +1428,10 @@ "entry_price": 33.95000076293945, "discovery_date": "2026-01-31", "status": "open", - "current_price": 27.43000030517578, - "return_pct": -19.2, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 27.540000915527344, + "return_pct": -18.88, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -19.2, "win_1d": false, "return_7d": -19.2, @@ -1417,10 +1447,10 @@ "entry_price": 239.3000030517578, "discovery_date": "2026-01-31", "status": "open", - "current_price": 206.9600067138672, - "return_pct": -13.51, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 204.5500030517578, + "return_pct": -14.52, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -13.51, "win_1d": false, "return_7d": -13.51, @@ -1436,10 +1466,10 @@ "entry_price": 576.25, "discovery_date": "2026-01-31", "status": "open", - "current_price": 541.6400146484375, - "return_pct": -6.01, - "days_held": 10, - "last_updated": "2026-02-10", + "current_price": 599.3699951171875, + "return_pct": 4.01, + "days_held": 11, + "last_updated": "2026-02-11", "return_1d": -6.01, "win_1d": false, "return_7d": -6.01, @@ -1457,10 +1487,10 @@ "entry_price": 51.689998626708984, "discovery_date": "2026-01-28", "status": "open", - "current_price": 36.650001525878906, - "return_pct": -29.1, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 36.130001068115234, + "return_pct": -30.1, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": -29.1, "win_1d": false, "return_7d": -29.1, @@ -1476,10 +1506,10 @@ "entry_price": 668.72998046875, "discovery_date": "2026-01-28", "status": "open", - "current_price": 670.719970703125, - "return_pct": 0.3, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 671.5800170898438, + "return_pct": 0.43, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": 0.3, "win_1d": true, "return_7d": 0.3, @@ -1495,10 +1525,10 @@ "entry_price": 100.8499984741211, "discovery_date": "2026-01-28", "status": "open", - "current_price": 100.91000366210938, - "return_pct": 0.06, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 100.68000030517578, + "return_pct": -0.17, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": 0.06, "win_1d": true, "return_7d": 0.06, @@ -1514,10 +1544,10 @@ "entry_price": 239.5800018310547, "discovery_date": "2026-01-28", "status": "open", - "current_price": 226.61000061035156, - "return_pct": -5.41, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 235.6750030517578, + "return_pct": -1.63, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": -5.41, "win_1d": false, "return_7d": -5.41, @@ -1533,10 +1563,10 @@ "entry_price": 336.75, "discovery_date": "2026-01-28", "status": "open", - "current_price": 329.07000732421875, - "return_pct": -2.28, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 341.2300109863281, + "return_pct": 1.33, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": -2.28, "win_1d": false, "return_7d": -2.28, @@ -1552,10 +1582,10 @@ "entry_price": 279.70001220703125, "discovery_date": "2026-01-28", "status": "open", - "current_price": 262.55999755859375, - "return_pct": -6.13, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 274.1600036621094, + "return_pct": -1.98, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": -6.13, "win_1d": false, "return_7d": -6.13, @@ -1571,10 +1601,10 @@ "entry_price": 67.66999816894531, "discovery_date": "2026-01-28", "status": "open", - "current_price": 69.91999816894531, - "return_pct": 3.32, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 71.54000091552734, + "return_pct": 5.72, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": 3.32, "win_1d": true, "return_7d": 3.32, @@ -1590,10 +1620,10 @@ "entry_price": 21.030000686645508, "discovery_date": "2026-01-28", "status": "open", - "current_price": 27.329999923706055, - "return_pct": 29.96, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 26.915000915527344, + "return_pct": 27.98, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": 29.96, "win_1d": true, "return_7d": 29.96, @@ -1609,10 +1639,10 @@ "entry_price": 47.58000183105469, "discovery_date": "2026-01-28", "status": "open", - "current_price": 45.0, - "return_pct": -5.42, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 45.2400016784668, + "return_pct": -4.92, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": -5.42, "win_1d": false, "return_7d": -5.42, @@ -1628,10 +1658,10 @@ "entry_price": 48.779998779296875, "discovery_date": "2026-01-28", "status": "open", - "current_price": 47.130001068115234, - "return_pct": -3.38, - "days_held": 13, - "last_updated": "2026-02-10", + "current_price": 48.31169891357422, + "return_pct": -0.96, + "days_held": 14, + "last_updated": "2026-02-11", "return_1d": -3.38, "win_1d": false, "return_7d": -3.38, @@ -1649,10 +1679,10 @@ "entry_price": 1.809999942779541, "discovery_date": "2026-02-02", "status": "open", - "current_price": 1.559999942779541, - "return_pct": -13.81, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 1.5, + "return_pct": -17.13, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": -13.81, "win_1d": false, "return_7d": -13.81, @@ -1668,10 +1698,10 @@ "entry_price": 147.75999450683594, "discovery_date": "2026-02-02", "status": "open", - "current_price": 139.50999450683594, - "return_pct": -5.58, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 135.25, + "return_pct": -8.47, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": -5.58, "win_1d": false, "return_7d": -5.58, @@ -1687,10 +1717,10 @@ "entry_price": 166.52000427246094, "discovery_date": "2026-02-02", "status": "open", - "current_price": 174.1699981689453, - "return_pct": 4.59, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 175.50999450683594, + "return_pct": 5.4, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 4.59, "win_1d": true, "return_7d": 4.59, @@ -1706,10 +1736,10 @@ "entry_price": 6.800000190734863, "discovery_date": "2026-02-02", "status": "open", - "current_price": 6.21999979019165, - "return_pct": -8.53, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 5.760000228881836, + "return_pct": -15.29, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": -8.53, "win_1d": false, "return_7d": -8.53, @@ -1725,10 +1755,10 @@ "entry_price": 40.689998626708984, "discovery_date": "2026-02-02", "status": "open", - "current_price": 48.0, - "return_pct": 17.97, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 49.000999450683594, + "return_pct": 20.43, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 17.97, "win_1d": true, "return_7d": 17.97, @@ -1744,10 +1774,10 @@ "entry_price": 185.27000427246094, "discovery_date": "2026-02-02", "status": "open", - "current_price": 198.5, - "return_pct": 7.14, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 199.5399932861328, + "return_pct": 7.7, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 7.14, "win_1d": true, "return_7d": 7.14, @@ -1763,10 +1793,10 @@ "entry_price": 46.810001373291016, "discovery_date": "2026-02-02", "status": "open", - "current_price": 49.060001373291016, - "return_pct": 4.81, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 48.7400016784668, + "return_pct": 4.12, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 4.81, "win_1d": true, "return_7d": 4.81, @@ -1782,10 +1812,10 @@ "entry_price": 41.880001068115234, "discovery_date": "2026-02-02", "status": "open", - "current_price": 39.90999984741211, - "return_pct": -4.7, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 40.13999938964844, + "return_pct": -4.15, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": -4.7, "win_1d": false, "return_7d": -4.7, @@ -1801,10 +1831,10 @@ "entry_price": 10.920000076293945, "discovery_date": "2026-02-02", "status": "open", - "current_price": 11.479999542236328, - "return_pct": 5.13, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 10.706500053405762, + "return_pct": -1.96, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 5.13, "win_1d": true, "return_7d": 5.13, @@ -1820,10 +1850,10 @@ "entry_price": 34.79999923706055, "discovery_date": "2026-02-02", "status": "open", - "current_price": 37.470001220703125, - "return_pct": 7.67, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 36.36309814453125, + "return_pct": 4.49, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 7.67, "win_1d": true, "return_7d": 7.67, @@ -1839,10 +1869,10 @@ "entry_price": 59.810001373291016, "discovery_date": "2026-02-02", "status": "open", - "current_price": 64.08000183105469, - "return_pct": 7.14, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 62.380001068115234, + "return_pct": 4.3, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 7.14, "win_1d": true, "return_7d": 7.14, @@ -1858,10 +1888,10 @@ "entry_price": 270.8800048828125, "discovery_date": "2026-02-02", "status": "open", - "current_price": 271.1400146484375, - "return_pct": 0.1, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 277.0849914550781, + "return_pct": 2.29, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 0.1, "win_1d": true, "return_7d": 0.1, @@ -1877,10 +1907,10 @@ "entry_price": 160.05999755859375, "discovery_date": "2026-02-02", "status": "open", - "current_price": 159.88999938964844, - "return_pct": -0.11, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 157.07000732421875, + "return_pct": -1.87, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": -0.11, "win_1d": false, "return_7d": -0.11, @@ -1896,10 +1926,10 @@ "entry_price": 201.08999633789062, "discovery_date": "2026-02-02", "status": "open", - "current_price": 195.19000244140625, - "return_pct": -2.93, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 196.8350067138672, + "return_pct": -2.12, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": -2.93, "win_1d": false, "return_7d": -2.93, @@ -1915,10 +1945,10 @@ "entry_price": 327.25, "discovery_date": "2026-02-02", "status": "open", - "current_price": 391.5299987792969, - "return_pct": 19.64, - "days_held": 8, - "last_updated": "2026-02-10", + "current_price": 389.54998779296875, + "return_pct": 19.04, + "days_held": 9, + "last_updated": "2026-02-11", "return_1d": 19.64, "win_1d": true, "return_7d": 19.64, @@ -1936,10 +1966,10 @@ "entry_price": 29.670000076293945, "discovery_date": "2026-02-03", "status": "open", - "current_price": 33.33000183105469, - "return_pct": 12.34, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 32.005001068115234, + "return_pct": 7.87, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 12.34, "win_1d": true, "return_7d": 12.34, @@ -1955,10 +1985,10 @@ "entry_price": 180.33999633789062, "discovery_date": "2026-02-03", "status": "open", - "current_price": 188.5399932861328, - "return_pct": 4.55, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 191.14500427246094, + "return_pct": 5.99, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 4.55, "win_1d": true, "return_7d": 4.55, @@ -1974,10 +2004,10 @@ "entry_price": 318.6700134277344, "discovery_date": "2026-02-03", "status": "open", - "current_price": 329.07000732421875, - "return_pct": 3.26, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 341.2300109863281, + "return_pct": 7.08, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 3.26, "win_1d": true, "return_7d": 3.26, @@ -1993,10 +2023,10 @@ "entry_price": 230.10000610351562, "discovery_date": "2026-02-03", "status": "open", - "current_price": 226.61000061035156, - "return_pct": -1.52, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 235.6750030517578, + "return_pct": 2.42, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": -1.52, "win_1d": false, "return_7d": -1.52, @@ -2012,10 +2042,10 @@ "entry_price": 242.11000061035156, "discovery_date": "2026-02-03", "status": "open", - "current_price": 213.57000732421875, - "return_pct": -11.79, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 213.27499389648438, + "return_pct": -11.91, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": -11.79, "win_1d": false, "return_7d": -11.79, @@ -2031,10 +2061,10 @@ "entry_price": 83.11000061035156, "discovery_date": "2026-02-03", "status": "open", - "current_price": 86.29000091552734, - "return_pct": 3.83, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 85.375, + "return_pct": 2.73, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 3.83, "win_1d": true, "return_7d": 3.83, @@ -2050,10 +2080,10 @@ "entry_price": 91.79000091552734, "discovery_date": "2026-02-03", "status": "open", - "current_price": 94.4000015258789, - "return_pct": 2.84, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 95.12000274658203, + "return_pct": 3.63, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 2.84, "win_1d": true, "return_7d": 2.84, @@ -2069,10 +2099,10 @@ "entry_price": 120.41999816894531, "discovery_date": "2026-02-03", "status": "open", - "current_price": 131.32000732421875, - "return_pct": 9.05, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 139.13999938964844, + "return_pct": 15.55, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 9.05, "win_1d": true, "return_7d": 9.05, @@ -2088,10 +2118,10 @@ "entry_price": 41.36000061035156, "discovery_date": "2026-02-03", "status": "open", - "current_price": 39.90999984741211, - "return_pct": -3.51, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 40.13999938964844, + "return_pct": -2.95, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": -3.51, "win_1d": false, "return_7d": -3.51, @@ -2107,10 +2137,10 @@ "entry_price": 263.0299987792969, "discovery_date": "2026-02-03", "status": "open", - "current_price": 279.0400085449219, - "return_pct": 6.09, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 308.1700134277344, + "return_pct": 17.16, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 6.09, "win_1d": true, "return_7d": 6.09, @@ -2126,10 +2156,10 @@ "entry_price": 8.460000038146973, "discovery_date": "2026-02-03", "status": "open", - "current_price": 7.78000020980835, - "return_pct": -8.04, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 7.804999828338623, + "return_pct": -7.74, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": -8.04, "win_1d": false, "return_7d": -8.04, @@ -2145,10 +2175,10 @@ "entry_price": 15.899999618530273, "discovery_date": "2026-02-03", "status": "open", - "current_price": 14.619999885559082, - "return_pct": -8.05, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 14.225000381469727, + "return_pct": -10.53, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": -8.05, "win_1d": false, "return_7d": -8.05, @@ -2164,10 +2194,10 @@ "entry_price": 274.6300048828125, "discovery_date": "2026-02-03", "status": "open", - "current_price": 282.3800048828125, - "return_pct": 2.82, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 282.8900146484375, + "return_pct": 3.01, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 2.82, "win_1d": true, "return_7d": 2.82, @@ -2183,10 +2213,10 @@ "entry_price": 63.459999084472656, "discovery_date": "2026-02-03", "status": "open", - "current_price": 66.79000091552734, - "return_pct": 5.25, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 65.20999908447266, + "return_pct": 2.76, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 5.25, "win_1d": true, "return_7d": 5.25, @@ -2202,10 +2232,10 @@ "entry_price": 269.4800109863281, "discovery_date": "2026-02-03", "status": "open", - "current_price": 273.67999267578125, - "return_pct": 1.56, - "days_held": 7, - "last_updated": "2026-02-10", + "current_price": 276.25, + "return_pct": 2.51, + "days_held": 8, + "last_updated": "2026-02-11", "return_1d": 1.56, "win_1d": true, "return_7d": 1.56, @@ -2223,10 +2253,10 @@ "entry_price": 38.06999969482422, "discovery_date": "2026-01-29", "status": "open", - "current_price": 37.470001220703125, - "return_pct": -1.58, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 36.309898376464844, + "return_pct": -4.62, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -1.58, "win_1d": false, "return_7d": -1.58, @@ -2242,10 +2272,10 @@ "entry_price": 258.2799987792969, "discovery_date": "2026-01-29", "status": "open", - "current_price": 273.67999267578125, - "return_pct": 5.96, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 276.25, + "return_pct": 6.96, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": 5.96, "win_1d": true, "return_7d": 5.96, @@ -2261,10 +2291,10 @@ "entry_price": 5.929999828338623, "discovery_date": "2026-01-29", "status": "open", - "current_price": 6.840000152587891, - "return_pct": 15.35, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 6.730000019073486, + "return_pct": 13.49, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": 15.35, "win_1d": true, "return_7d": 15.35, @@ -2280,10 +2310,10 @@ "entry_price": 79.36000061035156, "discovery_date": "2026-01-29", "status": "open", - "current_price": 76.86000061035156, - "return_pct": -3.15, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 80.84500122070312, + "return_pct": 1.87, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -3.15, "win_1d": false, "return_7d": -3.15, @@ -2299,10 +2329,10 @@ "entry_price": 48.65999984741211, "discovery_date": "2026-01-29", "status": "open", - "current_price": 47.130001068115234, - "return_pct": -3.14, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 48.31169891357422, + "return_pct": -0.72, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -3.14, "win_1d": false, "return_7d": -3.14, @@ -2318,10 +2348,10 @@ "entry_price": 22.06999969482422, "discovery_date": "2026-01-29", "status": "open", - "current_price": 21.8799991607666, - "return_pct": -0.86, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 21.829999923706055, + "return_pct": -1.09, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -0.86, "win_1d": false, "return_7d": -0.86, @@ -2337,10 +2367,10 @@ "entry_price": 6.800000190734863, "discovery_date": "2026-01-29", "status": "open", - "current_price": 6.21999979019165, - "return_pct": -8.53, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 5.760000228881836, + "return_pct": -15.29, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -8.53, "win_1d": false, "return_7d": -8.53, @@ -2356,10 +2386,10 @@ "entry_price": 1684.7099609375, "discovery_date": "2026-01-29", "status": "open", - "current_price": 1430.8399658203125, - "return_pct": -15.07, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 1485.239990234375, + "return_pct": -11.84, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -15.07, "win_1d": false, "return_7d": -15.07, @@ -2375,10 +2405,10 @@ "entry_price": 252.17999267578125, "discovery_date": "2026-01-29", "status": "open", - "current_price": 213.57000732421875, - "return_pct": -15.31, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 213.27499389648438, + "return_pct": -15.43, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -15.31, "win_1d": false, "return_7d": -15.31, @@ -2394,10 +2424,10 @@ "entry_price": 2.990000009536743, "discovery_date": "2026-01-29", "status": "open", - "current_price": 2.640000104904175, - "return_pct": -11.71, - "days_held": 12, - "last_updated": "2026-02-10", + "current_price": 2.755000114440918, + "return_pct": -7.86, + "days_held": 13, + "last_updated": "2026-02-11", "return_1d": -11.71, "win_1d": false, "return_7d": -11.71, @@ -2415,10 +2445,10 @@ "entry_price": 658.760009765625, "discovery_date": "2026-01-25", "status": "open", - "current_price": 670.719970703125, - "return_pct": 1.82, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 671.5800170898438, + "return_pct": 1.95, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 1.82, "win_1d": true, "return_7d": 1.82, @@ -2434,10 +2464,10 @@ "entry_price": 37.689998626708984, "discovery_date": "2026-01-25", "status": "open", - "current_price": 37.470001220703125, - "return_pct": -0.58, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 36.309898376464844, + "return_pct": -3.66, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": -0.58, "win_1d": false, "return_7d": -0.58, @@ -2453,10 +2483,10 @@ "entry_price": 60.40999984741211, "discovery_date": "2026-01-25", "status": "open", - "current_price": 63.2599983215332, - "return_pct": 4.72, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 65.0, + "return_pct": 7.6, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 4.72, "win_1d": true, "return_7d": 4.72, @@ -2472,10 +2502,10 @@ "entry_price": 47.540000915527344, "discovery_date": "2026-01-25", "status": "open", - "current_price": 50.2400016784668, - "return_pct": 5.68, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 54.935001373291016, + "return_pct": 15.56, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 5.68, "win_1d": true, "return_7d": 5.68, @@ -2491,10 +2521,10 @@ "entry_price": 80.44000244140625, "discovery_date": "2026-01-25", "status": "open", - "current_price": 84.76000213623047, - "return_pct": 5.37, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 83.5999984741211, + "return_pct": 3.93, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 5.37, "win_1d": true, "return_7d": 5.37, @@ -2510,10 +2540,10 @@ "entry_price": 110.13999938964844, "discovery_date": "2026-01-25", "status": "open", - "current_price": 97.91999816894531, - "return_pct": -11.09, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 82.11000061035156, + "return_pct": -25.45, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": -11.09, "win_1d": false, "return_7d": -11.09, @@ -2529,10 +2559,10 @@ "entry_price": 56.619998931884766, "discovery_date": "2026-01-25", "status": "open", - "current_price": 41.4900016784668, - "return_pct": -26.72, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 40.314998626708984, + "return_pct": -28.8, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": -26.72, "win_1d": false, "return_7d": -26.72, @@ -2548,10 +2578,10 @@ "entry_price": 36.20000076293945, "discovery_date": "2026-01-25", "status": "open", - "current_price": 37.900001525878906, - "return_pct": 4.7, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 37.21900177001953, + "return_pct": 2.81, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 4.7, "win_1d": true, "return_7d": 4.7, @@ -2567,10 +2597,10 @@ "entry_price": 12.489999771118164, "discovery_date": "2026-01-25", "status": "open", - "current_price": 13.15999984741211, - "return_pct": 5.36, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 13.005000114440918, + "return_pct": 4.12, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 5.36, "win_1d": true, "return_7d": 5.36, @@ -2586,10 +2616,10 @@ "entry_price": 4.409999847412109, "discovery_date": "2026-01-25", "status": "open", - "current_price": 5.059999942779541, - "return_pct": 14.74, - "days_held": 16, - "last_updated": "2026-02-10", + "current_price": 5.125, + "return_pct": 16.21, + "days_held": 17, + "last_updated": "2026-02-11", "return_1d": 14.74, "win_1d": true, "return_7d": 14.74, @@ -2609,10 +2639,12 @@ "status": "open", "current_price": 8.460000038146973, "return_pct": -4.24, - "days_held": 6, - "last_updated": "2026-02-10", + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -4.24, - "win_1d": false + "win_1d": false, + "return_7d": -4.24, + "win_7d": false }, { "ticker": "AAP", @@ -2624,12 +2656,14 @@ "entry_price": 53.834999084472656, "discovery_date": "2026-02-04", "status": "open", - "current_price": 56.599998474121094, - "return_pct": 5.14, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 59.560001373291016, + "return_pct": 10.63, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 5.14, - "win_1d": true + "win_1d": true, + "return_7d": 9.24, + "win_7d": true }, { "ticker": "RYN", @@ -2641,12 +2675,14 @@ "entry_price": 22.80500030517578, "discovery_date": "2026-02-04", "status": "open", - "current_price": 22.43000030517578, - "return_pct": -1.64, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 22.424999237060547, + "return_pct": -1.67, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -1.64, - "win_1d": false + "win_1d": false, + "return_7d": -1.18, + "win_7d": false }, { "ticker": "LLY", @@ -2658,12 +2694,14 @@ "entry_price": 1100.3299560546875, "discovery_date": "2026-02-04", "status": "open", - "current_price": 1025.0, - "return_pct": -6.85, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 1013.1400146484375, + "return_pct": -7.92, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -6.85, - "win_1d": false + "win_1d": false, + "return_7d": -7.27, + "win_7d": false }, { "ticker": "HON", @@ -2675,12 +2713,14 @@ "entry_price": 236.21499633789062, "discovery_date": "2026-02-04", "status": "open", - "current_price": 243.33999633789062, - "return_pct": 3.02, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 243.2050018310547, + "return_pct": 2.96, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 3.02, - "win_1d": true + "win_1d": true, + "return_7d": 3.08, + "win_7d": true }, { "ticker": "DELL", @@ -2692,12 +2732,14 @@ "entry_price": 119.63500213623047, "discovery_date": "2026-02-04", "status": "open", - "current_price": 126.01000213623047, - "return_pct": 5.33, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 124.58999633789062, + "return_pct": 4.14, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 5.33, - "win_1d": true + "win_1d": true, + "return_7d": 3.59, + "win_7d": true }, { "ticker": "ADBE", @@ -2709,12 +2751,14 @@ "entry_price": 278.9100036621094, "discovery_date": "2026-02-04", "status": "open", - "current_price": 264.6700134277344, - "return_pct": -5.11, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 257.5899963378906, + "return_pct": -7.64, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -5.11, - "win_1d": false + "win_1d": false, + "return_7d": -7.41, + "win_7d": false }, { "ticker": "HPE", @@ -2726,12 +2770,14 @@ "entry_price": 22.645099639892578, "discovery_date": "2026-02-04", "status": "open", - "current_price": 23.969999313354492, - "return_pct": 5.85, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 23.6299991607666, + "return_pct": 4.35, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 5.85, - "win_1d": true + "win_1d": true, + "return_7d": 4.91, + "win_7d": true }, { "ticker": "KO", @@ -2743,12 +2789,14 @@ "entry_price": 77.70999908447266, "discovery_date": "2026-02-04", "status": "open", - "current_price": 76.80999755859375, - "return_pct": -1.16, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 78.55500030517578, + "return_pct": 1.09, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -1.16, - "win_1d": false + "win_1d": false, + "return_7d": 1.47, + "win_7d": true }, { "ticker": "ADP", @@ -2760,12 +2808,14 @@ "entry_price": 236.90499877929688, "discovery_date": "2026-02-04", "status": "open", - "current_price": 225.52999877929688, - "return_pct": -4.8, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 218.16749572753906, + "return_pct": -7.91, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -4.8, - "win_1d": false + "win_1d": false, + "return_7d": -7.22, + "win_7d": false }, { "ticker": "BWA", @@ -2777,12 +2827,14 @@ "entry_price": 50.13999938964844, "discovery_date": "2026-02-04", "status": "open", - "current_price": 53.97999954223633, - "return_pct": 7.66, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 65.77999877929688, + "return_pct": 31.19, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 7.66, - "win_1d": true + "win_1d": true, + "return_7d": 31.91, + "win_7d": true }, { "ticker": "ACHC", @@ -2794,12 +2846,14 @@ "entry_price": 13.84000015258789, "discovery_date": "2026-02-04", "status": "open", - "current_price": 13.65999984741211, - "return_pct": -1.3, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 15.5649995803833, + "return_pct": 12.46, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": -1.3, - "win_1d": false + "win_1d": false, + "return_7d": 10.55, + "win_7d": true }, { "ticker": "MCD", @@ -2811,12 +2865,14 @@ "entry_price": 325.6925048828125, "discovery_date": "2026-02-04", "status": "open", - "current_price": 325.9700012207031, - "return_pct": 0.09, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 322.80499267578125, + "return_pct": -0.89, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 0.09, - "win_1d": true + "win_1d": true, + "return_7d": -0.44, + "win_7d": false }, { "ticker": "SMCI", @@ -2828,12 +2884,14 @@ "entry_price": 32.88159942626953, "discovery_date": "2026-02-04", "status": "open", - "current_price": 33.33000183105469, - "return_pct": 1.36, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 31.975000381469727, + "return_pct": -2.76, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 1.36, - "win_1d": true + "win_1d": true, + "return_7d": -1.94, + "win_7d": false }, { "ticker": "EA", @@ -2845,12 +2903,14 @@ "entry_price": 198.91000366210938, "discovery_date": "2026-02-04", "status": "open", - "current_price": 202.5800018310547, - "return_pct": 1.85, - "days_held": 6, - "last_updated": "2026-02-10", + "current_price": 202.02000427246094, + "return_pct": 1.56, + "days_held": 7, + "last_updated": "2026-02-11", "return_1d": 1.85, - "win_1d": true + "win_1d": true, + "return_7d": 1.58, + "win_7d": true } ], "2026-02-09": [ @@ -2864,10 +2924,10 @@ "entry_price": 24.639999389648438, "discovery_date": "2026-02-09", "status": "open", - "current_price": 24.81999969482422, - "return_pct": 0.73, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 24.145000457763672, + "return_pct": -2.01, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 0.73, "win_1d": true }, @@ -2881,10 +2941,10 @@ "entry_price": 8.699999809265137, "discovery_date": "2026-02-09", "status": "open", - "current_price": 8.75, - "return_pct": 0.57, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 9.109999656677246, + "return_pct": 4.71, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 0.57, "win_1d": true }, @@ -2898,10 +2958,10 @@ "entry_price": 194.02999877929688, "discovery_date": "2026-02-09", "status": "open", - "current_price": 193.4499969482422, - "return_pct": -0.3, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 184.89500427246094, + "return_pct": -4.71, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -0.3, "win_1d": false }, @@ -2915,10 +2975,10 @@ "entry_price": 69.25, "discovery_date": "2026-02-09", "status": "open", - "current_price": 69.91999816894531, - "return_pct": 0.97, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 71.54000091552734, + "return_pct": 3.31, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 0.97, "win_1d": true }, @@ -2932,10 +2992,10 @@ "entry_price": 4.980000019073486, "discovery_date": "2026-02-09", "status": "open", - "current_price": 4.849999904632568, - "return_pct": -2.61, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 4.635000228881836, + "return_pct": -6.93, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -2.61, "win_1d": false }, @@ -2949,10 +3009,10 @@ "entry_price": 20.649999618530273, "discovery_date": "2026-02-09", "status": "open", - "current_price": 20.75, - "return_pct": 0.48, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 19.7450008392334, + "return_pct": -4.38, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 0.48, "win_1d": true }, @@ -2966,10 +3026,10 @@ "entry_price": 2.549999952316284, "discovery_date": "2026-02-09", "status": "open", - "current_price": 2.5299999713897705, - "return_pct": -0.78, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 2.484999895095825, + "return_pct": -2.55, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -0.78, "win_1d": false }, @@ -2983,10 +3043,10 @@ "entry_price": 4.630000114440918, "discovery_date": "2026-02-09", "status": "open", - "current_price": 4.840000152587891, - "return_pct": 4.54, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 4.635000228881836, + "return_pct": 0.11, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 4.54, "win_1d": true }, @@ -3000,10 +3060,10 @@ "entry_price": 7.909999847412109, "discovery_date": "2026-02-09", "status": "open", - "current_price": 7.809999942779541, - "return_pct": -1.26, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 7.704999923706055, + "return_pct": -2.59, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -1.26, "win_1d": false }, @@ -3017,10 +3077,10 @@ "entry_price": 13.050000190734863, "discovery_date": "2026-02-09", "status": "open", - "current_price": 14.289999961853027, - "return_pct": 9.5, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 14.510000228881836, + "return_pct": 11.19, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 9.5, "win_1d": true }, @@ -3034,10 +3094,10 @@ "entry_price": 4.349999904632568, "discovery_date": "2026-02-09", "status": "open", - "current_price": 3.9600000381469727, - "return_pct": -8.97, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 3.9049999713897705, + "return_pct": -10.23, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -8.97, "win_1d": false }, @@ -3051,10 +3111,10 @@ "entry_price": 102.12000274658203, "discovery_date": "2026-02-09", "status": "open", - "current_price": 96.2699966430664, - "return_pct": -5.73, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 97.53009796142578, + "return_pct": -4.49, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -5.73, "win_1d": false }, @@ -3068,10 +3128,10 @@ "entry_price": 6.210000038146973, "discovery_date": "2026-02-09", "status": "open", - "current_price": 5.840000152587891, - "return_pct": -5.96, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 5.815000057220459, + "return_pct": -6.36, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": -5.96, "win_1d": false }, @@ -3085,10 +3145,10 @@ "entry_price": 43.779998779296875, "discovery_date": "2026-02-09", "status": "open", - "current_price": 44.880001068115234, - "return_pct": 2.51, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 42.814998626708984, + "return_pct": -2.2, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 2.51, "win_1d": true }, @@ -3102,10 +3162,10 @@ "entry_price": 5.610000133514404, "discovery_date": "2026-02-09", "status": "open", - "current_price": 5.789999961853027, - "return_pct": 3.21, - "days_held": 1, - "last_updated": "2026-02-10", + "current_price": 5.670000076293945, + "return_pct": 1.07, + "days_held": 2, + "last_updated": "2026-02-11", "return_1d": 3.21, "win_1d": true } @@ -3121,10 +3181,10 @@ "entry_price": 24.690000534057617, "discovery_date": "2026-02-05", "status": "open", - "current_price": 24.81999969482422, - "return_pct": 0.53, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 24.145000457763672, + "return_pct": -2.21, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 0.53, "win_1d": true }, @@ -3138,10 +3198,10 @@ "entry_price": 44.369998931884766, "discovery_date": "2026-02-05", "status": "open", - "current_price": 48.0, - "return_pct": 8.18, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 49.0, + "return_pct": 10.43, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 8.18, "win_1d": true }, @@ -3155,10 +3215,10 @@ "entry_price": 30.059999465942383, "discovery_date": "2026-02-05", "status": "open", - "current_price": 31.600000381469727, - "return_pct": 5.12, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 32.439998626708984, + "return_pct": 7.92, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 5.12, "win_1d": true }, @@ -3172,10 +3232,10 @@ "entry_price": 104.41000366210938, "discovery_date": "2026-02-05", "status": "open", - "current_price": 109.6500015258789, - "return_pct": 5.02, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 110.93000030517578, + "return_pct": 6.24, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 5.02, "win_1d": true }, @@ -3189,10 +3249,10 @@ "entry_price": 103.5, "discovery_date": "2026-02-05", "status": "open", - "current_price": 104.0, - "return_pct": 0.48, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 103.36000061035156, + "return_pct": -0.14, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 0.48, "win_1d": true }, @@ -3206,10 +3266,10 @@ "entry_price": 42.36000061035156, "discovery_date": "2026-02-05", "status": "open", - "current_price": 39.90999984741211, - "return_pct": -5.78, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 40.13999938964844, + "return_pct": -5.24, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": -5.78, "win_1d": false }, @@ -3223,10 +3283,10 @@ "entry_price": 406.70001220703125, "discovery_date": "2026-02-05", "status": "open", - "current_price": 412.6000061035156, - "return_pct": 1.45, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 409.8900146484375, + "return_pct": 0.78, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 1.45, "win_1d": true }, @@ -3240,10 +3300,10 @@ "entry_price": 397.2099914550781, "discovery_date": "2026-02-05", "status": "open", - "current_price": 425.2099914550781, - "return_pct": 7.05, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 427.0899963378906, + "return_pct": 7.52, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 7.05, "win_1d": true }, @@ -3257,10 +3317,10 @@ "entry_price": 37.81999969482422, "discovery_date": "2026-02-05", "status": "open", - "current_price": 37.970001220703125, - "return_pct": 0.4, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 37.939998626708984, + "return_pct": 0.32, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 0.4, "win_1d": true }, @@ -3274,10 +3334,10 @@ "entry_price": 243.80999755859375, "discovery_date": "2026-02-05", "status": "open", - "current_price": 244.6699981689453, - "return_pct": 0.35, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 243.5449981689453, + "return_pct": -0.11, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 0.35, "win_1d": true }, @@ -3291,10 +3351,10 @@ "entry_price": 147.47999572753906, "discovery_date": "2026-02-05", "status": "open", - "current_price": 148.94000244140625, - "return_pct": 0.99, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 146.69000244140625, + "return_pct": -0.54, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 0.99, "win_1d": true }, @@ -3308,10 +3368,10 @@ "entry_price": 37.15999984741211, "discovery_date": "2026-02-05", "status": "open", - "current_price": 40.45000076293945, - "return_pct": 8.85, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 44.02000045776367, + "return_pct": 18.46, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 8.85, "win_1d": true }, @@ -3325,10 +3385,10 @@ "entry_price": 148.5399932861328, "discovery_date": "2026-02-05", "status": "open", - "current_price": 166.0, - "return_pct": 11.75, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 164.99000549316406, + "return_pct": 11.07, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 11.75, "win_1d": true }, @@ -3342,10 +3402,10 @@ "entry_price": 4.690000057220459, "discovery_date": "2026-02-05", "status": "open", - "current_price": 4.699999809265137, - "return_pct": 0.21, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 4.545000076293945, + "return_pct": -3.09, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 0.21, "win_1d": true }, @@ -3359,13 +3419,240 @@ "entry_price": 187.77999877929688, "discovery_date": "2026-02-05", "status": "open", - "current_price": 198.5, - "return_pct": 5.71, - "days_held": 5, - "last_updated": "2026-02-10", + "current_price": 199.5399932861328, + "return_pct": 6.26, + "days_held": 6, + "last_updated": "2026-02-11", "return_1d": 5.71, "win_1d": true } + ], + "2026-02-11": [ + { + "ticker": "AVR", + "rank": 1, + "strategy_match": "insider_buying", + "final_score": 92, + "confidence": 9, + "reason": "AVR presents a compelling high-conviction setup with a massive $28.75M insider purchase representing roughly 5% of the market cap, signaling extreme confidence from L1 Capital. The stock is technically strong, trading above its 50 SMA with a bullish RSI of 54, and the Machine Learning model assigns it a high 45.8% win probability despite the general difficulty of predicting wins. The confluence of a breakout technical structure and significant insider backing creates a powerful catalyst for immediate upside.", + "entry_price": 5.659999847412109, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 5.670000076293945, + "return_pct": 0.18, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "INTC", + "rank": 2, + "strategy_match": "options_flow", + "final_score": 90, + "confidence": 9, + "reason": "Intel stands out with the highest Machine Learning win probability in the group at 47.6% (Predicted: WIN), suggesting a strong statistical edge for a bounce. Despite a recent daily dip, the stock remains in a broader uptrend above its 50 SMA, and options flow is bullish with a Put/Call ratio of 0.39. This divergence between price action and bullish flow often precedes a sharp recovery.", + "entry_price": 47.974998474121094, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 48.30500030517578, + "return_pct": 0.69, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "MANE", + "rank": 3, + "strategy_match": "insider_buying", + "final_score": 88, + "confidence": 8, + "reason": "MANE shows exceptional insider conviction with over $66M in recent purchases, a massive amount relative to its $1.4B market cap. Technically, the stock is showing strong momentum, trading near its upper Bollinger Band with a bullish MACD crossover. While the RSI is slightly overbought, the sheer magnitude of insider accumulation suggests a fundamental repricing is underway.", + "entry_price": 40.04999923706055, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 44.02000045776367, + "return_pct": 9.91, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "APH", + "rank": 4, + "strategy_match": "insider_buying", + "final_score": 85, + "confidence": 8, + "reason": "Amphenol combines strong technical momentum with a solid 44.5% ML win probability. The stock is in a confirmed strong uptrend, trading above its 50 SMA and 20 EMA, reinforced by recent insider buying. The stochastic oscillator indicates a bullish crossover, suggesting momentum is accelerating in the short term.", + "entry_price": 142.9550018310547, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 144.10499572753906, + "return_pct": 0.8, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "WRB", + "rank": 5, + "strategy_match": "insider_buying", + "final_score": 84, + "confidence": 8, + "reason": "WRB offers a defensive momentum play backed by a staggering $308M in insider purchases over the last three months. The stock maintains a steady uptrend above its 50 SMA and VWAP, indicating institutional support. With a bullish positioning in options open interest, the risk/reward ratio is highly favorable for continued upside.", + "entry_price": 70.44999694824219, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 71.54000091552734, + "return_pct": 1.55, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "NVDA", + "rank": 6, + "strategy_match": "options_flow", + "final_score": 82, + "confidence": 8, + "reason": "NVIDIA remains the market leader in momentum, trading in a strong uptrend above its 50 and 200 SMAs. Unusual bullish options activity (P/C 0.52) and a bullish MACD crossover confirm continued investor appetite ahead of earnings. The technical setup supports a continuation move as long as it holds above the $185 support zone.", + "entry_price": 192.13999938964844, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 191.210693359375, + "return_pct": -0.48, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "AUR", + "rank": 7, + "strategy_match": "earnings_calendar", + "final_score": 80, + "confidence": 7, + "reason": "Aurora faces an immediate earnings catalyst today, supported by a respectable 38.8% ML win probability. The stock is technically positioned for a breakout, trading above its 20 and 50 SMAs with rising OBV volume. The low price and high volatility (ATR 5.9%) imply a significant percentage move is likely upon the news release.", + "entry_price": 4.320000171661377, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 4.34499979019165, + "return_pct": 0.58, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "RPRX", + "rank": 8, + "strategy_match": "earnings_calendar", + "final_score": 78, + "confidence": 7, + "reason": "RPRX is reacting positively to its earnings (BMO), up 5% intraday with strong volume. Technicals are extremely bullish with the price above all key moving averages and the ADX signaling a very strong trend. Unusual call volume (P/C 0.083) suggests traders are positioning for the rally to extend further in the coming days.", + "entry_price": 44.8849983215332, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 44.18000030517578, + "return_pct": -1.57, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "APP", + "rank": 9, + "strategy_match": "earnings_calendar", + "final_score": 76, + "confidence": 7, + "reason": "AppLovin reports earnings after the close today, presenting a high-volatility event risk with massive upside potential given its 22% 5-day run-up. The ML model gives it a solid 35.5% probability, and despite being in a broader downtrend, recent short-term momentum is undeniable. This is a pure volatility play on the earnings reaction.", + "entry_price": 449.45001220703125, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 456.1199951171875, + "return_pct": 1.48, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "META", + "rank": 10, + "strategy_match": "options_flow", + "final_score": 75, + "confidence": 7, + "reason": "Meta displays resilience with a bullish options flow (P/C 0.49) and a 37.0% ML win probability. The stock is holding its uptrend above the 50 SMA and 20 EMA, indicating sustained institutional accumulation. It offers a balanced risk/reward profile as a mega-cap leader with continued momentum.", + "entry_price": 663.7750244140625, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 671.1849975585938, + "return_pct": 1.12, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "AAPL", + "rank": 11, + "strategy_match": "options_flow", + "final_score": 74, + "confidence": 7, + "reason": "Apple shows constructive bullish options flow with a P/C ratio of 0.50. Technicals are robust, with the price comfortably above the 50 SMA and RSI at 61, indicating strength without being severely overbought. It serves as a lower-volatility anchor in a momentum portfolio.", + "entry_price": 279.6499938964844, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 276.1549987792969, + "return_pct": -1.25, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "AVGO", + "rank": 12, + "strategy_match": "options_flow", + "final_score": 72, + "confidence": 6, + "reason": "Broadcom is showing signs of a reversal with a bullish MACD crossover and unusual call activity. While broadly in a downtrend, the short-term indicators like the 20 EMA and VWAP are turning positive. A bounce here is supported by the 31.9% ML probability and bullish volume divergence.", + "entry_price": 341.8599853515625, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 342.5199890136719, + "return_pct": 0.19, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "POET", + "rank": 13, + "strategy_match": "reddit_dd", + "final_score": 70, + "confidence": 6, + "reason": "POET is a speculative play driven by Reddit rumors of a large funding drop and a strong 41.2% ML win probability. The stock is highly volatile (ATR >10%), making it suitable for aggressive short-term trading. Bullish option volume supports the thesis of a potential speculative spike.", + "entry_price": 5.755000114440918, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 5.815000057220459, + "return_pct": 1.04, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "PATH", + "rank": 14, + "strategy_match": "reddit_dd", + "final_score": 68, + "confidence": 5, + "reason": "UiPath is a contrarian squeeze candidate with high short interest (20.7%) and a decent ML win probability of 41.8%. The stock has taken a significant intraday hit (-10%), which could trigger an oversold bounce or short covering rally if retail interest persists. Risk is high, but the asymmetry is present.", + "entry_price": 11.651000022888184, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 11.645000457763672, + "return_pct": -0.05, + "days_held": 0, + "last_updated": "2026-02-11" + }, + { + "ticker": "GOOGL", + "rank": 15, + "strategy_match": "options_flow", + "final_score": 67, + "confidence": 6, + "reason": "Alphabet is trading near its lower Bollinger Band, setting up a potential mean reversion bounce. Bullish options flow (P/C 0.55) suggests traders expect a recovery. Despite the downtrend, the technical extension to the downside often results in a snap-back rally.", + "entry_price": 311.7699890136719, + "discovery_date": "2026-02-11", + "status": "open", + "current_price": 310.42999267578125, + "return_pct": -0.43, + "days_held": 0, + "last_updated": "2026-02-11" + } ] } } \ No newline at end of file diff --git a/data/recommendations/statistics.json b/data/recommendations/statistics.json index c758d7d1..f9c1d2f9 100644 --- a/data/recommendations/statistics.json +++ b/data/recommendations/statistics.json @@ -1,36 +1,36 @@ { - "total_recommendations": 185, + "total_recommendations": 200, "by_strategy": { "momentum": { "count": 92, - "wins_1d": 45, - "losses_1d": 33, + "wins_1d": 47, + "losses_1d": 45, "wins_7d": 25, "losses_7d": 23, "wins_30d": 0, "losses_30d": 0, - "avg_return_1d": 1.0, + "avg_return_1d": 0.32, "avg_return_7d": 0.71, "avg_return_30d": 0, - "win_rate_1d": 57.7, + "win_rate_1d": 51.1, "win_rate_7d": 52.1 }, "volume_accumulation": { "count": 2, "wins_1d": 1, - "losses_1d": 0, + "losses_1d": 1, "wins_7d": 1, "losses_7d": 0, "wins_30d": 0, "losses_30d": 0, - "avg_return_1d": 19.7, + "avg_return_1d": 7.41, "avg_return_7d": 19.7, "avg_return_30d": 0, - "win_rate_1d": 100.0, + "win_rate_1d": 50.0, "win_rate_7d": 100.0 }, "insider_buying": { - "count": 21, + "count": 25, "wins_1d": 15, "losses_1d": 6, "wins_7d": 10, @@ -44,7 +44,7 @@ "win_rate_7d": 66.7 }, "options_flow": { - "count": 5, + "count": 11, "wins_1d": 4, "losses_1d": 1, "wins_7d": 0, @@ -57,18 +57,18 @@ "win_rate_1d": 80.0 }, "earnings_calendar": { - "count": 17, + "count": 20, "wins_1d": 6, "losses_1d": 11, - "wins_7d": 4, + "wins_7d": 5, "losses_7d": 8, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": -0.23, - "avg_return_7d": 0.36, + "avg_return_7d": 2.79, "avg_return_30d": 0, "win_rate_1d": 35.3, - "win_rate_7d": 33.3 + "win_rate_7d": 38.5 }, "contrarian_value": { "count": 6, @@ -102,15 +102,15 @@ "count": 10, "wins_1d": 5, "losses_1d": 5, - "wins_7d": 4, - "losses_7d": 3, + "wins_7d": 6, + "losses_7d": 4, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": 0.56, - "avg_return_7d": 0.85, + "avg_return_7d": 2.15, "avg_return_30d": 0, "win_rate_1d": 50.0, - "win_rate_7d": 57.1 + "win_rate_7d": 60.0 }, "early_accumulation": { "count": 1, @@ -131,28 +131,28 @@ "wins_1d": 2, "losses_1d": 5, "wins_7d": 2, - "losses_7d": 4, + "losses_7d": 5, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": -2.0, - "avg_return_7d": -2.06, + "avg_return_7d": -1.94, "avg_return_30d": 0, "win_rate_1d": 28.6, - "win_rate_7d": 33.3 + "win_rate_7d": 28.6 }, "analyst_upgrade": { "count": 8, "wins_1d": 6, "losses_1d": 2, - "wins_7d": 4, + "wins_7d": 6, "losses_7d": 2, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": 1.32, - "avg_return_7d": -0.1, + "avg_return_7d": 0.99, "avg_return_30d": 0, "win_rate_1d": 75.0, - "win_rate_7d": 66.7 + "win_rate_7d": 75.0 }, "ipo_opportunity": { "count": 1, @@ -201,78 +201,95 @@ "wins_1d": 1, "losses_1d": 1, "wins_7d": 0, - "losses_7d": 0, + "losses_7d": 2, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": -3.38, - "avg_return_7d": 0, + "avg_return_7d": -3.85, "avg_return_30d": 0, - "win_rate_1d": 50.0 + "win_rate_1d": 50.0, + "win_rate_7d": 0.0 }, "momentum_options": { "count": 2, "wins_1d": 1, "losses_1d": 1, - "wins_7d": 0, + "wins_7d": 2, "losses_7d": 0, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": 0.93, - "avg_return_7d": 0, + "avg_return_7d": 2.27, "avg_return_30d": 0, - "win_rate_1d": 50.0 + "win_rate_1d": 50.0, + "win_rate_7d": 100.0 }, "oversold_reversal": { "count": 1, "wins_1d": 0, "losses_1d": 1, "wins_7d": 0, - "losses_7d": 0, + "losses_7d": 1, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": -5.11, - "avg_return_7d": 0, + "avg_return_7d": -7.41, "avg_return_30d": 0, - "win_rate_1d": 0.0 + "win_rate_1d": 0.0, + "win_rate_7d": 0.0 }, "earnings_reversal": { "count": 2, "wins_1d": 1, "losses_1d": 1, - "wins_7d": 0, - "losses_7d": 0, + "wins_7d": 1, + "losses_7d": 1, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": -1.47, - "avg_return_7d": 0, + "avg_return_7d": -2.82, "avg_return_30d": 0, - "win_rate_1d": 50.0 + "win_rate_1d": 50.0, + "win_rate_7d": 50.0 }, "earnings_growth": { "count": 1, "wins_1d": 1, "losses_1d": 0, "wins_7d": 0, - "losses_7d": 0, + "losses_7d": 1, "wins_30d": 0, "losses_30d": 0, "avg_return_1d": 1.36, - "avg_return_7d": 0, + "avg_return_7d": -1.94, "avg_return_30d": 0, - "win_rate_1d": 100.0 + "win_rate_1d": 100.0, + "win_rate_7d": 0.0 + }, + "reddit_dd": { + "count": 2, + "wins_1d": 0, + "losses_1d": 0, + "wins_7d": 0, + "losses_7d": 0, + "wins_30d": 0, + "losses_30d": 0, + "avg_return_1d": 0, + "avg_return_7d": 0, + "avg_return_30d": 0 } }, "overall_1d": { - "count": 170, - "wins": 94, - "avg_return": 0.26, - "win_rate": 55.3 + "count": 185, + "wins": 96, + "avg_return": -0.05, + "win_rate": 51.9 }, "overall_7d": { - "count": 110, - "wins": 56, - "avg_return": -0.18, - "win_rate": 50.9 + "count": 125, + "wins": 64, + "avg_return": 0.13, + "win_rate": 51.2 }, "overall_30d": { "count": 0, diff --git a/scripts/run_daily_discovery.py b/scripts/run_daily_discovery.py new file mode 100755 index 00000000..7936d3ed --- /dev/null +++ b/scripts/run_daily_discovery.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +""" +Daily Discovery Runner — non-interactive script for cron/launchd scheduling. + +Runs the full discovery pipeline (scan → filter → rank), saves recommendations, +and updates position tracking. Designed to run before market open (~8:30 AM ET). + +Usage: + python scripts/run_daily_discovery.py # Uses defaults + python scripts/run_daily_discovery.py --date 2026-02-12 # Specific date + python scripts/run_daily_discovery.py --provider google # Override LLM provider + +Scheduling (macOS launchd): + See the companion plist at scripts/com.tradingagents.discovery.plist + +Scheduling (cron): + 30 13 * * 1-5 cd /path/to/TradingAgents && .venv/bin/python scripts/run_daily_discovery.py >> logs/discovery_cron.log 2>&1 + (13:30 UTC = 8:30 AM ET, weekdays only) +""" + +import argparse +import json +import os +import sys +from datetime import datetime +from pathlib import Path + +# Ensure project root is on sys.path +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT)) +os.chdir(ROOT) + +from tradingagents.dataflows.config import set_config +from tradingagents.default_config import DEFAULT_CONFIG +from tradingagents.graph.discovery_graph import DiscoveryGraph +from tradingagents.utils.logger import get_logger + +logger = get_logger("daily_discovery") + + +def parse_args(): + parser = argparse.ArgumentParser(description="Run daily discovery pipeline") + parser.add_argument( + "--date", + default=datetime.now().strftime("%Y-%m-%d"), + help="Analysis date (YYYY-MM-DD), defaults to today", + ) + parser.add_argument( + "--provider", + default=None, + help="LLM provider override (openai, google, anthropic)", + ) + parser.add_argument( + "--shallow-model", + default=None, + help="Override quick_think_llm model name", + ) + parser.add_argument( + "--deep-model", + default=None, + help="Override deep_think_llm model name", + ) + parser.add_argument( + "--update-positions", + action="store_true", + default=True, + help="Update position tracking after discovery (default: True)", + ) + parser.add_argument( + "--no-update-positions", + action="store_false", + dest="update_positions", + ) + return parser.parse_args() + + +def run_discovery(args): + """Run the discovery pipeline with the given arguments.""" + config = DEFAULT_CONFIG.copy() + + # Apply overrides + if args.provider: + config["llm_provider"] = args.provider.lower() + if args.shallow_model: + config["quick_think_llm"] = args.shallow_model + if args.deep_model: + config["deep_think_llm"] = args.deep_model + + set_config(config) + + # Create results directory + run_timestamp = datetime.now().strftime("%H_%M_%S") + results_dir = Path(config["results_dir"]) / "discovery" / args.date / f"run_{run_timestamp}" + results_dir.mkdir(parents=True, exist_ok=True) + config["discovery_run_dir"] = str(results_dir) + + logger.info(f"Starting daily discovery for {args.date}") + logger.info( + f"Provider: {config['llm_provider']} | " + f"Shallow: {config['quick_think_llm']} | " + f"Deep: {config['deep_think_llm']}" + ) + + # Run discovery + graph = DiscoveryGraph(config=config) + result = graph.run(trade_date=args.date) + + final_ranking = result.get("final_ranking", "No ranking available") + logger.info(f"Discovery complete. Results saved to {results_dir}") + + return result + + +def update_positions(): + """Run position updates after discovery.""" + try: + from scripts.update_positions import main as update_main + + logger.info("Updating position tracking...") + update_main() + except Exception as e: + logger.error(f"Position update failed: {e}") + + +def main(): + args = parse_args() + + logger.info("=" * 60) + logger.info(f"DAILY DISCOVERY RUN — {datetime.now().isoformat()}") + logger.info("=" * 60) + + try: + result = run_discovery(args) + + if args.update_positions: + update_positions() + + logger.info("Daily discovery completed successfully") + + except Exception as e: + logger.error(f"Discovery failed: {e}", exc_info=True) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/tradingagents/dataflows/discovery/scanners/options_flow.py b/tradingagents/dataflows/discovery/scanners/options_flow.py index 5ff3312d..67c267c4 100644 --- a/tradingagents/dataflows/discovery/scanners/options_flow.py +++ b/tradingagents/dataflows/discovery/scanners/options_flow.py @@ -1,6 +1,12 @@ -"""Unusual options activity scanner.""" +"""Unusual options activity scanner. -from typing import Any, Dict, List +Scans a ticker universe (loaded from data/tickers.txt by default) for +unusual options volume relative to open interest. Uses ThreadPoolExecutor +for parallel chain fetching so large universes remain practical. +""" + +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import Any, Dict, List, Optional from tradingagents.dataflows.discovery.scanner_registry import SCANNER_REGISTRY, BaseScanner from tradingagents.dataflows.y_finance import get_option_chain, get_ticker_options @@ -8,9 +14,30 @@ from tradingagents.utils.logger import get_logger logger = get_logger(__name__) +DEFAULT_TICKER_FILE = "data/tickers.txt" + + +def _load_tickers_from_file(path: str) -> List[str]: + """Load ticker symbols from a text file (one per line, # comments allowed).""" + try: + with open(path) as f: + tickers = [ + line.strip().upper() + for line in f + if line.strip() and not line.strip().startswith("#") + ] + if tickers: + logger.info(f"Options scanner: loaded {len(tickers)} tickers from {path}") + return tickers + except FileNotFoundError: + logger.warning(f"Ticker file not found: {path}") + except Exception as e: + logger.warning(f"Failed to load ticker file {path}: {e}") + return [] + class OptionsFlowScanner(BaseScanner): - """Scan for unusual options activity.""" + """Scan for unusual options activity across a ticker universe.""" name = "options_flow" pipeline = "edge" @@ -20,32 +47,55 @@ class OptionsFlowScanner(BaseScanner): self.min_volume_oi_ratio = self.scanner_config.get("unusual_volume_multiple", 2.0) self.min_volume = self.scanner_config.get("min_volume", 1000) self.min_premium = self.scanner_config.get("min_premium", 25000) - self.ticker_universe = self.scanner_config.get( - "ticker_universe", ["AAPL", "MSFT", "GOOGL", "AMZN", "META", "NVDA", "AMD", "TSLA"] - ) + self.max_tickers = self.scanner_config.get("max_tickers", 150) + self.max_workers = self.scanner_config.get("max_workers", 8) + + # Load universe: explicit list > ticker_file > default file + if "ticker_universe" in self.scanner_config: + self.ticker_universe = self.scanner_config["ticker_universe"] + else: + ticker_file = self.scanner_config.get( + "ticker_file", + config.get("tickers_file", DEFAULT_TICKER_FILE), + ) + self.ticker_universe = _load_tickers_from_file(ticker_file) + if not self.ticker_universe: + logger.warning("No tickers loaded — options scanner will be empty") def scan(self, state: Dict[str, Any]) -> List[Dict[str, Any]]: if not self.is_enabled(): return [] - logger.info("Scanning unusual options activity...") + universe = self.ticker_universe[: self.max_tickers] + logger.info( + f"Scanning {len(universe)} tickers for unusual options activity " + f"({self.max_workers} workers)..." + ) - candidates = [] + candidates: List[Dict[str, Any]] = [] - for ticker in self.ticker_universe[:20]: # Limit for speed - try: - unusual = self._analyze_ticker_options(ticker) - if unusual: - candidates.append(unusual) - if len(candidates) >= self.limit: - break - except Exception: - continue + with ThreadPoolExecutor(max_workers=self.max_workers) as pool: + futures = { + pool.submit(self._analyze_ticker_options, ticker): ticker + for ticker in universe + } + for future in as_completed(futures): + try: + result = future.result() + if result: + candidates.append(result) + if len(candidates) >= self.limit: + # Cancel remaining futures + for f in futures: + f.cancel() + break + except Exception: + continue logger.info(f"Found {len(candidates)} unusual options flows") return candidates - def _analyze_ticker_options(self, ticker: str) -> Dict[str, Any]: + def _analyze_ticker_options(self, ticker: str) -> Optional[Dict[str, Any]]: try: expirations = get_ticker_options(ticker) if not expirations: @@ -58,8 +108,8 @@ class OptionsFlowScanner(BaseScanner): # Find unusual strikes unusual_strikes = [] for _, opt in calls.iterrows(): - vol = opt.get("volume", 0) - oi = opt.get("openInterest", 0) + vol = opt.get("volume", 0) or 0 + oi = opt.get("openInterest", 0) or 0 if oi > 0 and vol > self.min_volume and (vol / oi) >= self.min_volume_oi_ratio: unusual_strikes.append( {"type": "call", "strike": opt["strike"], "volume": vol, "oi": oi} @@ -78,7 +128,10 @@ class OptionsFlowScanner(BaseScanner): return { "ticker": ticker, "source": self.name, - "context": f"Unusual options: {len(unusual_strikes)} strikes, P/C={pc_ratio:.2f} ({sentiment})", + "context": ( + f"Unusual options: {len(unusual_strikes)} strikes, " + f"P/C={pc_ratio:.2f} ({sentiment})" + ), "priority": "high" if sentiment == "bullish" else "medium", "strategy": "options_flow", "put_call_ratio": round(pc_ratio, 2), diff --git a/tradingagents/default_config.py b/tradingagents/default_config.py index 40138055..6b394412 100644 --- a/tradingagents/default_config.py +++ b/tradingagents/default_config.py @@ -137,28 +137,10 @@ DEFAULT_CONFIG = { "unusual_volume_multiple": 2.0, # Min volume/OI ratio for unusual activity "min_premium": 25000, # Minimum premium ($) to filter noise "min_volume": 1000, # Minimum option volume to consider - "ticker_universe": [ - "AAPL", - "MSFT", - "GOOGL", - "AMZN", - "META", - "NVDA", - "AMD", - "TSLA", - "TSMC", - "ASML", - "AVGO", - "ORCL", - "CRM", - "ADBE", - "INTC", - "QCOM", - "TXN", - "AMAT", - "LRCX", - "KLAC", - ], # Top 20 liquid options + # ticker_file: path to ticker list (defaults to tickers_file from root config) + # ticker_universe: explicit list overrides ticker_file if set + "max_tickers": 150, # Max tickers to scan (from start of file) + "max_workers": 8, # Parallel option chain fetch threads }, "congress_trades": { "enabled": False, @@ -178,7 +160,7 @@ DEFAULT_CONFIG = { "compression_min_volume_ratio": 1.3, # Min volume ratio for compression }, "market_movers": { - "enabled": True, + "enabled": False, "pipeline": "momentum", "limit": 10, }, @@ -195,7 +177,7 @@ DEFAULT_CONFIG = { "news_lookback_days": 0.5, # Days of news history to analyze }, "analyst_upgrade": { - "enabled": False, + "enabled": True, "pipeline": "news", "limit": 5, "lookback_days": 1, # Days to look back for rating changes @@ -221,7 +203,7 @@ DEFAULT_CONFIG = { "min_market_cap": 0, # Minimum market cap in billions (0 = no filter) }, "short_squeeze": { - "enabled": False, + "enabled": True, "pipeline": "events", "limit": 5, "min_short_interest_pct": 15.0, # Minimum short interest % diff --git a/tradingagents/ui/dashboard.py b/tradingagents/ui/dashboard.py index ffedf114..bf6d88ea 100644 --- a/tradingagents/ui/dashboard.py +++ b/tradingagents/ui/dashboard.py @@ -119,10 +119,16 @@ def route_page(page): "Config": pages.settings, } module = page_map.get(page) - if module: - module.render() - else: + if module is None: st.error(f"Unknown page: {page}") + return + try: + module.render() + except Exception as exc: + st.error(f"Error rendering {page}: {exc}") + import traceback + + st.code(traceback.format_exc(), language="python") def main(): diff --git a/tradingagents/ui/pages/__init__.py b/tradingagents/ui/pages/__init__.py index 4ab695db..22a16b20 100644 --- a/tradingagents/ui/pages/__init__.py +++ b/tradingagents/ui/pages/__init__.py @@ -5,29 +5,38 @@ This package contains all page modules that can be rendered in the dashboard. Each module should have a render() function that displays the page content. """ +import logging + +_logger = logging.getLogger(__name__) + try: from tradingagents.ui.pages import home -except ImportError: +except Exception as _e: + _logger.error("Failed to import home page: %s", _e, exc_info=True) home = None try: from tradingagents.ui.pages import todays_picks -except ImportError: +except Exception as _e: + _logger.error("Failed to import todays_picks page: %s", _e, exc_info=True) todays_picks = None try: from tradingagents.ui.pages import portfolio -except ImportError: +except Exception as _e: + _logger.error("Failed to import portfolio page: %s", _e, exc_info=True) portfolio = None try: from tradingagents.ui.pages import performance -except ImportError: +except Exception as _e: + _logger.error("Failed to import performance page: %s", _e, exc_info=True) performance = None try: from tradingagents.ui.pages import settings -except ImportError: +except Exception as _e: + _logger.error("Failed to import settings page: %s", _e, exc_info=True) settings = None diff --git a/tradingagents/ui/pages/performance.py b/tradingagents/ui/pages/performance.py index 130d5bc0..9467cdbd 100644 --- a/tradingagents/ui/pages/performance.py +++ b/tradingagents/ui/pages/performance.py @@ -2,16 +2,21 @@ Performance analytics page — strategy comparison and win/loss analysis. Shows strategy scatter plot with themed Plotly charts, per-strategy -breakdown table, and win rate distribution. +breakdown table, win rate distribution, and full recommendation history. """ +import numpy as np import pandas as pd import plotly.express as px import plotly.graph_objects as go import streamlit as st -from tradingagents.ui.theme import COLORS, get_plotly_template, page_header -from tradingagents.ui.utils import load_statistics, load_strategy_metrics +from tradingagents.ui.theme import COLORS, get_plotly_template, page_header, pnl_color +from tradingagents.ui.utils import ( + load_performance_database, + load_statistics, + load_strategy_metrics, +) def render() -> None: @@ -35,8 +40,19 @@ def render() -> None: # ---- Summary KPIs ---- total_trades = df["Count"].sum() - avg_wr = (df["Win Rate"] * df["Count"]).sum() / total_trades if total_trades > 0 else 0 - avg_ret = (df["Avg Return"] * df["Count"]).sum() / total_trades if total_trades > 0 else 0 + # Weighted averages only over strategies that have evaluated data (non-NaN) + eval_df = df.dropna(subset=["Win Rate", "Avg Return"]) + eval_trades = eval_df["Count"].sum() + avg_wr = ( + (eval_df["Win Rate"] * eval_df["Count"]).sum() / eval_trades + if eval_trades > 0 + else 0 + ) + avg_ret = ( + (eval_df["Avg Return"] * eval_df["Count"]).sum() / eval_trades + if eval_trades > 0 + else 0 + ) n_strategies = len(df) cols = st.columns(4) @@ -107,16 +123,16 @@ def render() -> None: unsafe_allow_html=True, ) - df_sorted = df.sort_values("Win Rate", ascending=True) - colors = [COLORS["green"] if wr >= 50 else COLORS["red"] for wr in df_sorted["Win Rate"]] + df_bar = df.dropna(subset=["Win Rate"]).sort_values("Win Rate", ascending=True) + colors = [COLORS["green"] if wr >= 50 else COLORS["red"] for wr in df_bar["Win Rate"]] fig_bar = go.Figure( go.Bar( - x=df_sorted["Win Rate"], - y=df_sorted["Strategy"], + x=df_bar["Win Rate"], + y=df_bar["Strategy"], orientation="h", marker_color=colors, - text=[f"{wr:.0f}%" for wr in df_sorted["Win Rate"]], + text=[f"{wr:.0f}%" for wr in df_bar["Win Rate"]], textposition="auto", textfont=dict(family="JetBrains Mono", size=11, color=COLORS["text_primary"]), ) @@ -169,18 +185,334 @@ def render() -> None: { "Strategy": strat_name, "Count": data.get("count", 0), - "Win Rate 1d": ( - f"{data.get('win_rate_1d', 0):.0f}%" if "win_rate_1d" in data else "N/A" + "Win Rate 1d": data.get("win_rate_1d") if "win_rate_1d" in data else None, + "Avg Ret 1d": data.get("avg_return_1d") if "avg_return_1d" in data else None, + "W/L 1d": ( + f"{data.get('wins_1d', 0)}W/{data.get('losses_1d', 0)}L" + if data.get("wins_1d", 0) + data.get("losses_1d", 0) > 0 + else "—" ), - "Win Rate 7d": ( - f"{data.get('win_rate_7d', 0):.0f}%" if "win_rate_7d" in data else "N/A" + "Win Rate 7d": data.get("win_rate_7d") if "win_rate_7d" in data else None, + "Avg Ret 7d": data.get("avg_return_7d") if "avg_return_7d" in data else None, + "W/L 7d": ( + f"{data.get('wins_7d', 0)}W/{data.get('losses_7d', 0)}L" + if data.get("wins_7d", 0) + data.get("losses_7d", 0) > 0 + else "—" ), - "Wins 1d": data.get("wins_1d", 0), - "Losses 1d": data.get("losses_1d", 0), - "Wins 7d": data.get("wins_7d", 0), - "Losses 7d": data.get("losses_7d", 0), } ) if rows: - st.dataframe(pd.DataFrame(rows), width="stretch", hide_index=True) + period_df = pd.DataFrame(rows).sort_values("Count", ascending=False) + st.dataframe( + period_df, + width="stretch", + hide_index=True, + column_config={ + "Count": st.column_config.NumberColumn(format="%d"), + "Win Rate 1d": st.column_config.NumberColumn(format="%.1f%%"), + "Avg Ret 1d": st.column_config.NumberColumn(format="%+.2f%%"), + "Win Rate 7d": st.column_config.NumberColumn(format="%.1f%%"), + "Avg Ret 7d": st.column_config.NumberColumn(format="%+.2f%%"), + }, + ) + + # ---- Recommendation History ---- + _render_recommendation_history(template) + + +# --------------------------------------------------------------------------- +# Recommendation history helpers +# --------------------------------------------------------------------------- + + +def _return_cell(val) -> str: + """Format a return value as a colored HTML span.""" + if val is None or (isinstance(val, float) and np.isnan(val)): + return '—'.format(c=COLORS["text_muted"]) + color = pnl_color(val) + return f'{val:+.2f}%' + + +def _win_dot(val) -> str: + """Green/red dot for win/loss boolean.""" + if val is None or (isinstance(val, float) and np.isnan(val)): + return "" + color = COLORS["green"] if val else COLORS["red"] + return f'●' + + +def _render_recommendation_history(template: dict) -> None: + """Full recommendation history with charts and filterable table.""" + recs = load_performance_database() + if not recs: + return + + st.markdown("
", unsafe_allow_html=True) + st.markdown( + '