diff --git a/CLAUDE.md b/CLAUDE.md index 09b7cd1..86b7e70 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,6 +2,17 @@ Never run direct database operations (inserts, updates, deletes, schema changes) against the local SQLite files (e.g. intelligence.sqlite, archive.sqlite). These are local copies and do not affect the production database. All data changes must go through code that runs in production — seed functions, migration scripts, workers, etc. +# Remote Database Queries + +To query the remote production database, POST to `https://duriin.imbenji.net/admin/api/sql` with HTTP Basic Auth (credentials in config.json at `admin.username` / `admin.password`). Use the field names `sql` and `database` (`"archive"` or `"intelligence"`): + +``` +POST /admin/api/sql +{ "sql": "SELECT ...", "database": "intelligence" } +``` + +Note: SQLite syntax only — no `LEFT()`, use `substr()` instead. Response shape: `{"results": [{"rows": [...]}], "elapsed": N}`. + # Database Policy When making any changes to the database schema or data, a strictly no data loss policy must be followed. This means: diff --git a/README.md b/README.md index 68f8eae..cf5a264 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # duriin_api -Node.js Fastify server that ingests news articles from RSS, SEC EDGAR 8-K filings, Alpha Vantage News Sentiment, Finnhub company news, and GDELT into a local SQLite archive. +Node.js Fastify server that ingests news articles from RSS, GDELT, SEC EDGAR 8-K filings, Alpha Vantage News Sentiment, Finnhub company news, and Google News into a local SQLite archive. ## Setup @@ -202,7 +202,8 @@ In Docker it runs as a separate service (`intelligence`) sharing the same image 2. **Augor worker** — pulls one pending article at a time from the queue. The article is a trigger — the unit of work is the event it belongs to. Fetches all articles in the event, matches them against tracked company embeddings via cosine similarity, calls the LLM once per matched company, writes structured knowledge and predictions, then marks all sibling articles in the event as processed. 3. **Consolidation worker** — slow loop (default 60s). For each tracked company, reads all `event_knowledge` rows, builds a flat list of claims, and calls the LLM to normalize and deduplicate them into canonical grouped facts stored in `company_facts`. Preserves `first_seen_at` across cycles. Prunes facts that have only been confirmed once and haven't been seen in 90 days. 4. **Graph worker** — slow loop (default 90s). Reads all `company_facts` rows of type `relationship`, parses the claim format, resolves whether the target entity is a tracked company, and upserts edges into `company_relationships`. Inserts reciprocal edges automatically (supplier ↔ customer, etc.) when both endpoints are tracked. -5. **Column migrations** — run on startup to safely add new columns to existing databases without data loss. +5. **Signal worker** — slow loop (default 120s). Picks the tracked company with the oldest (or missing) signal that has at least 3 recent predictions within a 90-day window. Calls the LLM with the company's facts, predictions, and relationships to produce a structured trade signal (`buy` / `sell` / `hold` / `hold_monitor`) with confidence, timeframe, risk level, risk factors, and key drivers. +6. **Column migrations** — run on startup to safely add new columns to existing databases without data loss. ### Output tables (`intelligence.sqlite`) @@ -215,6 +216,9 @@ In Docker it runs as a separate service (`intelligence`) sharing the same image | `event_predictions` | Forward-looking predictions (market share, stock price, competitive position) with `event_date` from the source articles | | `company_facts` | Deduplicated, canonical facts per company accumulated across all events. Each fact has a `confirmation_count` and a confidence tier (`low` / `medium` / `high` / `very_high`) | | `company_relationships` | Cross-company relationship graph derived from `company_facts`. Includes reciprocal edges and `confirmation_count` | +| `trade_signals` | Generated investment signals per company — signal type, confidence, timeframe, risk level, risk factors, summary, and key drivers | +| `worker_events` | Lifecycle timestamps for each worker iteration. Pruned hourly to stay bounded. Used to compute per-worker processing rates in the admin panel | +| `cursors` | Key-value state store. Currently used by the queue feeder to persist its last-processed article ID across restarts | ### Company matching @@ -237,6 +241,7 @@ Uses `openRouter.llmModel` via the OpenRouter API. One call per matched company | `workers.queueFeederBatchSize` | Articles pulled per feeder batch (default `100`) | | `workers.consolidationLoopDelayMs` | Delay between consolidation cycles (default `60000`) | | `workers.graphWorkerLoopDelayMs` | Delay between graph worker cycles (default `90000`) | +| `workers.signalLoopDelayMs` | Delay between signal generation cycles (default `120000`) | ### Admin panel @@ -244,7 +249,8 @@ The intelligence data is visible in the admin panel (`/admin`) under the **Intel - **Knowledge** — raw extracted relationships, themes, and factors per event+company. Filterable by company and type, sortable by ingestion order or event date. - **Predictions** — forward-looking LLM predictions per event+company, with direction, magnitude, timeframe, and rationale. -- **Graph** — interactive D3 force-directed network diagram of the cross-company relationship graph. Nodes are draggable and zoomable. Edge thickness reflects confirmation count. Hover an edge to see the relationship type and count. Click a tracked company node to see its top facts in a sidebar. Toggle untracked entities on/off with the checkbox in the legend. Use the Expand button to fill the full viewport. +- **Signals** — generated trade signals per company showing signal type (`buy` / `sell` / `hold` / `hold_monitor`), confidence, timeframe, risk level, risk factors, key drivers, and a generated-at timestamp. +- **Graph** — interactive D3 force-directed network diagram of the cross-company relationship graph. Nodes are draggable and zoomable. Multiple relationship types between the same pair of companies are merged into a single edge with a combined label and max confirmation count. Edge thickness reflects confirmation count. Hover an edge to see the relationship type and count. Click a tracked company node to see its top facts in a sidebar. Toggle untracked entities on/off with the checkbox in the legend. Use the Expand button to fill the full viewport. A **SQL** tab allows raw queries against either database. Multiple statements separated by `;` are supported — each runs independently and results render as separate blocks. diff --git a/backtest.py b/backtest.py new file mode 100644 index 0000000..a76d84e --- /dev/null +++ b/backtest.py @@ -0,0 +1,265 @@ +import requests +import json +import yfinance as yf +import pandas as pd +from datetime import datetime, timedelta +import time + +BASE_URL = "https://duriin.imbenji.net" +USERNAME = "admin" +PASSWORD = "changeme" + +SQL_QUERY = """ +SELECT + ep.id, + ep.event_date, + ep.direction, + ep.magnitude, + ep.timeframe, + substr(ep.rationale, 1, 100) as rationale, + tc.name, + tc.ticker +FROM event_predictions ep +JOIN tracked_companies tc ON ep.company_id = tc.id +WHERE ep.event_date >= '2020-01-01' + AND ep.event_date <= '2026-01-01' + AND ep.direction IN ('positive', 'negative') + AND tc.ticker NOT LIKE '%.%' + AND tc.ticker NOT LIKE '%ORIGIN%' + AND tc.ticker NOT LIKE '%PRIVATE%' + AND tc.ticker NOT LIKE '%DEEPSEEK%' + AND tc.ticker NOT LIKE '%ANTHROPIC%' + AND tc.ticker NOT LIKE '%OPENAI%' + AND tc.ticker NOT LIKE '%BYTEDANCE%' + AND tc.ticker NOT LIKE '%HUAWEI%' + AND tc.ticker NOT LIKE '%SCALEAI%' + AND tc.ticker NOT LIKE '%MISTRAL%' + AND tc.ticker NOT LIKE '%COHERE%' + AND tc.ticker NOT LIKE '%GROQ%' + AND tc.ticker NOT LIKE '%INFLECTION%' + AND tc.ticker NOT LIKE '%STABILITY%' + AND tc.ticker NOT LIKE '%SPACEX%' + AND tc.ticker NOT LIKE '%MCKINSEY%' + AND tc.ticker NOT LIKE '%DELOITTE%' + AND tc.ticker NOT LIKE '%XAI%' + AND length(tc.ticker) <= 5 +ORDER BY ep.event_date DESC +LIMIT 500 +""" + + +def fetch_predictions(): + resp = requests.post( + f"{BASE_URL}/admin/api/sql", + json={"sql": SQL_QUERY, "database": "intelligence"}, + auth=(USERNAME, PASSWORD), + timeout=30 + ) + resp.raise_for_status() + data = resp.json() + + # shape: {"results": [{"sql": "...", "rows": [...]}], "elapsed": 0} + if isinstance(data, list): + return data + if "results" in data and isinstance(data["results"], list) and len(data["results"]) > 0: + result = data["results"][0] + if "error" in result: + raise RuntimeError(f"SQL error: {result['error']}") + return result.get("rows", []) + if "rows" in data: + return data["rows"] + return data + + +price_cache = {} + +def get_price(ticker, date_str): + key = (ticker, date_str) + if key in price_cache: + return price_cache[key] + + try: + dt = datetime.strptime(date_str, "%Y-%m-%d") + start = dt - timedelta(days=5) + end = dt + timedelta(days=5) + + hist = yf.Ticker(ticker).history( + start=start.strftime("%Y-%m-%d"), + end=end.strftime("%Y-%m-%d"), + auto_adjust=True + ) + + if hist.empty: + price_cache[key] = None + return None + + # nearest trading day on or after date + hist.index = hist.index.tz_localize(None) if hist.index.tzinfo else hist.index + target = pd.Timestamp(dt) + after = hist[hist.index >= target] + if after.empty: + after = hist + price = float(after["Close"].iloc[0]) + price_cache[key] = price + return price + + except Exception: + price_cache[key] = None + return None + + +def add_trading_days(date_str, n): + dt = datetime.strptime(date_str, "%Y-%m-%d") + count = 0 + while count < n: + dt += timedelta(days=1) + if dt.weekday() < 5: # mon-fri + count += 1 + return dt.strftime("%Y-%m-%d") + + +def main(): + print("Fetching predictions from remote...") + preds = fetch_predictions() + print(f"Got {len(preds)} predictions\n") + + results = [] + skipped = 0 + + for i, p in enumerate(preds): + if i > 0 and i % 50 == 0: + print(f" Progress: {i}/{len(preds)} — skipped so far: {skipped}") + + ticker = p["ticker"] + event_date = p["event_date"][:10] # trim time if present + direction = p["direction"] + + date_5d = add_trading_days(event_date, 5) + date_10d = add_trading_days(event_date, 10) + date_20d = add_trading_days(event_date, 20) + + price_0 = get_price(ticker, event_date) + if price_0 is None: + skipped += 1 + continue + + price_5 = get_price(ticker, date_5d) + price_10 = get_price(ticker, date_10d) + price_20 = get_price(ticker, date_20d) + + def ret(px): + if px is None: + return None + return (px - price_0) / price_0 * 100 + + r5 = ret(price_5) + r10 = ret(price_10) + r20 = ret(price_20) + + def correct(r): + if r is None: + return None + if direction == "positive": + return r > 0 + else: + return r < 0 + + results.append({ + "id": p["id"], + "ticker": ticker, + "name": p["name"], + "event_date": event_date, + "direction": direction, + "magnitude": p.get("magnitude", ""), + "timeframe": p.get("timeframe", ""), + "rationale": p.get("rationale", ""), + "price_0": round(price_0, 4), + "price_5d": round(price_5, 4) if price_5 else None, + "price_10d": round(price_10, 4) if price_10 else None, + "price_20d": round(price_20, 4) if price_20 else None, + "5d_return": round(r5, 4) if r5 is not None else None, + "10d_return": round(r10, 4) if r10 is not None else None, + "20d_return": round(r20, 4) if r20 is not None else None, + "correct_5d": correct(r5), + "correct_10d": correct(r10), + "correct_20d": correct(r20), + }) + + df = pd.DataFrame(results) + + print(f"\n{'='*60}") + print("BACKTEST RESULTS") + print(f"{'='*60}") + print(f"Total predictions fetched: {len(preds)}") + print(f"Skipped (no price data): {skipped}") + print(f"Evaluated: {len(df)}") + print(f"Random baseline: 50.0%") + print() + + + def acc(col): + sub = df[df[col].notna()] + if len(sub) == 0: + return 0, 0 + pct = sub[col].mean() * 100 + return pct, len(sub) + + a5, n5 = acc("correct_5d") + a10, n10 = acc("correct_10d") + a20, n20 = acc("correct_20d") + + print("OVERALL DIRECTIONAL ACCURACY") + print(f" 5-day: {a5:.1f}% (n={n5})") + print(f" 10-day: {a10:.1f}% (n={n10})") + print(f" 20-day: {a20:.1f}% (n={n20})") + print() + + # by magnitude + print("BY MAGNITUDE (10-day accuracy)") + for mag in sorted(df["magnitude"].dropna().unique()): + sub = df[(df["magnitude"] == mag) & df["correct_10d"].notna()] + if len(sub) == 0: + continue + pct = sub["correct_10d"].mean() * 100 + print(f" {mag:<12} {pct:.1f}% (n={len(sub)})") + print() + + # by direction + print("BY DIRECTION (10-day accuracy)") + for d in ["bull", "bear"]: + sub = df[(df["direction"] == d) & df["correct_10d"].notna()] + if len(sub) == 0: + continue + pct = sub["correct_10d"].mean() * 100 + print(f" {d:<8} {pct:.1f}% (n={len(sub)})") + print() + + # by timeframe + print("BY TIMEFRAME (10-day accuracy)") + for tf in sorted(df["timeframe"].dropna().unique()): + sub = df[(df["timeframe"] == tf) & df["correct_10d"].notna()] + if len(sub) == 0: + continue + pct = sub["correct_10d"].mean() * 100 + print(f" {tf:<12} {pct:.1f}% (n={len(sub)})") + print() + + # sample table + sample = df[df["correct_10d"].notna()].head(30) + print("SAMPLE (30 predictions)") + print(f"{'Company':<12} {'Date':<12} {'Dir':<5} {'Mag':<8} {'5d%':>7} {'10d%':>7} {'20d%':>7} Correct@10d") + print("-" * 75) + for _, row in sample.iterrows(): + r5s = f"{row['5d_return']:+.2f}" if row['5d_return'] is not None else "N/A" + r10s = f"{row['10d_return']:+.2f}" if row['10d_return'] is not None else "N/A" + r20s = f"{row['20d_return']:+.2f}" if row['20d_return'] is not None else "N/A" + ok = "YES" if row["correct_10d"] else "NO" + name_short = str(row["ticker"])[:11] + print(f"{name_short:<12} {row['event_date']:<12} {row['direction']:<5} {str(row['magnitude']):<8} {r5s:>7} {r10s:>7} {r20s:>7} {ok}") + + df.to_csv("backtest_results.csv", index=False) + print(f"\nFull results saved to backtest_results.csv ({len(df)} rows)") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backtest_full.py b/backtest_full.py new file mode 100644 index 0000000..2ba332b --- /dev/null +++ b/backtest_full.py @@ -0,0 +1,278 @@ +import requests +import json +import yfinance as yf +import pandas as pd +from datetime import datetime, timedelta + +BASE_URL = "https://duriin.imbenji.net" +USERNAME = "admin" +PASSWORD = "changeme" + +PRIVATE_KEYWORDS = { + "OPENAI", "ANTHROPIC", "SPACEX", "BYTEDANCE", "HUAWEI", "DEEPSEEK", + "MISTRAL", "COHERE", "GROQ", "INFLECTION", "STABILITY", "SCALEAI", + "MCKINSEY", "DELOITTE", "BLUEORIGIN", "XAI", "HF", "RF", "DJI", + "CBRS", "PRIVATE", "ORIGIN" +} + +# tickers that need an exchange suffix appended +EXCHANGE_MAP = { + "005930": "005930.KS", + "000660": "000660.KS", + "002594": "002594.SZ", + "688981": "688981.SS", + "1810": "1810.HK", + "0700": "0700.HK", + "9984": "9984.T", + "AIR": "AIR.PA", + "DTE": "DTE.DE", + "HSBA": "HSBA.L", + "RHM": "RHM.DE", + "VOW": "VOW.DE", +} + +SQL_QUERY = """ +SELECT + ep.id, + ep.event_date, + ep.direction, + ep.magnitude, + ep.timeframe, + tc.name, + tc.ticker +FROM event_predictions ep +JOIN tracked_companies tc ON ep.company_id = tc.id +WHERE ep.event_date >= '2020-01-01' + AND ep.event_date <= '2026-01-01' + AND ep.direction IN ('positive', 'negative') +ORDER BY ep.event_date DESC +LIMIT 1000 +""" + + +def fetch_predictions(): + resp = requests.post( + f"{BASE_URL}/admin/api/sql", + json={"sql": SQL_QUERY, "database": "intelligence"}, + auth=(USERNAME, PASSWORD), + timeout=30 + ) + resp.raise_for_status() + data = resp.json() + result = data["results"][0] + if "error" in result: + raise RuntimeError(f"SQL error: {result['error']}") + return result.get("rows", []) + + +def resolve_ticker(raw): + t = raw.strip() + + # already has a dot suffix (e.g. AIR.PA, 005930.KS) + if "." in t: + return t + + # explicit overrides + if t in EXCHANGE_MAP: + return EXCHANGE_MAP[t] + + return t + + +def is_private(ticker, name): + t = ticker.upper() + n = (name or "").upper() + for kw in PRIVATE_KEYWORDS: + if kw in t or kw in n: + return True + # looks like a private-company placeholder (long all-caps word, no digits) + if len(t) > 6 and t.isalpha(): + return True + return False + + +price_cache = {} + + +def get_price(ticker, date_str): + key = (ticker, date_str) + if key in price_cache: + return price_cache[key] + + try: + dt = datetime.strptime(date_str, "%Y-%m-%d") + start = (dt - timedelta(days=7)).strftime("%Y-%m-%d") + end = (dt + timedelta(days=7)).strftime("%Y-%m-%d") + + hist = yf.Ticker(ticker).history(start=start, end=end, auto_adjust=True) + + if hist.empty: + price_cache[key] = None + return None + + hist.index = hist.index.tz_localize(None) if hist.index.tzinfo else hist.index + target = pd.Timestamp(dt) + after = hist[hist.index >= target] + if after.empty: + after = hist + price = float(after["Close"].iloc[0]) + price_cache[key] = price + return price + + except Exception: + price_cache[key] = None + return None + + +def add_trading_days(date_str, n): + dt = datetime.strptime(date_str, "%Y-%m-%d") + count = 0 + while count < n: + dt += timedelta(days=1) + if dt.weekday() < 5: + count += 1 + return dt.strftime("%Y-%m-%d") + + +def main(): + print("Fetching predictions from remote...") + raw_preds = fetch_predictions() + print(f"Got {len(raw_preds)} predictions from DB") + + # filter private companies + preds = [] + for p in raw_preds: + if is_private(p["ticker"], p.get("name", "")): + continue + preds.append(p) + + print(f"After filtering private companies: {len(preds)}\n") + + results = [] + skipped = 0 + + for i, p in enumerate(preds): + if i > 0 and i % 50 == 0: + print(f" Progress: {i}/{len(preds)} — evaluated: {len(results)}, skipped: {skipped}") + + raw_ticker = p["ticker"] + ticker = resolve_ticker(raw_ticker) + event_date = p["event_date"][:10] + direction = p["direction"] + + date_5d = add_trading_days(event_date, 5) + date_10d = add_trading_days(event_date, 10) + date_20d = add_trading_days(event_date, 20) + + price_0 = get_price(ticker, event_date) + if price_0 is None: + skipped += 1 + continue + + price_5 = get_price(ticker, date_5d) + price_10 = get_price(ticker, date_10d) + price_20 = get_price(ticker, date_20d) + + def ret(px): + if px is None: + return None + return (px - price_0) / price_0 * 100 + + r5 = ret(price_5) + r10 = ret(price_10) + r20 = ret(price_20) + + def correct(r): + if r is None: + return None + return (r > 0) if direction == "positive" else (r < 0) + + results.append({ + "id": p["id"], + "ticker": ticker, + "name": p["name"], + "event_date": event_date, + "direction": direction, + "magnitude": p.get("magnitude", ""), + "timeframe": p.get("timeframe", ""), + "price_0": round(price_0, 4), + "price_5d": round(price_5, 4) if price_5 else None, + "price_10d": round(price_10, 4) if price_10 else None, + "price_20d": round(price_20, 4) if price_20 else None, + "5d_return": round(r5, 4) if r5 is not None else None, + "10d_return": round(r10, 4) if r10 is not None else None, + "20d_return": round(r20, 4) if r20 is not None else None, + "correct_5d": correct(r5), + "correct_10d": correct(r10), + "correct_20d": correct(r20), + }) + + df = pd.DataFrame(results) + + print(f"\n{'='*62}") + print("BACKTEST RESULTS — ALL TRACKED COMPANIES") + print(f"{'='*62}") + print(f"Total predictions fetched: {len(raw_preds)}") + print(f"After private-company filter: {len(preds)}") + print(f"Skipped (no price data): {skipped}") + print(f"Evaluated: {len(df)}") + print(f"Random baseline: 50.0%") + print() + + def acc(col): + sub = df[df[col].notna()] + if len(sub) == 0: + return 0.0, 0 + return sub[col].mean() * 100, len(sub) + + a5, n5 = acc("correct_5d") + a10, n10 = acc("correct_10d") + a20, n20 = acc("correct_20d") + + print("OVERALL DIRECTIONAL ACCURACY") + print(f" 5-day: {a5:.1f}% (n={n5})") + print(f" 10-day: {a10:.1f}% (n={n10})") + print(f" 20-day: {a20:.1f}% (n={n20})") + print() + + print("BY MAGNITUDE (10-day accuracy)") + for mag in ["low", "medium", "high"]: + sub = df[(df["magnitude"] == mag) & df["correct_10d"].notna()] + if len(sub) == 0: + continue + print(f" {mag:<10} {sub['correct_10d'].mean()*100:.1f}% (n={len(sub)})") + print() + + print("BY DIRECTION (10-day accuracy)") + for d in ["positive", "negative"]: + sub = df[(df["direction"] == d) & df["correct_10d"].notna()] + if len(sub) == 0: + continue + print(f" {d:<12} {sub['correct_10d'].mean()*100:.1f}% (n={len(sub)})") + print() + + print("BY TIMEFRAME (10-day accuracy)") + for tf in ["short", "medium", "long"]: + sub = df[(df["timeframe"] == tf) & df["correct_10d"].notna()] + if len(sub) == 0: + continue + print(f" {tf:<10} {sub['correct_10d'].mean()*100:.1f}% (n={len(sub)})") + print() + + sample = df[df["correct_10d"].notna()].head(30) + print("SAMPLE (30 most recent predictions)") + print(f"{'Ticker':<12} {'Date':<12} {'Dir':<10} {'Mag':<8} {'5d%':>7} {'10d%':>7} {'20d%':>7} @10d") + print("-" * 72) + for _, row in sample.iterrows(): + r5s = f"{row['5d_return']:+.2f}" if row['5d_return'] is not None else "N/A" + r10s = f"{row['10d_return']:+.2f}" if row['10d_return'] is not None else "N/A" + r20s = f"{row['20d_return']:+.2f}" if row['20d_return'] is not None else "N/A" + ok = "YES" if row["correct_10d"] else "NO" + print(f"{str(row['ticker']):<12} {row['event_date']:<12} {row['direction']:<10} {str(row['magnitude']):<8} {r5s:>7} {r10s:>7} {r20s:>7} {ok}") + + df.to_csv("backtest_results_full.csv", index=False) + print(f"\nFull results saved to backtest_results_full.csv ({len(df)} rows)") + + +if __name__ == "__main__": + main() diff --git a/backtest_results.csv b/backtest_results.csv new file mode 100644 index 0000000..91eee3c --- /dev/null +++ b/backtest_results.csv @@ -0,0 +1,339 @@ +id,ticker,name,event_date,direction,magnitude,timeframe,rationale,price_0,price_5d,price_10d,price_20d,5d_return,10d_return,20d_return,correct_5d,correct_10d,correct_20d +521,GOOGL,Alphabet,2025-12-31,positive,high,long,The article suggests Alphabet was the big AI winner of the year and implies strong stock performance,312.7798,321.7535,335.6038,335.7737,2.869,7.2971,7.3514,True,True,True +700,META,Meta,2025-12-30,positive,high,short,"Acquiring a high-performing, revenue-generating AI startup like Manus strengthens Meta's AI capabili",665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +701,META,Meta,2025-12-30,positive,medium,short,The acquisition of a profitable AI startup may alleviate investor concerns about Meta’s $60 billion ,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +702,META,Meta,2025-12-30,positive,medium,medium,"Integration of Manus’ AI agents into Facebook, Instagram, and WhatsApp could increase user engagemen",665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +523,META,Meta,2025-12-30,positive,high,short,Acquiring a high-performing AI agent firm with proven revenue generation strengthens Meta's AI capab,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +524,META,Meta,2025-12-30,positive,medium,medium,Integration of Manus' AI agents into Meta's product suite could increase adoption of Meta AI in ente,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +654,WBD,Warner Bros Discovery,2025-12-28,negative,medium,medium,Speculation of a breakup and sale of WBD suggests reduced ability to invest and maintain current ope,28.79,28.51,28.89,28.58,-0.9726,0.3473,-0.7294,True,False,True +655,WBD,Warner Bros Discovery,2025-12-28,negative,low,short,"Near-term disruption from potential sale could affect content delivery and partner confidence, thoug",28.79,28.51,28.89,28.58,-0.9726,0.3473,-0.7294,True,False,True +653,WBD,Warner Bros Discovery,2025-12-26,positive,low,short,Retention of AEW programming through 2027 reinforces Warner Bros Discovery's content portfolio stabi,28.8,28.51,28.89,28.58,-1.0069,0.3125,-0.7639,False,True,False +725,NOW,ServiceNow,2025-12-23,positive,high,medium,"Acquiring Armis significantly enhances ServiceNow's cybersecurity offerings, allowing it to better s",154.36,154.23,148.81,125.4,-0.0842,-3.5955,-18.7613,False,False,False +726,NOW,ServiceNow,2025-12-23,positive,medium,medium,Integration of Armis's security software and its $340 million ARR with over 50% year-over-year growt,154.36,154.23,148.81,125.4,-0.0842,-3.5955,-18.7613,False,False,False +546,NVDA,NVIDIA,2025-12-21,positive,medium,short,"Bullish analyst sentiment with buy ratings and price targets above current levels, supported by conf",183.6801,190.5197,188.8398,186.2199,3.7237,2.8091,1.3828,True,True,True +547,NVDA,NVIDIA,2025-12-21,positive,high,long,Confidence in the 2026 launch of Blackwell-backed LLMs positions Nvidia to maintain a generational l,183.6801,190.5197,188.8398,186.2199,3.7237,2.8091,1.3828,True,True,True +647,DIS,Disney,2025-12-19,positive,medium,medium,Disney's targeted AI hiring and investment in OpenAI suggest a strategic push to innovate in guest e,111.24,113.56,111.85,111.2,2.0856,0.5484,-0.036,True,True,False +542,PANW,Palo Alto Networks,2025-12-19,positive,medium,medium,Closer collaboration with Google may improve Palo Alto Networks' positioning in the cloud security m,186.88,188.45,179.37,187.66,0.8401,-4.0186,0.4174,True,False,True +543,PANW,Palo Alto Networks,2025-12-19,positive,low,short,The positive sentiment from Wall Street and news of a closer relationship with Google could provide ,186.88,188.45,179.37,187.66,0.8401,-4.0186,0.4174,True,False,True +721,NFLX,Netflix,2025-12-19,positive,medium,medium,"By acquiring Ready Player Me, Netflix strengthens its gaming ecosystem with interoperable avatars, d",94.39,94.47,90.99,88.0,0.0848,-3.6021,-6.7698,True,False,False +722,NFLX,Netflix,2025-12-19,positive,low,long,"The integration of cross-game avatars may gradually increase Netflix's appeal in the gaming space, p",94.39,94.47,90.99,88.0,0.0848,-3.6021,-6.7698,True,False,False +536,NVDA,NVIDIA,2025-12-19,positive,medium,long,"Bernstein recommends buying Nvidia stock for 2026, suggesting expectations of long-term appreciation",180.9802,190.5197,188.8398,186.2199,5.271,4.3428,2.8952,True,True,True +537,ORCL,Oracle,2025-12-19,positive,medium,short,"Oracle's stock rose 7% after the announcement, and analysts view the deal as a positive development ",190.7975,196.7807,194.5147,190.4249,3.1359,1.9482,-0.1953,True,True,False +538,ORCL,Oracle,2025-12-19,positive,medium,medium,Oracle gains a high-profile role in managing sensitive data and compliance for a major social media ,190.7975,196.7807,194.5147,190.4249,3.1359,1.9482,-0.1953,True,True,False +539,ORCL,Oracle,2025-12-19,positive,low,medium,"The deal may lead to incremental growth in Oracle's cloud infrastructure usage, though the impact on",190.7975,196.7807,194.5147,190.4249,3.1359,1.9482,-0.1953,True,True,False +706,RIVN,Rivian,2025-12-18,positive,medium,short,The Universal Hands-Free feature significantly expands the driving scenarios in which Rivian’s drive,20.28,20.9,19.41,17.06,3.0572,-4.2899,-15.8777,True,False,False +707,RIVN,Rivian,2025-12-18,positive,low,medium,"Increased functionality may attract tech-focused EV buyers, though limited by the system's constrain",20.28,20.9,19.41,17.06,3.0572,-4.2899,-15.8777,True,False,False +709,RIVN,Rivian,2025-12-18,negative,medium,medium,Potential safety incidents related to driver inattention could lead to regulatory scrutiny or reputa,20.28,20.9,19.41,17.06,3.0572,-4.2899,-15.8777,False,True,True +533,MU,Micron,2025-12-18,positive,high,short,"Micron stock jumped 10% following a strong earnings beat and blowout guidance, with JPMorgan raising",248.3453,284.5555,315.2876,336.4886,14.5806,26.9553,35.4923,True,True,True +534,MU,Micron,2025-12-18,positive,medium,medium,Strong demand for AI memory and capacity constraints suggest Micron is well-positioned to maintain o,248.3453,284.5555,315.2876,336.4886,14.5806,26.9553,35.4923,True,True,True +535,MU,Micron,2025-12-18,positive,high,medium,"Robust demand, pricing power, and increased capital expenditures enhance Micron's ability to scale a",248.3453,284.5555,315.2876,336.4886,14.5806,26.9553,35.4923,True,True,True +528,ORCL,Oracle,2025-12-18,negative,medium,short,"Oracle's stock fell 5.4% amid concerns over debt and project delays, and investor sentiment is weake",178.9304,196.7807,194.5147,189.1892,9.9761,8.7097,5.7334,False,False,False +529,ORCL,Oracle,2025-12-18,negative,medium,medium,Delays in data center development for OpenAI could hinder Oracle's ability to capture cloud and AI i,178.9304,196.7807,194.5147,189.1892,9.9761,8.7097,5.7334,False,False,False +530,ORCL,Oracle,2025-12-18,negative,medium,medium,Funding setbacks and high debt levels may weaken Oracle's credibility and capacity to execute large-,178.9304,196.7807,194.5147,189.1892,9.9761,8.7097,5.7334,False,False,False +531,BP,BP,2025-12-18,positive,medium,short,Initial share price increase of 0.7% after the announcement and analyst commentary suggesting improv,32.8839,33.8316,35.3717,34.7004,2.882,7.5653,5.5239,True,True,True +532,BP,BP,2025-12-18,positive,medium,medium,Reinforcement of back-to-basics strategy through experienced leadership from Woodside Energy may str,32.8839,33.8316,35.3717,34.7004,2.882,7.5653,5.5239,True,True,True +450,META,Meta,2025-12-16,positive,medium,short,"By integrating leading external AI tools, Meta enhances internal productivity and innovation speed, ",656.5879,664.3712,665.3803,630.5502,1.1854,1.3391,-3.9656,True,True,False +452,GOOGL,Alphabet,2025-12-16,positive,high,short,Alphabet's stock has surged over 50% since mid-August due to renewed investor confidence in its AI i,306.3543,314.1289,313.6292,335.7337,2.5378,2.3747,9.59,True,True,True +453,GOOGL,Alphabet,2025-12-16,positive,medium,medium,Increased market valuation and AI-driven stock performance suggest Alphabet is gaining competitive m,306.3543,314.1289,313.6292,335.7337,2.5378,2.3747,9.59,True,True,True +454,META,Meta,2025-12-15,positive,medium,medium,Increased AI investment and organizational efficiency improvements position Meta to better compete i,646.9561,660.9341,658.1265,641.4208,2.1606,1.7266,-0.8556,True,True,False +455,META,Meta,2025-12-15,negative,medium,short,"Investors are worried about the company's strategy, particularly its plan to pour billions into AI, ",646.9561,660.9341,658.1265,641.4208,2.1606,1.7266,-0.8556,False,False,True +446,RIVN,Rivian,2025-12-13,positive,medium,medium,Rivian's development of proprietary AI chips and focus on autonomous driving enhances its technologi,18.7,22.45,20.9,19.22,20.0535,11.7647,2.7807,True,True,True +447,RIVN,Rivian,2025-12-13,positive,low,long,"If Rivian successfully aligns its adventure brand with advanced AI and autonomy, it may attract tech",18.7,22.45,20.9,19.22,20.0535,11.7647,2.7807,True,True,True +445,META,Meta,2025-12-11,positive,medium,medium,Meta's significant investment in AI infrastructure and clear strategic focus on frontier AI models l,651.6202,663.8816,662.7226,645.5073,1.8817,1.7038,-0.9381,True,True,False +442,WBD,Warner Bros Discovery,2025-12-08,positive,high,short,"A hostile bid from Paramount at $30 per share, higher than Netflix's offer, creates immediate upward",27.23,29.71,28.75,28.53,9.1076,5.5821,4.7742,True,True,True +443,WBD,Warner Bros Discovery,2025-12-08,positive,medium,medium,"Increased acquisition interest strengthens Warner Bros Discovery's strategic position, potentially l",27.23,29.71,28.75,28.53,9.1076,5.5821,4.7742,True,True,True +881,WBD,Warner Bros Discovery,2025-12-02,negative,medium,short,Loss of 12 Warner Bros. Discovery channels on DStv in Africa could reduce Warner Bros. Discovery's c,24.53,28.26,28.9,28.94,15.2059,17.8149,17.978,False,False,False +882,WBD,Warner Bros Discovery,2025-12-02,negative,low,short,Reduced distribution in a key African market may weaken Warner Bros. Discovery's competitive positio,24.53,28.26,28.9,28.94,15.2059,17.8149,17.978,False,False,False +736,META,Meta,2025-11-24,negative,medium,short,Increased litigation and reputational risk from allegations of inadequate safety policies may lead t,612.0264,639.7999,665.6866,660.9341,4.538,8.7676,7.9911,False,False,False +737,META,Meta,2025-11-24,negative,medium,medium,Ongoing public and regulatory scrutiny over safety failures could weaken Meta's standing compared to,612.0264,639.7999,665.6866,660.9341,4.538,8.7676,7.9911,False,False,False +738,META,Meta,2025-11-24,positive,high,short,The unredacted court filing and testimony from a former safety leader amplify existing regulatory an,612.0264,639.7999,665.6866,660.9341,4.538,8.7676,7.9911,True,True,True +458,BABA,Alibaba,2025-11-24,positive,medium,short,"Strong initial downloads of Qwen suggest increased traction in the AI application market, potentiall",160.73,164.26,158.13,150.96,2.1962,-1.6176,-6.0785,True,False,False +459,BABA,Alibaba,2025-11-24,positive,medium,short,A successful AI app debut enhances Alibaba's reputation as a competitive player in artificial intell,160.73,164.26,158.13,150.96,2.1962,-1.6176,-6.0785,True,False,False +734,META,Meta,2025-11-21,positive,medium,medium,"By securing energy through brokering, Meta strengthens its AI infrastructure scalability, improving ",593.2578,646.8682,672.2956,658.2065,9.0366,13.3227,10.9478,True,True,True +735,META,Meta,2025-11-20,positive,medium,medium,"Enhanced social VR capabilities in Hyperscape differentiate Meta’s metaverse offering, potentially i",588.1663,646.8682,660.4255,663.8816,9.9805,12.2855,12.8731,True,True,True +1005,NET,Cloudflare,2025-11-20,negative,medium,short,The global outage caused by an internal configuration error may temporarily undermine customer trust,191.39,200.21,204.15,193.83,4.6084,6.667,1.2749,False,False,False +731,NVDA,NVIDIA,2025-11-20,positive,high,short,"Nvidia's AI GPUs are sold out, demand exceeds supply, and Blackwell Ultra is leading across customer",180.6202,176.9806,183.3701,174.1306,-2.0151,1.5225,-3.593,False,True,False +732,NVDA,NVIDIA,2025-11-20,positive,medium,short,"Record revenue, $51.2B in data center sales, and a bullish Q4 outlook of $65B support investor confi",180.6202,176.9806,183.3701,174.1306,-2.0151,1.5225,-3.593,False,True,False +733,NVDA,NVIDIA,2025-11-20,positive,high,short,"Nvidia is selling every AI server chip it can make, with Blackwell Ultra driving growth, reinforcing",180.6202,176.9806,183.3701,174.1306,-2.0151,1.5225,-3.593,False,True,False +469,BLK,BlackRock,2025-11-19,negative,medium,short,Record outflows from BlackRock's Bitcoin ETF may temporarily reduce its market share in the spot Bit,1004.1747,1029.292,1068.6898,1059.1039,2.5013,6.4247,5.4701,False,False,False +467,META,Meta,2025-11-18,positive,medium,short,Winning the antitrust trial strengthens Meta's position to retain and integrate Instagram and WhatsA,596.6921,635.1577,646.0195,656.5879,6.4465,8.2668,10.038,True,True,True +468,META,Meta,2025-11-18,positive,medium,short,"Reduced regulatory overhang from the FTC case is likely to boost investor confidence, supporting sto",596.6921,635.1577,646.0195,656.5879,6.4465,8.2668,10.038,True,True,True +461,BIDU,Baidu,2025-11-14,negative,medium,short,The underwhelming reception of Baidu's latest AI model has led to a slump in its stock price due to ,116.0,110.95,116.89,125.01,-4.3535,0.7672,7.7672,True,False,False +462,AMAT,Applied Materials,2025-11-14,negative,medium,short,Sales decline is likely to negatively affect investor sentiment in the short term,225.2869,223.731,251.9358,258.8871,-0.6906,11.8289,14.9144,True,False,False +463,AMAT,Applied Materials,2025-11-14,positive,medium,long,Rebound predicted for 2026 may support recovery in stock valuation over the long term,225.2869,223.731,251.9358,258.8871,-0.6906,11.8289,14.9144,False,True,True +460,BA,Boeing,2025-11-13,positive,medium,short,"Ending the strike alleviates near-term operational risks, likely improving investor sentiment despit",194.58,179.38,189.0,200.71,-7.8117,-2.8677,3.1504,False,False,True +475,BLK,BlackRock,2025-11-11,positive,medium,medium,Increased investments in solar energy through Brasol could enhance BlackRock's exposure to the growi,1074.5188,1008.5886,1019.1085,1065.379,-6.1358,-5.1568,-0.8506,False,False,False +477,BLK,BlackRock,2025-11-11,positive,medium,long,Strengthening presence in renewable energy via Brasol improves BlackRock's competitive positioning i,1074.5188,1008.5886,1019.1085,1065.379,-6.1358,-5.1568,-0.8506,False,False,False +478,UBS,UBS,2025-11-11,negative,medium,medium,StanChart's exploration of reopening its private bank in Switzerland introduces a new competitive th,37.9997,37.0736,36.6447,40.2516,-2.4371,-3.5659,5.9261,True,True,False +471,LLY,Eli Lilly,2025-11-06,positive,medium,medium,Eloralintide matching Zepbound's results strengthens Eli Lilly's position in the obesity market by v,934.5056,1019.6682,1041.5516,1012.7996,9.1131,11.4548,8.3781,True,True,True +472,LLY,Eli Lilly,2025-11-06,positive,medium,medium,"With Eloralintide showing comparable efficacy to Zepbound, Eli Lilly could expand its obesity market",934.5056,1019.6682,1041.5516,1012.7996,9.1131,11.4548,8.3781,True,True,True +1152,AMZN,Amazon,2025-10-31,positive,high,short,Amazon's stock surged over 9% due to strong cloud results reinforcing confidence in its AI trajector,244.22,244.41,234.69,233.22,0.0778,-3.9022,-4.5041,True,False,False +1153,AMZN,Amazon,2025-10-31,positive,medium,medium,Improved perception of Amazon's cloud and AI capabilities strengthens its positioning against Micros,244.22,244.41,234.69,233.22,0.0778,-3.9022,-4.5041,True,False,False +806,META,Meta,2025-10-31,negative,medium,short,"Meta's stock fell after the earnings report due to investor concerns over rising AI spending, result",647.2675,620.6719,608.4424,646.8682,-4.1089,-5.9983,-0.0617,True,True,True +805,NFLX,Netflix,2025-10-30,positive,low,short,Stock split announcements often lead to a short-term boost in investor sentiment and share price; Ne,108.9,109.702,115.423,107.58,0.7365,5.9899,-1.2121,True,True,False +808,META,Meta,2025-10-30,negative,medium,short,"Meta shares fell nearly 9% in after-hours trading due to higher-than-expected tax charge, EPS miss, ",665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,True,True,True +809,META,Meta,2025-10-30,positive,high,long,"Aggressive AI infrastructure investment supports development of novel capabilities, enhancing engage",665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +810,META,Meta,2025-10-30,positive,medium,medium,"AI is enhancing engagement across Meta's platforms and driving targeted advertisements, which can in",665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +800,RIVN,Rivian,2025-10-30,negative,medium,short,"Layoff announcements often signal financial or operational challenges, which can lead to investor co",12.99,15.22,16.39,16.86,17.1671,26.174,29.7922,False,False,False +801,RIVN,Rivian,2025-10-30,negative,medium,medium,"Workforce reductions may slow innovation and execution speed, potentially impacting Rivian's ability",12.99,15.22,16.39,16.86,17.1671,26.174,29.7922,False,False,False +802,META,Meta,2025-10-30,negative,medium,short,Meta's stock plunged nearly 9% after earnings due to investor concerns over lack of clear monetizati,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,True,True,True +803,META,Meta,2025-10-30,positive,high,long,"Sustained high investment in AI infrastructure and talent, including through Meta Superintelligence ",665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +804,META,Meta,2025-10-30,positive,medium,medium,"Increased AI infrastructure investment supports product innovation and scalability, potentially capt",665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +818,RIVN,Rivian,2025-10-24,positive,medium,medium,The launch of the affordable R2 SUV and continued investment in AI and autonomous driving enhance Ri,12.98,13.57,15.23,14.86,4.5455,17.3344,14.4838,True,True,True +819,RIVN,Rivian,2025-10-24,positive,medium,long,"The R2's $45,000 price point targets a broader consumer base, potentially increasing market share as",12.98,13.57,15.23,14.86,4.5455,17.3344,14.4838,True,True,True +820,RIVN,Rivian,2025-10-24,negative,low,short,"Layoffs of over 600 employees may signal financial or operational challenges, likely causing short-t",12.98,13.57,15.23,14.86,4.5455,17.3344,14.4838,False,False,False +816,META,Meta,2025-10-23,positive,medium,short,"Increased automation in risk and compliance functions improves operational efficiency, allowing Meta",732.7745,665.3572,617.9066,588.1663,-9.2003,-15.6758,-19.7343,False,False,False +817,META,Meta,2025-10-23,positive,low,short,"Cost savings from workforce reductions and automation may improve margins, potentially supporting st",732.7745,665.3572,617.9066,588.1663,-9.2003,-15.6758,-19.7343,False,False,False +826,CRM,Salesforce,2025-10-19,positive,medium,medium,"The high-profile, experiential nature of Dreamforce strengthens Salesforce's brand differentiation i",253.2369,253.7846,259.3417,242.6604,0.2163,2.4107,-4.1765,True,True,False +828,CRM,Salesforce,2025-10-19,positive,medium,medium,Positioning Dreamforce as the 'world's largest AI event' and leveraging celebrity and cultural capit,253.2369,253.7846,259.3417,242.6604,0.2163,2.4107,-4.1765,True,True,False +823,TSM,TSMC,2025-10-16,positive,high,short,"TSMC reported strong Q3 revenue and net income growth, raised full-year guidance, and highlighted ro",298.1925,289.1325,301.5539,280.6494,-3.0383,1.1273,-5.8831,False,True,False +824,TSM,TSMC,2025-10-16,positive,high,short,TSMC raised full-year guidance and reported a 40.8% year-over-year revenue increase driven by AI dem,298.1925,289.1325,301.5539,280.6494,-3.0383,1.1273,-5.8831,False,True,False +825,TSM,TSMC,2025-10-16,positive,medium,medium,Strong execution in meeting AI-driven demand reinforces TSMC's leadership in advanced semiconductor ,298.1925,289.1325,301.5539,280.6494,-3.0383,1.1273,-5.8831,False,True,False +1240,HF,Hugging Face,2025-10-03,negative,medium,medium,OpenAI's valuation surge to $500 billion highlights its dominant market position and ability to attr,20.9692,20.8305,21.0089,20.9791,-0.6615,0.189,0.0472,True,False,False +1304,META,Meta,2025-10-02,positive,medium,medium,"By using AI interaction data to improve recommendation relevance, Meta can increase user engagement ",725.8361,732.2853,710.8811,665.3572,0.8885,-2.0604,-8.3323,True,False,False +1305,META,Meta,2025-10-02,positive,medium,medium,Enhanced personalization using deeper AI signals strengthens Meta's competitive edge in social media,725.8361,732.2853,710.8811,665.3572,0.8885,-2.0604,-8.3323,True,False,False +935,META,Meta,2025-10-01,positive,medium,short,AI-driven ad personalization strengthens Meta's competitive edge in digital advertising by improving,716.1423,716.6415,716.3519,750.4149,0.0697,0.0293,4.7857,True,True,True +937,META,Meta,2025-10-01,positive,medium,medium,"Enhanced ad targeting using AI interactions could increase advertiser ROI, driving higher ad spend s",716.1423,716.6415,716.3519,750.4149,0.0697,0.0293,4.7857,True,True,True +1302,SPOT,Spotify,2025-09-27,positive,medium,medium,"By adopting DDEX standards for AI transparency, Spotify positions itself as a responsible leader in ",728.47,680.5,685.29,645.78,-6.585,-5.9275,-11.3512,False,False,False +926,META,Meta,2025-09-18,positive,medium,medium,Launch of consumer-ready smartglasses with differentiated AI features may increase Meta's presence i,778.4218,747.6595,725.8361,710.8811,-3.9519,-6.7554,-8.6766,False,False,False +927,META,Meta,2025-09-18,positive,medium,short,Introduction of AI-integrated smartglasses with partnerships in fitness tech strengthens Meta's posi,778.4218,747.6595,725.8361,710.8811,-3.9519,-6.7554,-8.6766,False,False,False +929,AMZN,Amazon,2025-09-18,positive,medium,medium,Improved profitability and faster revenue growth compared to competitor Flipkart suggest Amazon Indi,231.23,218.15,222.41,214.47,-5.6567,-3.8144,-7.2482,False,False,False +930,AMZN,Amazon,2025-09-18,positive,low,short,The significant reduction in losses and strong advertising revenue growth may modestly improve inves,231.23,218.15,222.41,214.47,-5.6567,-3.8144,-7.2482,False,False,False +931,AMZN,Amazon,2025-09-18,positive,medium,medium,Amazon India's sharper decline in losses and higher revenue growth compared to Flipkart indicate str,231.23,218.15,222.41,214.47,-5.6567,-3.8144,-7.2482,False,False,False +1077,PLTR,Palantir,2025-09-18,positive,medium,short,The high-value government contract and significant investment pledge signal strong revenue growth po,176.97,179.12,187.05,178.12,1.2149,5.6959,0.6498,True,True,True +1078,PLTR,Palantir,2025-09-18,positive,medium,medium,Securing a major defence contract and expanding footprint in key UK sectors enhances Palantir’s stra,176.97,179.12,187.05,178.12,1.2149,5.6959,0.6498,True,True,True +1079,PLTR,Palantir,2025-09-18,positive,high,short,The timing of the announcement during a high-profile US presidential visit and the expansion into se,176.97,179.12,187.05,178.12,1.2149,5.6959,0.6498,True,True,True +644,TSM,TSMC,2025-09-15,positive,medium,short,"Barclays raised its price target for TSMC from $275 to $325, citing strong AI-driven demand and favo",259.1263,271.132,271.7287,301.2257,4.6331,4.8634,16.2467,True,True,True +645,TSM,TSMC,2025-09-15,positive,low,medium,"Barclays sees little near-term competitive threat to TSMC from Samsung or Intel, reinforcing its lea",259.1263,271.132,271.7287,301.2257,4.6331,4.8634,16.2467,True,True,True +642,ORCL,Oracle,2025-09-13,positive,high,short,"Oracle’s stock surged following the earnings report driven by OpenAI’s anticipated cloud spending, i",299.7744,306.2434,281.2406,291.1707,2.1579,-6.1826,-2.8701,True,False,False +643,ORCL,Oracle,2025-09-13,positive,medium,medium,Increased reliance by OpenAI on Oracle’s cloud infrastructure strengthens Oracle’s position in the A,299.7744,306.2434,281.2406,291.1707,2.1579,-6.1826,-2.8701,True,False,False +637,AZN,AstraZeneca,2025-09-13,negative,medium,short,"Pausing a major investment may signal reduced confidence in the UK market, potentially affecting inv",154.4894,150.9859,145.9979,167.3157,-2.2678,-5.4965,8.3024,True,True,False +638,AZN,AstraZeneca,2025-09-13,negative,medium,medium,Delaying expansion in a key life sciences hub like Cambridge could slow innovation and talent acquis,154.4894,150.9859,145.9979,167.3157,-2.2678,-5.4965,8.3024,True,True,False +628,ORCL,Oracle,2025-09-12,positive,medium,short,Bullish options activity suggests increased investor confidence in Oracle's near-term stock performa,289.8924,306.2434,281.2406,291.1707,5.6404,-2.9845,0.441,True,False,True +988,AAPL,Apple,2025-09-12,positive,medium,short,"Strong buy-side investor sentiment, particularly from Indian retail investors, combined with histori",233.6247,245.033,254.974,244.8034,4.8832,9.1383,4.7849,True,True,True +627,ORCL,Oracle,2025-09-11,negative,medium,short,"Shares retreated 6-7% after a record high due to concerns about overreliance on OpenAI for growth, d",305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,True,True,True +1409,ORCL,Oracle,2025-09-11,positive,high,short,Oracle's stock surged 35.98% following strong cloud revenue forecasts and major AI-related contracts,305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,False,False,False +1410,ORCL,Oracle,2025-09-11,positive,medium,medium,"With a cloud services backlog nearing $500 billion and major contracts in AI infrastructure, Oracle ",305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,False,False,False +1411,ORCL,Oracle,2025-09-11,positive,high,medium,Oracle's strategic positioning as a key AI cloud infrastructure provider through partnerships with l,305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,False,False,False +611,INTC,Intel,2025-08-28,positive,medium,short,"Direct government investment signals confidence and improves public perception, consistent with prio",24.93,24.61,24.61,33.99,-1.2836,-1.2836,36.3418,False,False,True +612,INTC,Intel,2025-08-28,positive,medium,medium,"Government funding and stake may enhance capital investment in manufacturing, supporting domestic pr",24.93,24.61,24.61,33.99,-1.2836,-1.2836,36.3418,False,False,True +608,NVDA,NVIDIA,2025-08-28,positive,high,short,"Extraordinary demand and full-speed ramp-up of Blackwell Ultra platform indicate strong adoption, re",180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +610,NVDA,NVIDIA,2025-08-28,positive,high,short,"Nvidia is positioned at the center of the AI race with Blackwell, reinforcing technological leadersh",180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1296,CRWD,CrowdStrike,2025-08-28,negative,medium,short,Shares dropped nearly 3% in extended trading after weak revenue forecast despite strong second-quart,442.0,412.46,433.38,473.09,-6.6833,-1.9502,7.0339,True,True,False +1297,CRWD,CrowdStrike,2025-08-28,negative,medium,medium,Lingering fallout from the outage and revenue incentives may weaken CrowdStrike’s position amid incr,442.0,412.46,433.38,473.09,-6.6833,-1.9502,7.0339,True,True,False +1412,NVDA,NVIDIA,2025-08-28,positive,medium,short,"La previsión de ingresos récord supera las expectativas de Wall Street, lo que generalmente supports",180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1413,NVDA,NVIDIA,2025-08-28,positive,high,medium,Continued strong demand from major cloud providers and record data center revenue suggest Nvidia is ,180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1414,NVDA,NVIDIA,2025-08-28,positive,high,medium,"Dominance in AI chip supply, especially for generative AI infrastructure, reinforces Nvidia's techno",180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1284,NVDA,NVIDIA,2025-08-22,negative,medium,short,Production halt of the H20 chip due to Beijing's pressure reduces Nvidia's ability to serve the Chin,177.9604,174.151,166.9923,176.6506,-2.1406,-6.1633,-0.736,True,True,True +1285,NVDA,NVIDIA,2025-08-22,negative,low,short,"Nvidia’s shares slid 1.9% in Asia trading following news of the H20 production halt, reflecting shor",177.9604,174.151,166.9923,176.6506,-2.1406,-6.1633,-0.736,True,True,True +1286,NVDA,NVIDIA,2025-08-22,negative,medium,short,"Suspension of H20 production weakens Nvidia’s position in China, where local firms are being incenti",177.9604,174.151,166.9923,176.6506,-2.1406,-6.1633,-0.736,True,True,True +844,AMZN,Amazon,2025-08-14,positive,medium,medium,"Amazon's expansion into same-day grocery delivery in 1,000 cities, growing to 2,300 by 2025, targets",230.98,221.95,231.6,229.95,-3.9094,0.2684,-0.4459,False,True,False +845,AMZN,Amazon,2025-08-14,positive,medium,short,"Walmart's stock dropped over 2% and Instacart's stock fell 11% following the announcement, indicatin",230.98,221.95,231.6,229.95,-3.9094,0.2684,-0.4459,False,True,False +846,AMZN,Amazon,2025-08-14,positive,low,short,"While not directly stated, the negative market reaction in competitors suggests potential investor c",230.98,221.95,231.6,229.95,-3.9094,0.2684,-0.4459,False,True,False +855,PLTR,Palantir,2025-08-10,positive,medium,short,"Stock momentum remains strong due to AI integration, government ties, and recent stellar earnings, s",182.68,177.17,158.74,153.11,-3.0162,-13.1049,-16.1868,False,False,False +856,PLTR,Palantir,2025-08-10,negative,high,long,"Current valuation is unsustainable relative to projected revenues, requiring $60 billion in sales to",182.68,177.17,158.74,153.11,-3.0162,-13.1049,-16.1868,True,True,True +857,PLTR,Palantir,2025-08-10,positive,medium,medium,Recognition as 'the best story in all of software' and leadership in AI-driven government and enterp,182.68,177.17,158.74,153.11,-3.0162,-13.1049,-16.1868,False,False,False +1208,INTC,Intel,2025-08-08,negative,medium,short,Trump's public demand for CEO resignation and allegations of conflict due to ties with Chinese firms,19.95,24.56,24.8,24.49,23.1078,24.3108,22.7569,False,False,False +1209,INTC,Intel,2025-08-08,negative,low,short,"Leadership instability and political scrutiny may delay turnaround plans, giving competitors like Nv",19.95,24.56,24.8,24.49,23.1078,24.3108,22.7569,False,False,False +1210,META,Meta,2025-08-08,positive,high,medium,"The $29 billion financing enables accelerated AI infrastructure development, strengthening Meta's ca",767.4975,783.3901,753.0215,750.687,2.0707,-1.8861,-2.1903,True,False,False +1289,TSM,TSMC,2025-08-08,negative,medium,short,"The leak of trade secrets, even if not directly TSMC’s fault, could undermine confidence in its IP p",239.7449,236.8203,230.9811,241.3113,-1.2199,-3.6555,0.6534,True,True,False +1290,TSM,TSMC,2025-08-08,negative,low,short,"While the incident does not directly implicate TSMC in wrongdoing, associated supply chain instabili",239.7449,236.8203,230.9811,241.3113,-1.2199,-3.6555,0.6534,True,True,False +1218,META,Meta,2025-08-08,positive,high,long,"The $29 billion financing enables large-scale AI data center development, strengthening Meta's infra",767.4975,783.3901,753.0215,750.687,2.0707,-1.8861,-2.1903,True,False,False +1511,SPOT,Spotify,2025-08-07,positive,medium,short,"The introduction of AI DJ, which provides personalized, context-rich music recommendations using gen",686.74,698.5,689.47,703.85,1.7124,0.3975,2.4915,True,True,True +1513,SPOT,Spotify,2025-08-07,positive,medium,medium,Investment in advanced AI features like AI DJ strengthens Spotify’s differentiation from competitors,686.74,698.5,689.47,703.85,1.7124,0.3975,2.4915,True,True,True +851,PLTR,Palantir,2025-08-07,negative,medium,medium,"CEO's remarks may deepen skepticism among educated public and academia, contributing to declining pu",182.2,181.02,156.18,156.14,-0.6476,-14.281,-14.303,True,True,True +852,PLTR,Palantir,2025-08-07,positive,medium,long,Positioning Palantir as a meritocratic alternative to elite education could strengthen employer bran,182.2,181.02,156.18,156.14,-0.6476,-14.281,-14.303,False,False,False +1288,TSM,TSMC,2025-08-07,negative,medium,short,Increased geopolitical risk and costly overseas expansion could weigh on investor sentiment in the n,240.5281,238.922,225.3699,233.182,-0.6677,-6.302,-3.0541,True,True,True +1509,TSM,TSMC,2025-08-07,positive,medium,short,Tariff exemption strengthens TSMC's competitive position relative to non-U.S.-based semiconductor ma,240.5281,238.922,225.3699,233.182,-0.6677,-6.302,-3.0541,False,False,False +1510,TSM,TSMC,2025-08-07,positive,low,short,"Exemption from high tariffs provides operational certainty and reduces near-term geopolitical risk, ",240.5281,238.922,225.3699,233.182,-0.6677,-6.302,-3.0541,False,False,False +873,PLTR,Palantir,2025-08-05,positive,high,short,"Palantir's strong earnings, revenue growth of nearly 50%, net income up 144%, raised guidance, and i",173.27,186.97,157.75,157.09,7.9067,-8.9571,-9.338,True,False,False +874,PLTR,Palantir,2025-08-05,positive,medium,medium,Investor confidence in Palantir's AI-powered efficiency and scalability may accelerate adoption in g,173.27,186.97,157.75,157.09,7.9067,-8.9571,-9.338,True,False,False +875,PLTR,Palantir,2025-08-05,positive,medium,short,Palantir's demonstrated ability to grow revenue while reducing workforce through AI gives it a perce,173.27,186.97,157.75,157.09,7.9067,-8.9571,-9.338,True,False,False +1463,META,Meta,2025-08-01,positive,high,short,Meta shares jump after strong third-quarter sales forecast and better-than-expected financial perfor,748.2527,767.4975,783.3901,736.9692,2.572,4.6959,-1.508,True,True,False +1307,MSFT,Microsoft,2025-08-01,positive,high,short,"Microsoft's stock rose 3.9% on July 31, 2025, following record valuation and strong quarterly result",521.0829,519.0249,517.1657,504.5917,-0.395,-0.7517,-3.1648,False,False,False +1308,MSFT,Microsoft,2025-08-01,positive,medium,medium,Azure's 39% growth and increasing AI-driven cloud revenue suggest Microsoft is gaining cloud market ,521.0829,519.0249,517.1657,504.5917,-0.395,-0.7517,-3.1648,False,False,False +1309,MSFT,Microsoft,2025-08-01,positive,high,long,"Surpassing four trillion dollars in market cap, second only to Nvidia, reinforces Microsoft's elite ",521.0829,519.0249,517.1657,504.5917,-0.395,-0.7517,-3.1648,False,False,False +1400,ARM,Arm Holdings,2025-07-31,negative,high,short,Arm's shares dropped nearly 13% following disappointing guidance and a strategic shift that risks cu,141.375,135.57,140.55,142.55,-4.1061,-0.5836,0.8311,True,True,False +1401,ARM,Arm Holdings,2025-07-31,negative,medium,medium,Developing full chip solutions may lead to conflicts of interest with key customers like Nvidia and ,141.375,135.57,140.55,142.55,-4.1061,-0.5836,0.8311,True,True,False +1402,ARM,Arm Holdings,2025-07-31,negative,low,long,Long-term market share could be affected if customers reduce reliance on Arm's IP due to competitive,141.375,135.57,140.55,142.55,-4.1061,-0.5836,0.8311,True,True,False +870,META,Meta,2025-07-31,positive,high,short,Shares soared 11.5% in after-hours trading following strong Q2 results and an ambitious AI vision th,771.6278,760.045,780.2974,749.3502,-1.5011,1.1235,-2.8871,False,True,False +871,META,Meta,2025-07-31,positive,medium,medium,Meta's focus on building elite AI talent and infrastructure positions it to compete more effectively,771.6278,760.045,780.2974,749.3502,-1.5011,1.1235,-2.8871,False,True,False +872,META,Meta,2025-07-31,positive,medium,medium,"With AI integration across Facebook, Instagram, WhatsApp, and Messenger, Meta could enhance user eng",771.6278,760.045,780.2974,749.3502,-1.5011,1.1235,-2.8871,False,True,False +1221,META,Meta,2025-07-31,positive,high,short,"Meta's stock rose over 10% following stronger-than-expected Q2 results and revenue guidance, reflect",771.6278,760.045,780.2974,749.3502,-1.5011,1.1235,-2.8871,False,True,False +1222,META,Meta,2025-07-31,positive,medium,medium,"Aggressive investment in AI talent and infrastructure positions Meta to better compete with OpenAI, ",771.6278,760.045,780.2974,749.3502,-1.5011,1.1235,-2.8871,False,True,False +1223,META,Meta,2025-07-31,positive,medium,medium,Strong ad revenue growth and AI-driven product enhancements may increase user engagement and ad mark,771.6278,760.045,780.2974,749.3502,-1.5011,1.1235,-2.8871,False,True,False +1279,UBS,UBS,2025-07-30,negative,medium,medium,Proposed capital requirements could impair competitiveness if implemented; CEO warns 42 billion doll,36.9761,37.0834,38.6529,39.15,0.29,4.5347,5.8793,False,False,False +893,META,Meta,2025-07-26,positive,high,medium,Hiring a foundational OpenAI researcher and formalizing leadership under a strong AI executive team ,715.9486,748.2527,767.4975,753.0215,4.5121,7.2001,5.1781,True,True,True +894,META,Meta,2025-07-26,positive,medium,long,"Strengthening AI talent base supports future AI product development, potentially increasing market s",715.9486,748.2527,767.4975,753.0215,4.5121,7.2001,5.1781,True,True,True +1558,VZ,Verizon,2025-07-24,negative,low,short,"The $175 million penalty represents a one-time cost that may slightly pressure earnings, but given V",41.0128,40.7082,40.8891,42.8693,-0.7428,-0.3018,4.5264,True,True,False +1559,VZ,Verizon,2025-07-24,negative,medium,short,Increased legal risk from patent litigation could affect investor sentiment and raise concerns about,41.0128,40.7082,40.8891,42.8693,-0.7428,-0.3018,4.5264,True,True,False +799,META,Meta,2025-07-17,negative,medium,short,Public perception may be negatively influenced by the association of top executives with privacy vio,699.7665,713.1252,771.6278,780.2974,1.909,10.2693,11.5083,False,False,False +1109,NVDA,NVIDIA,2025-07-10,positive,high,short,Nvidia's stock has surged 69% since early April and analysts project an additional 17% rise to $190 ,164.0727,172.9713,173.7111,180.74,5.4235,5.8745,10.1584,True,True,True +1110,NVDA,NVIDIA,2025-07-10,positive,medium,medium,Ongoing demand from big tech and AI innovators for high-performance computing chips reinforces Nvidi,164.0727,172.9713,173.7111,180.74,5.4235,5.8745,10.1584,True,True,True +1111,NVDA,NVIDIA,2025-07-10,positive,high,long,"Nvidia's technological leadership in AI semiconductors, combined with increasing demand and strategi",164.0727,172.9713,173.7111,180.74,5.4235,5.8745,10.1584,True,True,True +998,NVDA,NVIDIA,2025-07-03,positive,high,short,Insatiable demand for Nvidia's high-end processors from major tech companies building AI data center,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +999,NVDA,NVIDIA,2025-07-03,positive,high,short,Nvidia's market capitalization surpassing Apple's record and shares rising 2.2% amid strong AI optim,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1000,NVDA,NVIDIA,2025-07-03,positive,high,short,Becoming the most valuable company in history and leading in AI chip design for large model training,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1406,NVDA,NVIDIA,2025-07-03,positive,high,medium,Sustained AI data center expansion by major tech firms drives insatiable demand for Nvidia's leading,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1407,NVDA,NVIDIA,2025-07-03,positive,high,short,"Record market capitalization and strong stock performance, supported by robust demand and investor c",159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1408,NVDA,NVIDIA,2025-07-03,positive,high,medium,Nvidia's central role in powering AI data centers for top tech companies strengthens its competitive,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1082,MU,Micron,2025-07-03,positive,medium,medium,"The new Singapore plant will expand Micron's HBM production capacity, allowing it to capture growing",121.998,122.9316,113.0959,108.9819,0.7653,-7.2969,-10.6691,True,False,False +1083,MU,Micron,2025-07-03,positive,medium,medium,"With increased HBM output from Singapore and planned U.S. production, Micron strengthens its ability",121.998,122.9316,113.0959,108.9819,0.7653,-7.2969,-10.6691,True,False,False +1084,MU,Micron,2025-07-03,positive,low,long,Sustained revenue growth from rising HBM demand and expanded production capacity could support long-,121.998,122.9316,113.0959,108.9819,0.7653,-7.2969,-10.6691,True,False,False +1506,BP,BP,2025-07-02,positive,medium,short,"Takeover speculation and activist involvement typically create short-term stock price momentum, even",30.038,30.0093,30.633,30.9497,-0.0958,1.9808,3.0351,False,True,True +1507,BP,BP,2025-07-02,negative,medium,medium,Persistent speculation that BP could be acquired may weaken its strategic autonomy and bargaining po,30.038,30.0093,30.633,30.9497,-0.0958,1.9808,3.0351,True,False,False +902,META,Meta,2025-06-13,positive,high,medium,Acquiring key AI talent and investing heavily in AI infrastructure through Scale AI strengthens Meta,680.7462,680.7512,731.9111,715.8289,0.0007,7.516,5.1536,True,True,True +903,META,Meta,2025-06-13,positive,medium,short,Major strategic investment in AI and high-profile talent acquisition may be viewed favorably by inve,680.7462,680.7512,731.9111,715.8289,0.0007,7.516,5.1536,True,True,True +1476,NVS,Novartis,2025-06-13,positive,medium,short,"Novo Nordisk's leadership turmoil and stock decline may weaken its market positioning, creating oppo",115.9217,112.3504,116.4652,117.4453,-3.0808,0.4688,1.3144,False,True,True +1477,NVS,Novartis,2025-06-13,positive,low,short,"While Novartis is not directly affected by Novo Nordisk's CEO dismissal, reduced competitive pressur",115.9217,112.3504,116.4652,117.4453,-3.0808,0.4688,1.3144,False,True,True +1085,AMD,AMD,2025-06-13,positive,high,medium,AMD’s launch of the Helios server and partnership with OpenAI strengthen its position in the AI chip,116.16,128.24,143.81,146.42,10.3995,23.8034,26.0503,True,True,True +1086,AMD,AMD,2025-06-13,positive,medium,long,Increased adoption by major AI firms like OpenAI and the 2026 release of Helios servers could gradua,116.16,128.24,143.81,146.42,10.3995,23.8034,26.0503,True,True,True +906,WBD,Warner Bros Discovery,2025-06-10,positive,medium,long,"The split into two focused companies is expected to enhance strategic agility and brand focus, impro",10.01,10.58,10.9,11.41,5.6943,8.8911,13.986,True,True,True +907,WBD,Warner Bros Discovery,2025-06-10,positive,medium,medium,"Analysts view the spin-off as a way to unlock unrecognized value, with BofA Securities maintaining a",10.01,10.58,10.9,11.41,5.6943,8.8911,13.986,True,True,True +1395,UBS,UBS,2025-06-08,positive,medium,short,"Despite the headline capital charge, UBS shares rose 8% due to investor expectations that the final ",32.1019,31.1758,29.655,33.3107,-2.8849,-7.6222,3.7656,False,False,True +1396,UBS,UBS,2025-06-08,negative,medium,long,"Increased capital requirements may constrain UBS's ability to invest and compete globally, especiall",32.1019,31.1758,29.655,33.3107,-2.8849,-7.6222,3.7656,True,True,False +1397,UBS,UBS,2025-06-08,positive,high,medium,"The new draft law significantly increases regulatory obligations, including capitalization of foreig",32.1019,31.1758,29.655,33.3107,-2.8849,-7.6222,3.7656,False,False,True +1556,UBS,UBS,2025-06-06,negative,medium,short,"Stricter capital requirements may constrain UBS's ability to deploy capital efficiently, increasing ",32.7745,31.1758,29.655,33.3107,-4.878,-9.5181,1.6359,True,True,False +1557,UBS,UBS,2025-06-06,negative,low,short,"Announcement of higher capital requirements could lead to margin compression concerns, negatively im",32.7745,31.1758,29.655,33.3107,-4.878,-9.5181,1.6359,True,True,False +1393,AVGO,Broadcom,2025-06-06,negative,medium,short,"Broadcom's stock fell 2% in extended trading after the forecast missed the loftiest expectations, de",244.9453,246.7011,248.5644,272.6165,0.7168,1.4775,11.2969,False,False,False +913,META,Meta,2025-06-04,positive,medium,long,"Securing long-term, stable nuclear power enhances Meta's ability to scale AI infrastructure, improvi",685.8104,691.9812,694.1398,711.8981,0.8998,1.2145,3.8039,True,True,True +914,META,Meta,2025-06-04,positive,high,long,The 20-year power purchase agreement with Constellation Energy directly supports Meta's growing AI w,685.8104,691.9812,694.1398,711.8981,0.8998,1.2145,3.8039,True,True,True +1106,AVGO,Broadcom,2025-06-02,negative,medium,short,"Dissatisfied partners may drive customers toward competing private cloud solutions, increasing migra",246.711,242.3166,250.0738,274.0781,-1.7812,1.363,11.0927,True,False,False +1107,AVGO,Broadcom,2025-06-02,negative,medium,medium,"Reducing the number of channel partners, especially long-standing ones, could erode VMware's market ",246.711,242.3166,250.0738,274.0781,-1.7812,1.363,11.0927,True,False,False +1196,NVDA,NVIDIA,2025-05-29,positive,high,short,Nvidia's revenue surpassing $44bn despite China sales restrictions indicates robust global demand fo,139.1572,139.957,144.9759,154.9942,0.5748,4.1814,11.3807,True,True,True +1197,NVDA,NVIDIA,2025-05-29,positive,medium,medium,Ability to achieve record revenue under geopolitical constraints reinforces Nvidia's competitive adv,139.1572,139.957,144.9759,154.9942,0.5748,4.1814,11.3807,True,True,True +1198,NVDA,NVIDIA,2025-05-29,positive,medium,short,Strong revenue performance despite headwinds aligns with analyst sentiment supporting stock valuatio,139.1572,139.957,144.9759,154.9942,0.5748,4.1814,11.3807,True,True,True +1203,LHX,L3Harris Technologies,2025-05-29,positive,medium,short,Technical breakout above $232 resistance and inclusion in a model portfolio suggest near-term upward,239.3204,239.1635,247.3939,243.8468,-0.0655,3.3735,1.8914,False,True,True +1503,META,Meta,2025-05-29,positive,medium,medium,"One billion monthly users of Meta AI strengthens Meta's position in the generative AI race, though i",643.0439,682.4907,691.2036,724.3888,6.1344,7.4893,12.65,True,True,True +1504,META,Meta,2025-05-29,positive,low,short,"High user engagement with Meta AI may lead to incremental gains in AI assistant market share, but Go",643.0439,682.4907,691.2036,724.3888,6.1344,7.4893,12.65,True,True,True +1271,NVS,Novartis,2025-05-29,positive,medium,short,"As a competitor in the metabolic and pharmaceutical space, Novartis may benefit from Novo Nordisk's ",109.2546,114.3108,117.2027,116.766,4.6278,7.2748,6.8751,True,True,True +1272,NVS,Novartis,2025-05-29,positive,low,short,"While not directly mentioned, the known positive impact of production investment and divestment on N",109.2546,114.3108,117.2027,116.766,4.6278,7.2748,6.8751,True,True,True +1273,META,Meta,2025-05-29,positive,medium,medium,"Increased AI integration in advertising and user content, combined with high advertiser adoption, po",643.0439,682.4907,691.2036,724.3888,6.1344,7.4893,12.65,True,True,True +1274,META,Meta,2025-05-29,positive,high,medium,"Meta's massive AI investment, global user base, and early lead in AI-powered advertising tools stren",643.0439,682.4907,691.2036,724.3888,6.1344,7.4893,12.65,True,True,True +1199,META,Meta,2025-05-25,positive,medium,medium,"Expanding AI training with user data may improve Meta AI and Llama models, enhancing competitiveness",640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,True,True,True +1200,META,Meta,2025-05-25,negative,high,short,"Noyb's challenge and opt-out model may lead to GDPR enforcement actions, increasing regulatory and l",640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,False,False,False +1201,META,Meta,2025-05-25,negative,medium,short,"Public backlash over data usage for AI without explicit consent could harm user trust, especially in",640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,False,False,False +1202,META,Meta,2025-05-25,negative,low,short,Short-term investor concerns may arise from increased regulatory scrutiny and reputational risk tied,640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,False,False,False +1259,TSLA,Tesla,2025-05-23,negative,medium,short,Being outsold in Europe suggests Tesla is losing market share to a strong competitor in a key region,339.34,346.46,295.14,322.16,2.0982,-13.0253,-5.0628,False,True,True +1260,TSLA,Tesla,2025-05-23,negative,medium,short,A competitor labeled as a 'Tesla-killer' gaining sales leadership in Europe undermines Tesla's compe,339.34,346.46,295.14,322.16,2.0982,-13.0253,-5.0628,False,True,True +1261,TSLA,Tesla,2025-05-23,negative,low,short,"Missing sales expectations in a major market can negatively impact investor sentiment, especially am",339.34,346.46,295.14,322.16,2.0982,-13.0253,-5.0628,False,True,True +1464,SHOP,Shopify,2025-05-23,positive,medium,short,"The launch of the AI Store Builder enhances Shopify's product offering, differentiating its platform",101.51,107.22,111.41,106.4,5.6251,9.7527,4.8173,True,True,True +1189,WBD,Warner Bros Discovery,2025-05-14,positive,medium,medium,"By refocusing on HBO's premium brand and distinct adult-oriented content, WBD aims to carve out a cl",9.21,8.95,10.02,10.51,-2.823,8.7948,14.1151,False,True,True +1282,META,Meta,2025-05-08,negative,medium,short,Public exposure of widespread scam activity leveraging Meta's platforms may weaken user trust and in,596.1501,641.8775,634.5903,682.4907,7.6704,6.4481,14.483,False,False,False +1283,META,Meta,2025-05-08,negative,low,short,"While the takedown demonstrates proactive moderation, the underlying prevalence of sophisticated sca",596.1501,641.8775,634.5903,682.4907,7.6704,6.4481,14.483,False,False,False +1473,V,Visa,2025-05-08,positive,high,long,"By enabling AI agents to use its payment network, Visa positions itself as a foundational player in ",348.6606,360.2059,355.9009,364.6501,3.3113,2.0766,4.586,True,True,True +1474,V,Visa,2025-05-08,positive,medium,medium,Opening its network to AI developers and expanding in key markets like Europe by 2025 could increase,348.6606,360.2059,355.9009,364.6501,3.3113,2.0766,4.586,True,True,True +1475,V,Visa,2025-05-08,positive,low,short,"The announcement of a forward-looking strategic initiative may generate investor interest, though im",348.6606,360.2059,355.9009,364.6501,3.3113,2.0766,4.586,True,True,True +1263,SHEL,Shell,2025-05-06,positive,medium,short,Speculation of a potential takeover typically leads to short-term stock price appreciation for the t,62.5873,65.0004,64.7364,65.9122,3.8556,3.4338,5.3125,True,True,True +1265,BP,BP,2025-05-06,positive,high,short,"Speculation of a potential takeover by Shell has triggered a rally in BP's shares, indicating strong",26.8205,28.8603,28.0227,28.3682,7.6056,4.4825,5.7707,True,True,True +1027,HF,Hugging Face,2025-05-06,positive,medium,short,Releasing a free agentic tool enhances Hugging Face's visibility and credibility in the AI agent spa,20.0112,19.81,19.7932,19.7803,-1.0051,-1.0892,-1.1536,False,False,False +1028,HF,Hugging Face,2025-05-06,positive,low,medium,"The free availability of Open Computer Agent may attract developers to Hugging Face’s platform, pote",20.0112,19.81,19.7932,19.7803,-1.0051,-1.0892,-1.1536,False,False,False +1029,RIVN,Rivian,2025-05-06,negative,medium,short,"Rivian is reducing delivery guidance while facing increased costs from tariffs, which may limit its ",13.5,14.87,16.92,14.37,10.1481,25.3333,6.4444,False,False,False +1030,RIVN,Rivian,2025-05-06,negative,medium,short,"Lower delivery guidance, rising capex, and macroeconomic uncertainty are likely to weigh on investor",13.5,14.87,16.92,14.37,10.1481,25.3333,6.4444,False,False,False +1031,RIVN,Rivian,2025-05-06,negative,medium,short,Delays in volume growth and rising costs from tariffs weaken Rivian’s position relative to larger au,13.5,14.87,16.92,14.37,10.1481,25.3333,6.4444,False,False,False +1021,SPOT,Spotify,2025-05-04,positive,medium,medium,Growing adoption of Backstage across major enterprises and the launch of Spotify Portal for Backstag,637.65,648.25,656.3,665.14,1.6624,2.9248,4.3111,True,True,True +1022,SPOT,Spotify,2025-05-04,positive,low,long,"While Backstage is gaining traction in the internal developer portal space, its market share impact ",637.65,648.25,656.3,665.14,1.6624,2.9248,4.3111,True,True,True +1067,AMZN,Amazon,2025-05-02,positive,medium,short,"Amazon is positioned to gain market share during tariff-related uncertainty, as it did during the pa",189.98,193.06,205.59,205.01,1.6212,8.2167,7.9114,True,True,True +1068,AMZN,Amazon,2025-05-02,positive,medium,short,"Diverse seller base and proactive inventory management reduce the risk of price increases, strengthe",189.98,193.06,205.59,205.01,1.6212,8.2167,7.9114,True,True,True +1375,META,Meta,2025-05-02,positive,medium,medium,"Launching a premium AI service positions Meta to compete more effectively with OpenAI, Google, and M",595.1632,590.6473,638.3485,645.4763,-0.7588,7.256,8.4537,False,True,True +1376,META,Meta,2025-05-02,positive,medium,medium,With nearly a billion users already on Meta AI and a potential premium tier offering enhanced featur,595.1632,590.6473,638.3485,645.4763,-0.7588,7.256,8.4537,False,True,True +1037,META,Meta,2025-04-29,positive,medium,short,Launching a standalone AI app enhances Meta's visibility and positioning in the competitive AI assis,552.7156,585.4835,653.9897,640.3223,5.9285,18.323,15.8502,True,True,True +1038,META,Meta,2025-04-29,positive,low,medium,"The app leverages Meta's extensive user data for personalization, which could attract users over tim",552.7156,585.4835,653.9897,640.3223,5.9285,18.323,15.8502,True,True,True +1039,PL,Planet Labs,2025-04-29,negative,medium,medium,"The $20M funding enables Near Space Labs to scale its stratospheric imaging operations, increasing c",3.43,3.5,3.78,3.97,2.0408,10.2041,15.7434,False,False,False +1291,META,Meta,2025-04-26,negative,medium,short,"High-profile public protest by grieving parents increases reputational damage and litigation risk, w",548.0302,595.1632,590.6473,625.1098,8.6004,7.7764,14.0648,False,False,False +1292,META,Meta,2025-04-26,negative,medium,medium,Growing civil society and regulatory pressure could force Meta to implement stricter safety measures,548.0302,595.1632,590.6473,625.1098,8.6004,7.7764,14.0648,False,False,False +1293,META,Meta,2025-04-26,positive,high,short,"The protest is a direct indicator of escalating civil society pressure, which is likely to attract f",548.0302,595.1632,590.6473,625.1098,8.6004,7.7764,14.0648,True,True,True +1362,GOOGL,Alphabet,2025-04-24,positive,medium,short,Alphabet exceeded earnings expectations and stock jumped over 7% in after-hours trading despite macr,158.7296,160.7426,153.7469,170.2796,1.2682,-3.1391,7.2765,True,False,True +1047,NFLX,Netflix,2025-04-23,positive,medium,long,"Articulation of a $1 trillion market cap goal by co-CEO suggests strong long-term confidence, which ",104.959,113.172,115.541,119.463,7.825,10.082,13.8187,True,True,True +1048,NFLX,Netflix,2025-04-23,positive,medium,long,Ambitious growth targets and diversification into new ventures like theater and retail may strengthe,104.959,113.172,115.541,119.463,7.825,10.082,13.8187,True,True,True +1052,META,Meta,2025-04-23,positive,medium,medium,"Expanding ads globally increases Threads' competitiveness against X, leveraging high user engagement",518.652,547.2925,594.9539,633.5235,5.5221,14.7116,22.1481,True,True,True +1053,META,Meta,2025-04-23,positive,high,short,Opening ad inventory to global advertisers directly expands monetization opportunities across a user,518.652,547.2925,594.9539,633.5235,5.5221,14.7116,22.1481,True,True,True +1054,META,Meta,2025-04-23,positive,medium,medium,"Meta positions Threads as more advertiser-friendly than X, using Instagram's network effects to stre",518.652,547.2925,594.9539,633.5235,5.5221,14.7116,22.1481,True,True,True +1045,META,Meta,2025-04-20,negative,medium,long,Ongoing struggles with Facebook's cultural relevance may weaken Meta's competitive position over tim,483.1527,545.568,595.1632,638.3485,12.9183,23.1833,32.1215,False,False,False +1046,META,Meta,2025-04-20,negative,medium,long,Declining cultural relevance of Facebook could lead to erosion in user engagement and time spent on ,483.1527,545.568,595.1632,638.3485,12.9183,23.1833,32.1215,False,False,False +1040,META,Meta,2025-04-17,negative,medium,short,TikTok's continued dominance in short-form video has already caused a dramatic slowdown in Meta's gr,499.9204,531.4919,570.4304,641.8775,6.3153,14.1043,28.3959,False,False,False +1041,META,Meta,2025-04-17,negative,medium,short,Zuckerberg's admission that TikTok directly slowed Meta's growth implies a loss of user engagement a,499.9204,531.4919,570.4304,641.8775,6.3153,14.1043,28.3959,False,False,False +1058,RIVN,Rivian,2025-04-16,positive,medium,medium,"HelloFresh’s adoption of 70 Rivian vans marks the first major commercial customer beyond Amazon, sig",11.49,11.8,13.66,14.82,2.698,18.886,28.9817,True,True,True +1059,RIVN,Rivian,2025-04-16,positive,medium,medium,Securing HelloFresh as a public customer enhances Rivian’s credibility in the commercial EV space be,11.49,11.8,13.66,14.82,2.698,18.886,28.9817,True,True,True +1460,NFLX,Netflix,2025-04-15,positive,high,long,Netflix's goal of 410 million subscribers by 2030 implies sustained global subscriber growth and mar,97.628,104.034,112.564,113.844,6.5616,15.2989,16.61,True,True,True +1461,NFLX,Netflix,2025-04-15,positive,high,long,"Ambition to join the $1 trillion market cap club, supported by strong profitability and growth traje",97.628,104.034,112.564,113.844,6.5616,15.2989,16.61,True,True,True +1462,NFLX,Netflix,2025-04-15,positive,medium,long,Netflix's profitability and scale advantage over rivals like Apple TV+ and Peacock strengthens its c,97.628,104.034,112.564,113.844,6.5616,15.2989,16.61,True,True,True +1207,NVS,Novartis,2025-04-11,positive,medium,short,The announcement of a major investment in U.S. production facilities led to a 1.6% increase in Novar,104.3441,107.2749,108.8276,105.4892,2.8088,4.2969,1.0975,True,True,True +1372,HF,Hugging Face,2025-04-11,positive,medium,medium,Increased public legal conflict between OpenAI and Elon Musk may divert focus and resources from Ope,19.9983,20.0924,19.9884,19.9785,0.4707,-0.0495,-0.0991,True,False,False +1108,SHOP,Shopify,2025-04-10,negative,medium,short,"Growing traction of TikTok Shop in social commerce, especially among Gen Z and legacy brands, may er",84.63,83.65,95.12,94.0,-1.158,12.3951,11.0717,True,False,False +1478,META,Meta,2025-04-10,negative,medium,short,Whistleblower testimony before Congress alleging collusion with the Chinese government on censorship,544.591,499.9204,531.4919,596.1501,-8.2026,-2.4053,9.4675,True,True,False +1479,META,Meta,2025-04-10,negative,medium,medium,"Allegations of aiding Chinese AI development via Llama could damage partnerships, restrict future AI",544.591,499.9204,531.4919,596.1501,-8.2026,-2.4053,9.4675,True,True,False +1480,META,Meta,2025-04-10,positive,high,short,Senate testimony alleging Meta’s cooperation with the Chinese Communist Party on censorship and data,544.591,499.9204,531.4919,596.1501,-8.2026,-2.4053,9.4675,False,False,True +1373,META,Meta,2025-04-10,negative,medium,short,"Allegations of collaboration with the Chinese Communist Party on censorship tools, aired during a U.",544.591,499.9204,531.4919,596.1501,-8.2026,-2.4053,9.4675,True,True,False +1374,META,Meta,2025-04-10,negative,medium,medium,Increased reputational damage and regulatory scrutiny from U.S. lawmakers may weaken Meta's public t,544.591,499.9204,531.4919,596.1501,-8.2026,-2.4053,9.4675,True,True,False +1175,ORCL,Oracle,2025-03-31,negative,medium,short,"Public criticism over handling of security incidents, particularly involving sensitive patient data,",137.9258,125.4463,133.3026,138.7479,-9.048,-3.3519,0.5961,True,True,False +1176,ORCL,Oracle,2025-03-31,negative,medium,medium,"Security concerns, especially in healthcare and legacy infrastructure, may weaken trust in Oracle's ",137.9258,125.4463,133.3026,138.7479,-9.048,-3.3519,0.5961,True,True,False +1481,TSLA,Tesla,2025-03-27,positive,medium,short,Tesla's 100% US production insulates it from the 25% import tariffs that will burden competitors lik,273.13,267.28,252.4,259.51,-2.1418,-7.5898,-4.9866,False,False,False +1482,TSLA,Tesla,2025-03-27,positive,low,medium,"With competitors facing higher costs due to tariffs, Tesla may gain slight market share in the US, t",273.13,267.28,252.4,259.51,-2.1418,-7.5898,-4.9866,False,False,False +1554,RIVN,Rivian,2025-03-26,positive,medium,medium,"By expanding into micromobility through Also, Rivian strengthens its technological brand and diversi",12.1,12.49,11.77,11.8,3.2231,-2.7273,-2.4793,True,False,False +1494,TSM,TSMC,2025-03-25,negative,medium,medium,The substantial capital expenditure with expected margin pressure from U.S. operations may weigh on ,178.6869,166.5769,139.6405,149.5478,-6.7772,-21.8518,-16.3074,True,True,True +1181,META,Meta,2025-03-24,negative,medium,short,"Meta's failed acquisition of FuriosaAI, an AI chip startup developing competitive chips for reasonin",616.9253,574.5675,514.6444,483.1527,-6.866,-16.5791,-21.6838,True,True,True +1182,META,Meta,2025-03-24,negative,low,medium,"While FuriosaAI remains independent and may expand its partnerships (e.g., with LG AI Research), Met",616.9253,574.5675,514.6444,483.1527,-6.866,-16.5791,-21.6838,True,True,True +1183,FTNT,Fortinet,2025-03-17,negative,medium,short,The public disclosure of active exploitation of Fortinet vulnerabilities by a LockBit-linked group m,96.67,99.79,96.26,96.85,3.2275,-0.4241,0.1862,False,True,False +1184,FTNT,Fortinet,2025-03-17,negative,medium,medium,Repeated security breaches linked to Fortinet products could weaken its market standing versus compe,96.67,99.79,96.26,96.85,3.2275,-0.4241,0.1862,False,True,False +1359,RIVN,Rivian,2025-03-05,positive,high,long,Providing core software and architecture to a major automaker like Volkswagen enhances Rivian’s stra,11.42,11.06,11.36,12.49,-3.1524,-0.5254,9.3695,False,False,True +1360,RIVN,Rivian,2025-03-05,positive,medium,short,The influx of capital and validation of Rivian’s technology by Volkswagen may boost investor confide,11.42,11.06,11.36,12.49,-3.1524,-0.5254,9.3695,False,False,True +1354,META,Meta,2025-03-05,positive,medium,medium,Expanding facial recognition tools in regulated markets like the UK and EU strengthens Meta's positi,653.8467,617.084,582.2435,582.1139,-5.6225,-10.9511,-10.9709,False,False,False +1355,META,Meta,2025-03-05,positive,low,medium,"Optional anti-fraud and verification tools may improve user trust and retention, particularly among ",653.8467,617.084,582.2435,582.1139,-5.6225,-10.9511,-10.9709,False,False,False +1560,BLK,BlackRock,2025-03-02,positive,medium,short,"Record inflows suggest investor confidence remains strong despite the ESG reversal, potentially supp",941.8132,927.7991,909.947,927.5837,-1.488,-3.3835,-1.5109,False,False,False +1562,BLK,BlackRock,2025-03-02,positive,medium,short,"By aligning with conservative political forces and avoiding regulatory scrutiny, BlackRock may gain ",941.8132,927.7991,909.947,927.5837,-1.488,-3.3835,-1.5109,False,False,False +1350,META,Meta,2025-02-27,positive,low,short,"Terminating leakers may strengthen internal discipline and protect strategic information, slightly i",655.6096,625.4207,588.2797,600.706,-4.6047,-10.2698,-8.3744,False,False,False +1351,META,Meta,2025-02-27,negative,medium,short,Public disclosure of internal leaks and subsequent firings may amplify perceptions of internal disse,655.6096,625.4207,588.2797,600.706,-4.6047,-10.2698,-8.3744,True,True,True +1142,SAP,SAP,2025-02-27,negative,low,short,"The stock is continuing a downward trend, underperforming the Dax, and trading volume has decreased,",272.1395,276.837,252.9034,265.7473,1.7261,-7.0685,-2.3489,False,True,True +1114,PLTR,Palantir,2025-02-08,positive,high,short,"Retail investor enthusiasm, dollar-cost averaging, and a significant rise in stock price in 2024 and",116.65,119.16,101.35,84.91,2.1517,-13.1162,-27.2096,True,False,False +1065,AMD,AMD,2025-02-04,positive,medium,medium,"Powering 100 million game consoles indicates strong market penetration in the gaming segment, likely",119.5,111.1,114.28,100.75,-7.0293,-4.3682,-15.6904,False,False,False +1066,AMD,AMD,2025-02-04,positive,medium,short,Success in securing design wins across major console platforms strengthens AMD's position against co,119.5,111.1,114.28,100.75,-7.0293,-4.3682,-15.6904,False,False,False +1125,NVDA,NVIDIA,2025-01-30,negative,medium,short,"Technical indicators suggest further downside toward $110, with momentum shifting negative in the in",124.6092,128.6379,135.2457,120.1106,3.2331,8.5359,-3.6101,False,False,True +1244,NVDA,NVIDIA,2025-01-30,positive,medium,short,"The stock rebounded nearly 9% following a sharp decline, indicating strong investor resilience and c",124.6092,128.6379,135.2457,120.1106,3.2331,8.5359,-3.6101,True,True,False +1243,MS,Morgan Stanley,2025-01-24,positive,medium,short,"Morgan Stanley is highlighted as one of the top stocks to buy for strong Q4 earnings, with positive ",133.331,134.8122,136.3217,128.2484,1.1109,2.2431,-3.812,True,True,False +1248,STX,Seagate,2025-01-23,positive,medium,short,Solid 2Q25 performance driven by cloud sector recovery and increasing AI storage demand support upwa,106.1709,96.2413,94.5374,100.5108,-9.3525,-10.9574,-5.3311,False,False,False +1130,META,Meta,2025-01-21,positive,low,short,"Enhanced cross-platform integration improves user engagement and data sharing across Meta's apps, sl",613.9966,671.6353,701.3759,713.5073,9.3875,14.2312,16.207,True,True,True +1466,TSM,TSMC,2025-01-16,positive,high,short,Strong profit growth driven by high AI chip demand supports a positive short-term stock price moveme,211.3388,221.0109,204.8055,198.5871,4.5766,-3.0914,-6.0338,True,False,False +1467,TSM,TSMC,2025-01-16,positive,medium,medium,Continued leadership in advanced semiconductor manufacturing and strong customer relationships reinf,211.3388,221.0109,204.8055,198.5871,4.5766,-3.0914,-6.0338,True,False,False +1468,TSM,TSMC,2025-01-16,negative,medium,medium,Geopolitical uncertainties and export restrictions may negatively affect future business operations ,211.3388,221.0109,204.8055,198.5871,4.5766,-3.0914,-6.0338,False,True,True +1312,META,Meta,2025-01-10,negative,high,short,"Widespread condemnation from 71 fact-checking organizations, including a public open letter, signals",613.3989,610.3214,644.9025,711.6646,-0.5017,5.1359,16.0199,True,False,False +1313,META,Meta,2025-01-10,positive,medium,medium,Strong pushback from civil society groups may prompt increased scrutiny from regulators concerned wi,613.3989,610.3214,644.9025,711.6646,-0.5017,5.1359,16.0199,False,True,True +1159,NVDA,NVIDIA,2025-01-07,positive,medium,short,Analyst reaffirmation of Nvidia as a top pick following a major executive keynote typically boosts i,140.0941,131.7168,140.7839,118.6111,-5.9797,0.4924,-15.3347,False,True,False +1160,NVDA,NVIDIA,2025-01-07,positive,low,medium,Positive analyst sentiment following a strategic keynote may reinforce market perception of Nvidia's,140.0941,131.7168,140.7839,118.6111,-5.9797,0.4924,-15.3347,False,True,False +1157,RIVN,Rivian,2025-01-03,positive,high,short,"Rivian's stock surged 24.5%, its largest daily increase since going public, after meeting revised pr",16.49,13.85,14.21,12.56,-16.0097,-13.8266,-23.8326,False,False,False +1158,RIVN,Rivian,2025-01-03,positive,medium,medium,Resolving production constraints and delivering above analyst expectations strengthens Rivian's posi,16.49,13.85,14.21,12.56,-16.0097,-13.8266,-23.8326,False,False,False +1162,AVGO,Broadcom,2024-12-31,positive,high,short,Broadcom's stock price rose 111% in 2024 due to strong AI-related demand and market outperformance r,229.2828,226.1181,222.2215,205.0728,-1.3803,-3.0797,-10.559,False,False,False +1163,AVGO,Broadcom,2024-12-31,positive,medium,medium,"Broadcom is gaining ground in the AI chip and networking space despite Nvidia's dominance, positioni",229.2828,226.1181,222.2215,205.0728,-1.3803,-3.0797,-10.559,False,False,False +1161,AAPL,Apple,2024-12-26,positive,high,medium,"Apple's stock soars to a record high, and JPMorgan has a positive outlook for the company in 2025, s",257.6127,242.5252,235.5632,222.4449,-5.8567,-8.5592,-13.6515,False,False,False +1317,LLY,Eli Lilly,2024-12-23,positive,medium,short,Eli Lilly's potential to extend a winning streak over the broad market for 6 years suggests continue,789.0677,766.8309,758.17,735.6262,-2.8181,-3.9157,-6.7727,False,False,False +1427,SMCI,Super Micro Computer,2024-12-16,negative,medium,short,"Removal from Nasdaq 100 triggers passive fund selling, combined with ongoing governance and complian",33.44,32.4,30.68,31.08,-3.11,-8.2536,-7.0574,True,True,True +1428,SMCI,Super Micro Computer,2024-12-16,negative,low,medium,Reduced market visibility and investor confidence may impair access to capital and strategic partner,33.44,32.4,30.68,31.08,-3.11,-8.2536,-7.0574,True,True,True +1254,META,Meta,2024-12-14,positive,medium,medium,"By challenging OpenAI’s for-profit transition, Meta aims to constrain a key AI competitor’s flexibil",621.7454,582.9113,597.4131,613.3989,-6.246,-3.9135,-1.3424,False,False,False +1255,META,Meta,2024-12-14,positive,high,short,"Meta’s public call for regulatory intervention increases scrutiny on OpenAI, amplifying broader regu",621.7454,582.9113,597.4131,613.3989,-6.246,-3.9135,-1.3424,False,False,False +1424,AAPL,Apple,2024-12-13,positive,medium,medium,"Morgan Stanley naming Apple a top pick for 2025 signals strong institutional confidence, supporting ",246.7819,253.1074,254.2014,235.5632,2.5632,3.0065,-4.546,True,True,False +1441,SPOT,Spotify,2024-12-11,positive,medium,short,Public discussion around faking Spotify Wrapped indicates high user interest and emotional investmen,476.91,448.65,457.98,479.73,-5.9256,-3.9693,0.5913,False,False,True +1439,RIVN,Rivian,2024-12-09,positive,medium,medium,Rivian's superior charging experience and renewable energy partnerships enhance its differentiation ,14.45,15.34,13.75,15.715,6.1592,-4.8443,8.7543,True,False,True +1440,RIVN,Rivian,2024-12-09,positive,low,long,Expanded charging infrastructure accessible to all EV users increases Rivian's visibility and brand ,14.45,15.34,13.75,15.715,6.1592,-4.8443,8.7543,True,False,True +1431,CVX,Chevron,2024-12-08,positive,medium,short,"Goldman Sachs reiterated a buy rating with a raised price target, citing strong shareholder returns ",148.6666,145.6285,135.1987,139.9309,-2.0435,-9.0591,-5.876,False,False,False +1432,CVX,Chevron,2024-12-08,positive,medium,medium,Recognition by top Wall Street analysts as a top dividend stock enhances Chevron's profile among ene,148.6666,145.6285,135.1987,139.9309,-2.0435,-9.0591,-5.876,False,False,False +1429,SHOP,Shopify,2024-12-06,positive,medium,short,"Analyst upgrade typically leads to improved market sentiment and short-term stock price momentum, es",118.37,114.63,108.95,109.25,-3.1596,-7.9581,-7.7047,False,False,False +1430,SHOP,Shopify,2024-12-06,positive,low,medium,Increased recognition of AI capabilities may enhance Shopify's positioning against competitors over ,118.37,114.63,108.95,109.25,-3.1596,-7.9581,-7.7047,False,False,False +1437,AMD,AMD,2024-12-04,positive,medium,short,"The article suggests a potential catch-up trade based on technical charts, indicating upward momentu",143.99,130.15,121.41,120.63,-9.6118,-15.6816,-16.2234,False,False,False +1445,HF,Hugging Face,2024-12-02,positive,medium,medium,"CEO's forward-looking predictions highlight Hugging Face's thought leadership in AI trends, particul",20.6144,20.6099,20.4877,20.2371,-0.0216,-0.6144,-1.8305,False,False,False +1436,SHOP,Shopify,2024-12-02,negative,medium,short,Increased migration of sellers to TikTok Shop intensifies competition in the e-commerce platform spa,112.98,115.29,115.94,106.69,2.0446,2.6199,-5.5674,False,False,True +1433,NOW,ServiceNow,2024-12-01,positive,high,medium,"Analyst upgraded price target due to strong financials, AI tailwinds, and confidence in near- and me",209.686,224.868,224.22,216.292,7.2403,6.9313,3.1504,True,True,True +1434,NOW,ServiceNow,2024-12-01,positive,medium,long,"New Workflow Data Fabric product expected to power new workflows and AI agents, enhancing differenti",209.686,224.868,224.22,216.292,7.2403,6.9313,3.1504,True,True,True +1435,NOW,ServiceNow,2024-12-01,positive,high,long,"Product innovation expected to double total addressable market to $500 billion, enabling greater mar",209.686,224.868,224.22,216.292,7.2403,6.9313,3.1504,True,True,True +1442,META,Meta,2024-11-29,positive,high,long,"By building a private, globally spanning subsea cable, Meta gains greater control over data transmis",571.5638,620.7766,617.373,597.4131,8.6102,8.0147,4.5226,True,True,True +1443,META,Meta,2024-11-29,negative,medium,short,"The $10 billion upfront investment may raise investor concerns about near-term profitability, especi",571.5638,620.7766,617.373,597.4131,8.6102,8.0147,4.5226,False,False,False +1444,META,Meta,2024-11-29,positive,medium,long,Exclusive control over high-capacity global data infrastructure will enable Meta to scale AI-driven ,571.5638,620.7766,617.373,597.4131,8.6102,8.0147,4.5226,True,True,True +1446,META,Meta,2024-11-21,positive,low,medium,"Proactive measures against scams may improve platform trustworthiness, slightly enhancing Meta's com",560.3878,571.5639,606.0079,593.1899,1.9943,8.1408,5.8535,True,True,True +1453,CMCSA,Comcast,2024-11-20,positive,medium,short,"A spin-off of the cable business could unlock shareholder value and streamline operations, potential",37.9328,37.5534,37.5446,33.4063,-1.0002,-1.0235,-11.933,False,False,False +1454,CMCSA,Comcast,2024-11-20,positive,medium,long,Separating the cable business may allow Comcast to focus on growth areas like streaming and broadban,37.9328,37.5534,37.5446,33.4063,-1.0002,-1.0235,-11.933,False,False,False +1448,META,Meta,2024-11-14,negative,medium,short,The $840 million fine represents a significant financial penalty and reinforces investor concerns ab,574.3903,560.3878,571.5639,627.7628,-2.4378,-0.4921,9.292,True,True,False +1449,META,Meta,2024-11-14,negative,medium,medium,"The EU ruling may force Meta to alter how Marketplace is integrated into Facebook, potentially reduc",574.3903,560.3878,571.5639,627.7628,-2.4378,-0.4921,9.292,True,True,False +1450,META,Meta,2024-11-14,positive,high,long,"This fine adds to a pattern of EU enforcement actions, signaling sustained and increasing regulatory",574.3903,560.3878,571.5639,627.7628,-2.4378,-0.4921,9.292,False,False,True +1527,TSLA,Tesla,2024-11-08,positive,high,short,"Tesla's stock surged 29% in one week following Trump's election, driven by investor optimism over re",321.22,320.72,352.56,389.22,-0.1557,9.7566,21.1693,False,True,True +1528,TSLA,Tesla,2024-11-08,positive,medium,medium,Potential higher tariffs on Chinese EVs like BYD could reduce competitive pressure in the U.S. marke,321.22,320.72,352.56,389.22,-0.1557,9.7566,21.1693,False,True,True +1552,RIVN,Rivian,2024-10-17,positive,low,short,"The novelty of themed updates may attract media attention and increase short-term consumer interest,",10.12,10.43,10.1,10.31,3.0632,-0.1976,1.8775,True,False,True +1553,RIVN,Rivian,2024-10-17,positive,medium,short,Differentiating through unique software features strengthens Rivian’s image as an innovator in EV te,10.12,10.43,10.1,10.31,3.0632,-0.1976,1.8775,True,False,True diff --git a/backtest_results_full.csv b/backtest_results_full.csv new file mode 100644 index 0000000..d745cc4 --- /dev/null +++ b/backtest_results_full.csv @@ -0,0 +1,392 @@ +id,ticker,name,event_date,direction,magnitude,timeframe,price_0,price_5d,price_10d,price_20d,5d_return,10d_return,20d_return,correct_5d,correct_10d,correct_20d +521,GOOGL,Alphabet,2025-12-31,positive,high,long,312.7798,321.7535,335.6038,335.7737,2.869,7.2971,7.3514,True,True,True +700,META,Meta,2025-12-30,positive,high,short,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +701,META,Meta,2025-12-30,positive,medium,short,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +702,META,Meta,2025-12-30,positive,medium,medium,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +523,META,Meta,2025-12-30,positive,high,short,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +524,META,Meta,2025-12-30,positive,medium,medium,665.3803,660.0549,630.5502,672.3943,-0.8004,-5.2346,1.0541,False,False,True +654,WBD,Warner Bros Discovery,2025-12-28,negative,medium,medium,28.79,28.51,28.89,28.58,-0.9726,0.3473,-0.7294,True,False,True +655,WBD,Warner Bros Discovery,2025-12-28,negative,low,short,28.79,28.51,28.89,28.58,-0.9726,0.3473,-0.7294,True,False,True +653,WBD,Warner Bros Discovery,2025-12-26,positive,low,short,28.8,28.51,28.89,28.58,-1.0069,0.3125,-0.7639,False,True,False +725,NOW,ServiceNow,2025-12-23,positive,high,medium,154.36,154.23,148.81,125.4,-0.0842,-3.5955,-18.7613,False,False,False +726,NOW,ServiceNow,2025-12-23,positive,medium,medium,154.36,154.23,148.81,125.4,-0.0842,-3.5955,-18.7613,False,False,False +546,NVDA,NVIDIA,2025-12-21,positive,medium,short,183.6801,190.5197,188.8398,186.2199,3.7237,2.8091,1.3828,True,True,True +547,NVDA,NVIDIA,2025-12-21,positive,high,long,183.6801,190.5197,188.8398,186.2199,3.7237,2.8091,1.3828,True,True,True +647,DIS,Disney,2025-12-19,positive,medium,medium,111.24,113.56,111.85,111.2,2.0856,0.5484,-0.036,True,True,False +542,PANW,Palo Alto Networks,2025-12-19,positive,medium,medium,186.88,188.45,179.37,187.66,0.8401,-4.0186,0.4174,True,False,True +543,PANW,Palo Alto Networks,2025-12-19,positive,low,short,186.88,188.45,179.37,187.66,0.8401,-4.0186,0.4174,True,False,True +721,NFLX,Netflix,2025-12-19,positive,medium,medium,94.39,94.47,90.99,88.0,0.0848,-3.6021,-6.7698,True,False,False +722,NFLX,Netflix,2025-12-19,positive,low,long,94.39,94.47,90.99,88.0,0.0848,-3.6021,-6.7698,True,False,False +536,NVDA,NVIDIA,2025-12-19,positive,medium,long,180.9802,190.5197,188.8398,186.2199,5.271,4.3428,2.8952,True,True,True +537,ORCL,Oracle,2025-12-19,positive,medium,short,190.7975,196.7807,194.5147,190.4249,3.1359,1.9482,-0.1953,True,True,False +538,ORCL,Oracle,2025-12-19,positive,medium,medium,190.7975,196.7807,194.5147,190.4249,3.1359,1.9482,-0.1953,True,True,False +539,ORCL,Oracle,2025-12-19,positive,low,medium,190.7975,196.7807,194.5147,190.4249,3.1359,1.9482,-0.1953,True,True,False +706,RIVN,Rivian,2025-12-18,positive,medium,short,20.28,20.9,19.41,17.06,3.0572,-4.2899,-15.8777,True,False,False +707,RIVN,Rivian,2025-12-18,positive,low,medium,20.28,20.9,19.41,17.06,3.0572,-4.2899,-15.8777,True,False,False +709,RIVN,Rivian,2025-12-18,negative,medium,medium,20.28,20.9,19.41,17.06,3.0572,-4.2899,-15.8777,False,True,True +533,MU,Micron,2025-12-18,positive,high,short,248.3453,284.5555,315.2876,336.4886,14.5806,26.9553,35.4923,True,True,True +534,MU,Micron,2025-12-18,positive,medium,medium,248.3453,284.5555,315.2876,336.4886,14.5806,26.9553,35.4923,True,True,True +535,MU,Micron,2025-12-18,positive,high,medium,248.3453,284.5555,315.2876,336.4886,14.5806,26.9553,35.4923,True,True,True +528,ORCL,Oracle,2025-12-18,negative,medium,short,178.9304,196.7807,194.5147,189.1892,9.9761,8.7097,5.7334,False,False,False +529,ORCL,Oracle,2025-12-18,negative,medium,medium,178.9304,196.7807,194.5147,189.1892,9.9761,8.7097,5.7334,False,False,False +530,ORCL,Oracle,2025-12-18,negative,medium,medium,178.9304,196.7807,194.5147,189.1892,9.9761,8.7097,5.7334,False,False,False +531,BP,BP,2025-12-18,positive,medium,short,32.8839,33.8316,35.3717,34.7004,2.882,7.5653,5.5239,True,True,True +532,BP,BP,2025-12-18,positive,medium,medium,32.8839,33.8316,35.3717,34.7004,2.882,7.5653,5.5239,True,True,True +450,META,Meta,2025-12-16,positive,medium,short,656.5879,664.3712,665.3803,630.5502,1.1854,1.3391,-3.9656,True,True,False +452,GOOGL,Alphabet,2025-12-16,positive,high,short,306.3543,314.1289,313.6292,335.7337,2.5378,2.3747,9.59,True,True,True +453,GOOGL,Alphabet,2025-12-16,positive,medium,medium,306.3543,314.1289,313.6292,335.7337,2.5378,2.3747,9.59,True,True,True +454,META,Meta,2025-12-15,positive,medium,medium,646.9561,660.9341,658.1265,641.4208,2.1606,1.7266,-0.8556,True,True,False +455,META,Meta,2025-12-15,negative,medium,short,646.9561,660.9341,658.1265,641.4208,2.1606,1.7266,-0.8556,False,False,True +446,RIVN,Rivian,2025-12-13,positive,medium,medium,18.7,22.45,20.9,19.22,20.0535,11.7647,2.7807,True,True,True +447,RIVN,Rivian,2025-12-13,positive,low,long,18.7,22.45,20.9,19.22,20.0535,11.7647,2.7807,True,True,True +445,META,Meta,2025-12-11,positive,medium,medium,651.6202,663.8816,662.7226,645.5073,1.8817,1.7038,-0.9381,True,True,False +749,HSBA.L,HSBC,2025-12-09,positive,medium,short,1067.7206,1111.5092,1174.8925,1217.0814,4.1011,10.0374,13.9888,True,True,True +442,WBD,Warner Bros Discovery,2025-12-08,positive,high,short,27.23,29.71,28.75,28.53,9.1076,5.5821,4.7742,True,True,True +443,WBD,Warner Bros Discovery,2025-12-08,positive,medium,medium,27.23,29.71,28.75,28.53,9.1076,5.5821,4.7742,True,True,True +881,WBD,Warner Bros Discovery,2025-12-02,negative,medium,short,24.53,28.26,28.9,28.94,15.2059,17.8149,17.978,False,False,False +882,WBD,Warner Bros Discovery,2025-12-02,negative,low,short,24.53,28.26,28.9,28.94,15.2059,17.8149,17.978,False,False,False +736,META,Meta,2025-11-24,negative,medium,short,612.0264,639.8,665.6866,660.9341,4.538,8.7676,7.9911,False,False,False +737,META,Meta,2025-11-24,negative,medium,medium,612.0264,639.8,665.6866,660.9341,4.538,8.7676,7.9911,False,False,False +738,META,Meta,2025-11-24,positive,high,short,612.0264,639.8,665.6866,660.9341,4.538,8.7676,7.9911,True,True,True +458,BABA,Alibaba,2025-11-24,positive,medium,short,160.73,164.26,158.13,150.96,2.1962,-1.6176,-6.0785,True,False,False +459,BABA,Alibaba,2025-11-24,positive,medium,short,160.73,164.26,158.13,150.96,2.1962,-1.6176,-6.0785,True,False,False +734,META,Meta,2025-11-21,positive,medium,medium,593.2578,646.8682,672.2956,658.2065,9.0366,13.3227,10.9478,True,True,True +735,META,Meta,2025-11-20,positive,medium,medium,588.1664,646.8682,660.4255,663.8816,9.9805,12.2855,12.8731,True,True,True +1005,NET,Cloudflare,2025-11-20,negative,medium,short,191.39,200.21,204.15,193.83,4.6084,6.667,1.2749,False,False,False +731,NVDA,NVIDIA,2025-11-20,positive,high,short,180.6202,176.9806,183.3701,174.1306,-2.0151,1.5225,-3.593,False,True,False +732,NVDA,NVIDIA,2025-11-20,positive,medium,short,180.6202,176.9806,183.3701,174.1306,-2.0151,1.5225,-3.593,False,True,False +733,NVDA,NVIDIA,2025-11-20,positive,high,short,180.6202,176.9806,183.3701,174.1306,-2.0151,1.5225,-3.593,False,True,False +469,BLK,BlackRock,2025-11-19,negative,medium,short,1004.1746,1029.292,1068.6898,1059.1039,2.5013,6.4247,5.4701,False,False,False +467,META,Meta,2025-11-18,positive,medium,short,596.6921,635.1577,646.0195,656.5879,6.4465,8.2668,10.038,True,True,True +468,META,Meta,2025-11-18,positive,medium,short,596.6921,635.1577,646.0195,656.5879,6.4465,8.2668,10.038,True,True,True +465,9984.T,SoftBank,2025-11-18,positive,medium,medium,4698.4424,3842.1375,3912.0398,4129.2368,-18.2253,-16.7375,-12.1148,False,False,False +466,9984.T,SoftBank,2025-11-18,positive,low,long,4698.4424,3842.1375,3912.0398,4129.2368,-18.2253,-16.7375,-12.1148,False,False,False +461,BIDU,Baidu,2025-11-14,negative,medium,short,116.0,110.95,116.89,125.01,-4.3535,0.7672,7.7672,True,False,False +462,AMAT,Applied Materials,2025-11-14,negative,medium,short,225.2869,223.731,251.9358,258.8871,-0.6906,11.8289,14.9144,True,False,False +463,AMAT,Applied Materials,2025-11-14,positive,medium,long,225.2869,223.731,251.9358,258.8871,-0.6906,11.8289,14.9144,False,True,True +460,BA,Boeing,2025-11-13,positive,medium,short,194.58,179.38,189.0,200.71,-7.8117,-2.8677,3.1504,False,False,True +475,BLK,BlackRock,2025-11-11,positive,medium,medium,1074.5188,1008.5885,1019.1085,1065.379,-6.1358,-5.1568,-0.8506,False,False,False +477,BLK,BlackRock,2025-11-11,positive,medium,long,1074.5188,1008.5885,1019.1085,1065.379,-6.1358,-5.1568,-0.8506,False,False,False +478,UBS,UBS,2025-11-11,negative,medium,medium,37.9997,37.0736,36.6447,40.2516,-2.4371,-3.5659,5.9261,True,True,False +625,002594.SZ,BYD,2025-11-08,positive,high,medium,99.39,98.37,92.7,95.98,-1.0263,-6.7311,-3.4309,False,False,False +626,002594.SZ,BYD,2025-11-08,positive,medium,short,99.39,98.37,92.7,95.98,-1.0263,-6.7311,-3.4309,False,False,False +471,LLY,Eli Lilly,2025-11-06,positive,medium,medium,934.5056,1019.6682,1041.5516,1012.7996,9.1131,11.4548,8.3781,True,True,True +472,LLY,Eli Lilly,2025-11-06,positive,medium,medium,934.5056,1019.6682,1041.5516,1012.7996,9.1131,11.4548,8.3781,True,True,True +474,AIR.PA,Airbus,2025-11-06,negative,low,short,204.8645,206.4355,200.6916,193.4455,0.7668,-2.0369,-5.5739,False,True,True +813,DTE.DE,Deutsche Telekom,2025-11-01,positive,medium,medium,25.813,25.5224,26.3845,26.8881,-1.1257,2.2139,4.1651,False,True,True +815,DTE.DE,Deutsche Telekom,2025-11-01,positive,low,long,25.813,25.5224,26.3845,26.8881,-1.1257,2.2139,4.1651,False,True,True +1152,AMZN,Amazon,2025-10-31,positive,high,short,244.22,244.41,234.69,233.22,0.0778,-3.9022,-4.5041,True,False,False +1153,AMZN,Amazon,2025-10-31,positive,medium,medium,244.22,244.41,234.69,233.22,0.0778,-3.9022,-4.5041,True,False,False +806,META,Meta,2025-10-31,negative,medium,short,647.2675,620.6719,608.4424,646.8682,-4.1089,-5.9983,-0.0617,True,True,True +805,NFLX,Netflix,2025-10-30,positive,low,short,108.9,109.702,115.423,107.58,0.7365,5.9899,-1.2121,True,True,False +808,META,Meta,2025-10-30,negative,medium,short,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,True,True,True +809,META,Meta,2025-10-30,positive,high,long,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +810,META,Meta,2025-10-30,positive,medium,medium,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +800,RIVN,Rivian,2025-10-30,negative,medium,short,12.99,15.22,16.39,16.86,17.1671,26.174,29.7922,False,False,False +801,RIVN,Rivian,2025-10-30,negative,medium,medium,12.99,15.22,16.39,16.86,17.1671,26.174,29.7922,False,False,False +802,META,Meta,2025-10-30,negative,medium,short,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,True,True,True +803,META,Meta,2025-10-30,positive,high,long,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +804,META,Meta,2025-10-30,positive,medium,medium,665.3572,617.9066,608.8717,646.8682,-7.1316,-8.4895,-2.7788,False,False,False +818,RIVN,Rivian,2025-10-24,positive,medium,medium,12.98,13.57,15.23,14.86,4.5455,17.3344,14.4838,True,True,True +819,RIVN,Rivian,2025-10-24,positive,medium,long,12.98,13.57,15.23,14.86,4.5455,17.3344,14.4838,True,True,True +820,RIVN,Rivian,2025-10-24,negative,low,short,12.98,13.57,15.23,14.86,4.5455,17.3344,14.4838,False,False,False +816,META,Meta,2025-10-23,positive,medium,short,732.7745,665.3572,617.9066,588.1664,-9.2003,-15.6758,-19.7343,False,False,False +817,META,Meta,2025-10-23,positive,low,short,732.7745,665.3572,617.9066,588.1664,-9.2003,-15.6758,-19.7343,False,False,False +826,CRM,Salesforce,2025-10-19,positive,medium,medium,253.2369,253.7846,259.3417,242.6604,0.2163,2.4107,-4.1765,True,True,False +828,CRM,Salesforce,2025-10-19,positive,medium,medium,253.2369,253.7846,259.3417,242.6604,0.2163,2.4107,-4.1765,True,True,False +823,TSM,TSMC,2025-10-16,positive,high,short,298.1925,289.1325,301.5539,280.6494,-3.0383,1.1273,-5.8831,False,True,False +824,TSM,TSMC,2025-10-16,positive,high,short,298.1925,289.1325,301.5539,280.6494,-3.0383,1.1273,-5.8831,False,True,False +825,TSM,TSMC,2025-10-16,positive,medium,medium,298.1925,289.1325,301.5539,280.6494,-3.0383,1.1273,-5.8831,False,True,False +1304,META,Meta,2025-10-02,positive,medium,medium,725.8361,732.2853,710.8811,665.3572,0.8885,-2.0604,-8.3323,True,False,False +1305,META,Meta,2025-10-02,positive,medium,medium,725.8361,732.2853,710.8811,665.3572,0.8885,-2.0604,-8.3323,True,False,False +935,META,Meta,2025-10-01,positive,medium,short,716.1423,716.6415,716.3519,750.415,0.0697,0.0293,4.7857,True,True,True +937,META,Meta,2025-10-01,positive,medium,medium,716.1423,716.6415,716.3519,750.415,0.0697,0.0293,4.7857,True,True,True +1302,SPOT,Spotify,2025-09-27,positive,medium,medium,728.47,680.5,685.29,645.78,-6.585,-5.9275,-11.3512,False,False,False +1220,HSBA.L,HSBC,2025-09-25,positive,medium,medium,1024.8608,1043.2548,1008.2664,992.4716,1.7948,-1.6192,-3.1604,True,False,False +926,META,Meta,2025-09-18,positive,medium,medium,778.4218,747.6595,725.8361,710.8811,-3.9519,-6.7554,-8.6766,False,False,False +927,META,Meta,2025-09-18,positive,medium,short,778.4218,747.6595,725.8361,710.8811,-3.9519,-6.7554,-8.6766,False,False,False +929,AMZN,Amazon,2025-09-18,positive,medium,medium,231.23,218.15,222.41,214.47,-5.6567,-3.8144,-7.2482,False,False,False +930,AMZN,Amazon,2025-09-18,positive,low,short,231.23,218.15,222.41,214.47,-5.6567,-3.8144,-7.2482,False,False,False +931,AMZN,Amazon,2025-09-18,positive,medium,medium,231.23,218.15,222.41,214.47,-5.6567,-3.8144,-7.2482,False,False,False +1077,PLTR,Palantir,2025-09-18,positive,medium,short,176.97,179.12,187.05,178.12,1.2149,5.6959,0.6498,True,True,True +1078,PLTR,Palantir,2025-09-18,positive,medium,medium,176.97,179.12,187.05,178.12,1.2149,5.6959,0.6498,True,True,True +1079,PLTR,Palantir,2025-09-18,positive,high,short,176.97,179.12,187.05,178.12,1.2149,5.6959,0.6498,True,True,True +644,TSM,TSMC,2025-09-15,positive,medium,short,259.1263,271.132,271.7287,301.2257,4.6331,4.8634,16.2467,True,True,True +645,TSM,TSMC,2025-09-15,positive,low,medium,259.1263,271.132,271.7287,301.2257,4.6331,4.8634,16.2467,True,True,True +642,ORCL,Oracle,2025-09-13,positive,high,short,299.7744,306.2434,281.2406,291.1707,2.1579,-6.1826,-2.8701,True,False,False +643,ORCL,Oracle,2025-09-13,positive,medium,medium,299.7744,306.2434,281.2406,291.1707,2.1579,-6.1826,-2.8701,True,False,False +637,AZN,AstraZeneca,2025-09-13,negative,medium,short,154.4894,150.9859,145.9979,167.3157,-2.2678,-5.4965,8.3024,True,True,False +638,AZN,AstraZeneca,2025-09-13,negative,medium,medium,154.4894,150.9859,145.9979,167.3157,-2.2678,-5.4965,8.3024,True,True,False +628,ORCL,Oracle,2025-09-12,positive,medium,short,289.8924,306.2434,281.2406,291.1707,5.6404,-2.9845,0.441,True,False,True +632,000660.KS,SK Hynix,2025-09-12,positive,high,short,327660.3125,350102.75,335639.8438,426905.9375,6.8493,2.4353,30.2892,True,True,True +633,000660.KS,SK Hynix,2025-09-12,positive,medium,short,327660.3125,350102.75,335639.8438,426905.9375,6.8493,2.4353,30.2892,True,True,True +634,000660.KS,SK Hynix,2025-09-12,positive,high,medium,327660.3125,350102.75,335639.8438,426905.9375,6.8493,2.4353,30.2892,True,True,True +988,AAPL,Apple,2025-09-12,positive,medium,short,233.6247,245.033,254.974,244.8034,4.8831,9.1383,4.7849,True,True,True +629,000660.KS,SK Hynix,2025-09-12,positive,high,short,327660.3125,350102.75,335639.8438,426905.9375,6.8493,2.4353,30.2892,True,True,True +630,000660.KS,SK Hynix,2025-09-12,positive,medium,medium,327660.3125,350102.75,335639.8438,426905.9375,6.8493,2.4353,30.2892,True,True,True +627,ORCL,Oracle,2025-09-11,negative,medium,short,305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,True,True,True +1409,ORCL,Oracle,2025-09-11,positive,high,short,305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,False,False,False +1410,ORCL,Oracle,2025-09-11,positive,medium,medium,305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,False,False,False +1411,ORCL,Oracle,2025-09-11,positive,high,medium,305.4496,294.2976,289.049,295.1463,-3.651,-5.3693,-3.3732,False,False,False +611,INTC,Intel,2025-08-28,positive,medium,short,24.93,24.61,24.61,33.99,-1.2836,-1.2836,36.3418,False,False,True +612,INTC,Intel,2025-08-28,positive,medium,medium,24.93,24.61,24.61,33.99,-1.2836,-1.2836,36.3418,False,False,True +608,NVDA,NVIDIA,2025-08-28,positive,high,short,180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +610,NVDA,NVIDIA,2025-08-28,positive,high,short,180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1296,CRWD,CrowdStrike,2025-08-28,negative,medium,short,442.0,412.46,433.38,473.09,-6.6833,-1.9502,7.0339,True,True,False +1297,CRWD,CrowdStrike,2025-08-28,negative,medium,medium,442.0,412.46,433.38,473.09,-6.6833,-1.9502,7.0339,True,True,False +1412,NVDA,NVIDIA,2025-08-28,positive,medium,short,180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1413,NVDA,NVIDIA,2025-08-28,positive,high,medium,180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1414,NVDA,NVIDIA,2025-08-28,positive,high,medium,180.1401,171.6315,177.1506,177.6705,-4.7233,-1.6595,-1.3709,False,False,False +1074,RHM.DE,Rheinmetall,2025-08-27,positive,medium,medium,1635.5,1754.0,1779.0,1978.5,7.2455,8.7741,20.9722,True,True,True +1075,RHM.DE,Rheinmetall,2025-08-27,positive,high,medium,1635.5,1754.0,1779.0,1978.5,7.2455,8.7741,20.9722,True,True,True +1076,RHM.DE,Rheinmetall,2025-08-27,positive,medium,short,1635.5,1754.0,1779.0,1978.5,7.2455,8.7741,20.9722,True,True,True +1284,NVDA,NVIDIA,2025-08-22,negative,medium,short,177.9604,174.151,166.9923,176.6506,-2.1406,-6.1633,-0.736,True,True,True +1285,NVDA,NVIDIA,2025-08-22,negative,low,short,177.9604,174.151,166.9923,176.6506,-2.1406,-6.1633,-0.736,True,True,True +1286,NVDA,NVIDIA,2025-08-22,negative,medium,short,177.9604,174.151,166.9923,176.6506,-2.1406,-6.1633,-0.736,True,True,True +1149,005930.KS,Samsung,2025-08-22,positive,medium,short,70738.9844,69054.7188,68856.5781,82726.9609,-2.381,-2.6611,16.9468,False,False,True +1150,005930.KS,Samsung,2025-08-21,positive,medium,short,69946.3906,68955.6484,69451.0234,79556.5859,-1.4164,-0.7082,13.7394,False,False,True +1151,000660.KS,SK Hynix,2025-08-21,negative,low,short,244021.2812,267813.6562,264821.3438,354591.2812,9.7501,8.5239,45.3116,False,False,False +844,AMZN,Amazon,2025-08-14,positive,medium,medium,230.98,221.95,231.6,229.95,-3.9094,0.2684,-0.4459,False,True,False +845,AMZN,Amazon,2025-08-14,positive,medium,short,230.98,221.95,231.6,229.95,-3.9094,0.2684,-0.4459,False,True,False +846,AMZN,Amazon,2025-08-14,positive,low,short,230.98,221.95,231.6,229.95,-3.9094,0.2684,-0.4459,False,True,False +855,PLTR,Palantir,2025-08-10,positive,medium,short,182.68,177.17,158.74,153.11,-3.0162,-13.1049,-16.1868,False,False,False +856,PLTR,Palantir,2025-08-10,negative,high,long,182.68,177.17,158.74,153.11,-3.0162,-13.1049,-16.1868,True,True,True +857,PLTR,Palantir,2025-08-10,positive,medium,medium,182.68,177.17,158.74,153.11,-3.0162,-13.1049,-16.1868,False,False,False +919,688981.SS,SMIC,2025-08-08,positive,medium,short,86.66,91.84,103.97,114.76,5.9774,19.9746,32.4256,True,True,True +920,688981.SS,SMIC,2025-08-08,positive,medium,short,86.66,91.84,103.97,114.76,5.9774,19.9746,32.4256,True,True,True +1208,INTC,Intel,2025-08-08,negative,medium,short,19.95,24.56,24.8,24.49,23.1078,24.3108,22.7569,False,False,False +1209,INTC,Intel,2025-08-08,negative,low,short,19.95,24.56,24.8,24.49,23.1078,24.3108,22.7569,False,False,False +1210,META,Meta,2025-08-08,positive,high,medium,767.4975,783.3901,753.0215,750.6871,2.0707,-1.8861,-2.1903,True,False,False +1289,TSM,TSMC,2025-08-08,negative,medium,short,239.7449,236.8203,230.9811,241.3113,-1.2199,-3.6555,0.6534,True,True,False +1290,TSM,TSMC,2025-08-08,negative,low,short,239.7449,236.8203,230.9811,241.3113,-1.2199,-3.6555,0.6534,True,True,False +1218,META,Meta,2025-08-08,positive,high,long,767.4975,783.3901,753.0215,750.6871,2.0707,-1.8861,-2.1903,True,False,False +1511,SPOT,Spotify,2025-08-07,positive,medium,short,686.74,698.5,689.47,703.85,1.7124,0.3975,2.4915,True,True,True +1513,SPOT,Spotify,2025-08-07,positive,medium,medium,686.74,698.5,689.47,703.85,1.7124,0.3975,2.4915,True,True,True +851,PLTR,Palantir,2025-08-07,negative,medium,medium,182.2,181.02,156.18,156.14,-0.6476,-14.281,-14.303,True,True,True +852,PLTR,Palantir,2025-08-07,positive,medium,long,182.2,181.02,156.18,156.14,-0.6476,-14.281,-14.303,False,False,False +1288,TSM,TSMC,2025-08-07,negative,medium,short,240.5281,238.922,225.3699,233.182,-0.6677,-6.302,-3.0542,True,True,True +1212,005930.KS,Samsung,2025-08-07,positive,medium,short,69847.3125,70937.1328,69946.3906,69451.0234,1.5603,0.1418,-0.5674,True,True,False +1213,005930.KS,Samsung,2025-08-07,positive,medium,medium,69847.3125,70937.1328,69946.3906,69451.0234,1.5603,0.1418,-0.5674,True,True,False +1214,000660.KS,SK Hynix,2025-08-07,positive,medium,short,260953.3594,275395.4375,244021.2812,264821.3438,5.5344,-6.4885,1.4823,True,False,True +1509,TSM,TSMC,2025-08-07,positive,medium,short,240.5281,238.922,225.3699,233.182,-0.6677,-6.302,-3.0542,False,False,False +1510,TSM,TSMC,2025-08-07,positive,low,short,240.5281,238.922,225.3699,233.182,-0.6677,-6.302,-3.0542,False,False,False +1216,000660.KS,SK Hynix,2025-08-07,positive,medium,short,260953.3594,275395.4375,244021.2812,264821.3438,5.5344,-6.4885,1.4823,True,False,True +873,PLTR,Palantir,2025-08-05,positive,high,short,173.27,186.97,157.75,157.09,7.9067,-8.9571,-9.338,True,False,False +874,PLTR,Palantir,2025-08-05,positive,medium,medium,173.27,186.97,157.75,157.09,7.9067,-8.9571,-9.338,True,False,False +875,PLTR,Palantir,2025-08-05,positive,medium,short,173.27,186.97,157.75,157.09,7.9067,-8.9571,-9.338,True,False,False +1463,META,Meta,2025-08-01,positive,high,short,748.2527,767.4975,783.3901,736.9692,2.572,4.6959,-1.508,True,True,False +1307,MSFT,Microsoft,2025-08-01,positive,high,short,521.0829,519.025,517.1657,504.5917,-0.3949,-0.7517,-3.1648,False,False,False +1308,MSFT,Microsoft,2025-08-01,positive,medium,medium,521.0829,519.025,517.1657,504.5917,-0.3949,-0.7517,-3.1648,False,False,False +1309,MSFT,Microsoft,2025-08-01,positive,high,long,521.0829,519.025,517.1657,504.5917,-0.3949,-0.7517,-3.1648,False,False,False +1400,ARM,Arm Holdings,2025-07-31,negative,high,short,141.375,135.57,140.55,142.55,-4.1061,-0.5836,0.8311,True,True,False +1401,ARM,Arm Holdings,2025-07-31,negative,medium,medium,141.375,135.57,140.55,142.55,-4.1061,-0.5836,0.8311,True,True,False +1402,ARM,Arm Holdings,2025-07-31,negative,low,long,141.375,135.57,140.55,142.55,-4.1061,-0.5836,0.8311,True,True,False +1380,005930.KS,Samsung,2025-07-31,negative,low,short,70738.9844,69847.3125,70937.1328,68955.6484,-1.2605,0.2801,-2.521,True,False,True +1382,000660.KS,SK Hynix,2025-07-31,positive,medium,short,272407.4062,260953.3594,275395.4375,267813.6562,-4.2047,1.0969,-1.6864,False,True,False +870,META,Meta,2025-07-31,positive,high,short,771.6278,760.045,780.2974,749.3501,-1.5011,1.1235,-2.8871,False,True,False +871,META,Meta,2025-07-31,positive,medium,medium,771.6278,760.045,780.2974,749.3501,-1.5011,1.1235,-2.8871,False,True,False +872,META,Meta,2025-07-31,positive,medium,medium,771.6278,760.045,780.2974,749.3501,-1.5011,1.1235,-2.8871,False,True,False +1221,META,Meta,2025-07-31,positive,high,short,771.6278,760.045,780.2974,749.3501,-1.5011,1.1235,-2.8871,False,True,False +1222,META,Meta,2025-07-31,positive,medium,medium,771.6278,760.045,780.2974,749.3501,-1.5011,1.1235,-2.8871,False,True,False +1223,META,Meta,2025-07-31,positive,medium,medium,771.6278,760.045,780.2974,749.3501,-1.5011,1.1235,-2.8871,False,True,False +1279,UBS,UBS,2025-07-30,negative,medium,medium,36.9761,37.0834,38.6529,39.15,0.29,4.5347,5.8793,False,False,False +1390,005930.KS,Samsung,2025-07-28,positive,medium,short,69748.2422,69054.7188,70342.6875,70838.0625,-0.9943,0.8523,1.5625,False,True,True +1391,005930.KS,Samsung,2025-07-28,positive,medium,short,69748.2422,69054.7188,70342.6875,70838.0625,-0.9943,0.8523,1.5625,False,True,True +960,005930.KS,Samsung,2025-07-27,positive,medium,short,69748.2422,68262.125,71135.2812,70738.9844,-2.1307,1.9886,1.4205,False,True,True +961,005930.KS,Samsung,2025-07-27,positive,low,medium,69748.2422,68262.125,71135.2812,70738.9844,-2.1307,1.9886,1.4205,False,True,True +962,000660.KS,SK Hynix,2025-07-27,negative,medium,short,260953.3594,256969.3438,255475.3438,249997.2969,-1.5267,-2.0992,-4.1985,True,True,True +893,META,Meta,2025-07-26,positive,high,medium,715.9486,748.2527,767.4975,753.0215,4.5121,7.2001,5.1781,True,True,True +894,META,Meta,2025-07-26,positive,medium,long,715.9486,748.2527,767.4975,753.0215,4.5121,7.2001,5.1781,True,True,True +1387,000660.KS,SK Hynix,2025-07-24,positive,high,short,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1388,000660.KS,SK Hynix,2025-07-24,positive,medium,medium,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1389,000660.KS,SK Hynix,2025-07-24,positive,high,medium,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1558,VZ,Verizon,2025-07-24,negative,low,short,41.0128,40.7082,40.8891,42.8693,-0.7428,-0.3018,4.5265,True,True,False +1559,VZ,Verizon,2025-07-24,negative,medium,short,41.0128,40.7082,40.8891,42.8693,-0.7428,-0.3018,4.5265,True,True,False +1403,000660.KS,SK Hynix,2025-07-24,positive,medium,short,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1404,000660.KS,SK Hynix,2025-07-24,positive,medium,medium,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1405,000660.KS,SK Hynix,2025-07-24,positive,medium,medium,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1384,000660.KS,SK Hynix,2025-07-24,positive,high,short,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1385,000660.KS,SK Hynix,2025-07-24,positive,medium,medium,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +1386,000660.KS,SK Hynix,2025-07-24,positive,medium,medium,268423.375,272407.4062,260953.3594,244021.2812,1.4842,-2.7829,-9.0909,True,False,False +799,META,Meta,2025-07-17,negative,medium,short,699.7665,713.1252,771.6278,780.2974,1.909,10.2693,11.5083,False,False,False +1109,NVDA,NVIDIA,2025-07-10,positive,high,short,164.0727,172.9713,173.7111,180.74,5.4235,5.8745,10.1584,True,True,True +1110,NVDA,NVIDIA,2025-07-10,positive,medium,medium,164.0727,172.9713,173.7111,180.74,5.4235,5.8745,10.1584,True,True,True +1111,NVDA,NVIDIA,2025-07-10,positive,high,long,164.0727,172.9713,173.7111,180.74,5.4235,5.8745,10.1584,True,True,True +998,NVDA,NVIDIA,2025-07-03,positive,high,short,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +999,NVDA,NVIDIA,2025-07-03,positive,high,short,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1000,NVDA,NVIDIA,2025-07-03,positive,high,short,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1406,NVDA,NVIDIA,2025-07-03,positive,high,medium,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1407,NVDA,NVIDIA,2025-07-03,positive,high,short,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1408,NVDA,NVIDIA,2025-07-03,positive,high,medium,159.3135,164.0727,172.9713,177.8404,2.9873,8.5729,11.6292,True,True,True +1082,MU,Micron,2025-07-03,positive,medium,medium,121.998,122.9316,113.0959,108.9819,0.7653,-7.2969,-10.6691,True,False,False +1083,MU,Micron,2025-07-03,positive,medium,medium,121.998,122.9316,113.0959,108.9819,0.7653,-7.2969,-10.6691,True,False,False +1084,MU,Micron,2025-07-03,positive,low,long,121.998,122.9316,113.0959,108.9819,0.7653,-7.2969,-10.6691,True,False,False +1506,BP,BP,2025-07-02,positive,medium,short,30.038,30.0093,30.633,30.9497,-0.0958,1.9808,3.0351,False,True,True +1507,BP,BP,2025-07-02,negative,medium,medium,30.038,30.0093,30.633,30.9497,-0.0958,1.9808,3.0351,True,False,False +902,META,Meta,2025-06-13,positive,high,medium,680.7462,680.7512,731.9111,715.8289,0.0007,7.516,5.1536,True,True,True +903,META,Meta,2025-06-13,positive,medium,short,680.7462,680.7512,731.9111,715.8289,0.0007,7.516,5.1536,True,True,True +1476,NVS,Novartis,2025-06-13,positive,medium,short,115.9217,112.3504,116.4652,117.4453,-3.0808,0.4688,1.3144,False,True,True +1477,NVS,Novartis,2025-06-13,positive,low,short,115.9217,112.3504,116.4652,117.4453,-3.0808,0.4688,1.3144,False,True,True +1085,AMD,AMD,2025-06-13,positive,high,medium,116.16,128.24,143.81,146.42,10.3995,23.8034,26.0503,True,True,True +1086,AMD,AMD,2025-06-13,positive,medium,long,116.16,128.24,143.81,146.42,10.3995,23.8034,26.0503,True,True,True +906,WBD,Warner Bros Discovery,2025-06-10,positive,medium,long,10.01,10.58,10.9,11.41,5.6943,8.8911,13.986,True,True,True +907,WBD,Warner Bros Discovery,2025-06-10,positive,medium,medium,10.01,10.58,10.9,11.41,5.6943,8.8911,13.986,True,True,True +1395,UBS,UBS,2025-06-08,positive,medium,short,32.1019,31.1758,29.655,33.3107,-2.8849,-7.6222,3.7656,False,False,True +1396,UBS,UBS,2025-06-08,negative,medium,long,32.1019,31.1758,29.655,33.3107,-2.8849,-7.6222,3.7656,True,True,False +1397,UBS,UBS,2025-06-08,positive,high,medium,32.1019,31.1758,29.655,33.3107,-2.8849,-7.6222,3.7656,False,False,True +1556,UBS,UBS,2025-06-06,negative,medium,short,32.7745,31.1758,29.655,33.3107,-4.878,-9.5181,1.6359,True,True,False +1557,UBS,UBS,2025-06-06,negative,low,short,32.7745,31.1758,29.655,33.3107,-4.878,-9.5181,1.6359,True,True,False +1393,AVGO,Broadcom,2025-06-06,negative,medium,short,244.9453,246.7011,248.5644,272.6164,0.7168,1.4775,11.2969,False,False,False +913,META,Meta,2025-06-04,positive,medium,long,685.8104,691.9812,694.1398,711.8981,0.8998,1.2145,3.8039,True,True,True +914,META,Meta,2025-06-04,positive,high,long,685.8104,691.9812,694.1398,711.8981,0.8998,1.2145,3.8039,True,True,True +1106,AVGO,Broadcom,2025-06-02,negative,medium,short,246.711,242.3166,250.0738,274.078,-1.7812,1.363,11.0927,True,False,False +1107,AVGO,Broadcom,2025-06-02,negative,medium,medium,246.711,242.3166,250.0738,274.078,-1.7812,1.363,11.0927,True,False,False +1196,NVDA,NVIDIA,2025-05-29,positive,high,short,139.1572,139.957,144.9759,154.9942,0.5747,4.1814,11.3807,True,True,True +1197,NVDA,NVIDIA,2025-05-29,positive,medium,medium,139.1572,139.957,144.9759,154.9942,0.5747,4.1814,11.3807,True,True,True +1198,NVDA,NVIDIA,2025-05-29,positive,medium,short,139.1572,139.957,144.9759,154.9942,0.5747,4.1814,11.3807,True,True,True +1203,LHX,L3Harris Technologies,2025-05-29,positive,medium,short,239.3204,239.1635,247.3939,243.8468,-0.0655,3.3735,1.8914,False,True,True +1503,META,Meta,2025-05-29,positive,medium,medium,643.0439,682.4907,691.2036,724.3889,6.1344,7.4893,12.65,True,True,True +1504,META,Meta,2025-05-29,positive,low,short,643.0439,682.4907,691.2036,724.3889,6.1344,7.4893,12.65,True,True,True +1271,NVS,Novartis,2025-05-29,positive,medium,short,109.2546,114.3108,117.2027,116.766,4.6278,7.2748,6.8751,True,True,True +1272,NVS,Novartis,2025-05-29,positive,low,short,109.2546,114.3108,117.2027,116.766,4.6278,7.2748,6.8751,True,True,True +1273,META,Meta,2025-05-29,positive,medium,medium,643.0439,682.4907,691.2036,724.3889,6.1344,7.4893,12.65,True,True,True +1274,META,Meta,2025-05-29,positive,high,medium,643.0439,682.4907,691.2036,724.3889,6.1344,7.4893,12.65,True,True,True +1199,META,Meta,2025-05-25,positive,medium,medium,640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,True,True,True +1200,META,Meta,2025-05-25,negative,high,short,640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,False,False,False +1201,META,Meta,2025-05-25,negative,medium,short,640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,False,False,False +1202,META,Meta,2025-05-25,negative,low,short,640.3224,645.4763,695.5401,680.7512,0.8049,8.6234,6.3138,False,False,False +1259,TSLA,Tesla,2025-05-23,negative,medium,short,339.34,346.46,295.14,322.16,2.0982,-13.0253,-5.0628,False,True,True +1260,TSLA,Tesla,2025-05-23,negative,medium,short,339.34,346.46,295.14,322.16,2.0982,-13.0253,-5.0628,False,True,True +1261,TSLA,Tesla,2025-05-23,negative,low,short,339.34,346.46,295.14,322.16,2.0982,-13.0253,-5.0628,False,True,True +1464,SHOP,Shopify,2025-05-23,positive,medium,short,101.51,107.22,111.41,106.4,5.6251,9.7527,4.8173,True,True,True +1276,002594.SZ,BYD,2025-05-22,positive,high,short,131.3658,118.9572,118.832,112.1616,-9.4458,-9.5411,-14.6189,False,False,False +1277,002594.SZ,BYD,2025-05-22,positive,high,medium,131.3658,118.9572,118.832,112.1616,-9.4458,-9.5411,-14.6189,False,False,False +1262,HSBA.L,HSBC,2025-05-21,negative,medium,short,884.2393,865.0471,872.2441,874.3433,-2.1705,-1.3565,-1.1191,True,True,True +1189,WBD,Warner Bros Discovery,2025-05-14,positive,medium,medium,9.21,8.95,10.02,10.51,-2.823,8.7948,14.1151,False,True,True +1282,META,Meta,2025-05-08,negative,medium,short,596.1502,641.8775,634.5902,682.4907,7.6704,6.448,14.483,False,False,False +1283,META,Meta,2025-05-08,negative,low,short,596.1502,641.8775,634.5902,682.4907,7.6704,6.448,14.483,False,False,False +1473,V,Visa,2025-05-08,positive,high,long,348.6606,360.2059,355.9009,364.6501,3.3113,2.0766,4.586,True,True,True +1474,V,Visa,2025-05-08,positive,medium,medium,348.6606,360.2059,355.9009,364.6501,3.3113,2.0766,4.586,True,True,True +1475,V,Visa,2025-05-08,positive,low,short,348.6606,360.2059,355.9009,364.6501,3.3113,2.0766,4.586,True,True,True +1263,SHEL,Shell,2025-05-06,positive,medium,short,62.5873,65.0004,64.7364,65.9122,3.8556,3.4338,5.3125,True,True,True +1265,BP,BP,2025-05-06,positive,high,short,26.8205,28.8603,28.0227,28.3682,7.6056,4.4825,5.7707,True,True,True +1029,RIVN,Rivian,2025-05-06,negative,medium,short,13.5,14.87,16.92,14.37,10.1481,25.3333,6.4444,False,False,False +1030,RIVN,Rivian,2025-05-06,negative,medium,short,13.5,14.87,16.92,14.37,10.1481,25.3333,6.4444,False,False,False +1031,RIVN,Rivian,2025-05-06,negative,medium,short,13.5,14.87,16.92,14.37,10.1481,25.3333,6.4444,False,False,False +1021,SPOT,Spotify,2025-05-04,positive,medium,medium,637.65,648.25,656.3,665.14,1.6624,2.9248,4.3111,True,True,True +1022,SPOT,Spotify,2025-05-04,positive,low,long,637.65,648.25,656.3,665.14,1.6624,2.9248,4.3111,True,True,True +1067,AMZN,Amazon,2025-05-02,positive,medium,short,189.98,193.06,205.59,205.01,1.6212,8.2167,7.9114,True,True,True +1068,AMZN,Amazon,2025-05-02,positive,medium,short,189.98,193.06,205.59,205.01,1.6212,8.2167,7.9114,True,True,True +1375,META,Meta,2025-05-02,positive,medium,medium,595.1633,590.6473,638.3486,645.4763,-0.7588,7.256,8.4536,False,True,True +1376,META,Meta,2025-05-02,positive,medium,medium,595.1633,590.6473,638.3486,645.4763,-0.7588,7.256,8.4536,False,True,True +1204,AIR.PA,Airbus,2025-05-02,positive,medium,short,152.1486,155.5655,157.3328,159.1395,2.2457,3.4073,4.5947,True,True,True +1037,META,Meta,2025-04-29,positive,medium,short,552.7157,585.4834,653.9897,640.3223,5.9285,18.323,15.8502,True,True,True +1038,META,Meta,2025-04-29,positive,low,medium,552.7157,585.4834,653.9897,640.3223,5.9285,18.323,15.8502,True,True,True +1039,PL,Planet Labs,2025-04-29,negative,medium,medium,3.43,3.5,3.78,3.97,2.0408,10.2041,15.7434,False,False,False +1291,META,Meta,2025-04-26,negative,medium,short,548.0302,595.1633,590.6473,625.1097,8.6004,7.7764,14.0648,False,False,False +1292,META,Meta,2025-04-26,negative,medium,medium,548.0302,595.1633,590.6473,625.1097,8.6004,7.7764,14.0648,False,False,False +1293,META,Meta,2025-04-26,positive,high,short,548.0302,595.1633,590.6473,625.1097,8.6004,7.7764,14.0648,True,True,True +1362,GOOGL,Alphabet,2025-04-24,positive,medium,short,158.7296,160.7426,153.7469,170.2796,1.2682,-3.1391,7.2765,True,False,True +1047,NFLX,Netflix,2025-04-23,positive,medium,long,104.959,113.172,115.541,119.463,7.825,10.082,13.8187,True,True,True +1048,NFLX,Netflix,2025-04-23,positive,medium,long,104.959,113.172,115.541,119.463,7.825,10.082,13.8187,True,True,True +1052,META,Meta,2025-04-23,positive,medium,medium,518.652,547.2926,594.9539,633.5236,5.5221,14.7116,22.1481,True,True,True +1053,META,Meta,2025-04-23,positive,high,short,518.652,547.2926,594.9539,633.5236,5.5221,14.7116,22.1481,True,True,True +1054,META,Meta,2025-04-23,positive,medium,medium,518.652,547.2926,594.9539,633.5236,5.5221,14.7116,22.1481,True,True,True +1045,META,Meta,2025-04-20,negative,medium,long,483.1527,545.568,595.1633,638.3486,12.9183,23.1833,32.1215,False,False,False +1046,META,Meta,2025-04-20,negative,medium,long,483.1527,545.568,595.1633,638.3486,12.9183,23.1833,32.1215,False,False,False +1040,META,Meta,2025-04-17,negative,medium,short,499.9204,531.4919,570.4304,641.8775,6.3153,14.1043,28.3959,False,False,False +1041,META,Meta,2025-04-17,negative,medium,short,499.9204,531.4919,570.4304,641.8775,6.3153,14.1043,28.3959,False,False,False +1058,RIVN,Rivian,2025-04-16,positive,medium,medium,11.49,11.8,13.66,14.82,2.698,18.886,28.9817,True,True,True +1059,RIVN,Rivian,2025-04-16,positive,medium,medium,11.49,11.8,13.66,14.82,2.698,18.886,28.9817,True,True,True +1460,NFLX,Netflix,2025-04-15,positive,high,long,97.628,104.034,112.564,113.844,6.5616,15.2989,16.61,True,True,True +1461,NFLX,Netflix,2025-04-15,positive,high,long,97.628,104.034,112.564,113.844,6.5616,15.2989,16.61,True,True,True +1462,NFLX,Netflix,2025-04-15,positive,medium,long,97.628,104.034,112.564,113.844,6.5616,15.2989,16.61,True,True,True +1207,NVS,Novartis,2025-04-11,positive,medium,short,104.3441,107.2749,108.8276,105.4892,2.8088,4.2969,1.0975,True,True,True +1108,SHOP,Shopify,2025-04-10,negative,medium,short,84.63,83.65,95.12,94.0,-1.158,12.3951,11.0717,True,False,False +1478,META,Meta,2025-04-10,negative,medium,short,544.591,499.9204,531.4919,596.1502,-8.2026,-2.4053,9.4675,True,True,False +1479,META,Meta,2025-04-10,negative,medium,medium,544.591,499.9204,531.4919,596.1502,-8.2026,-2.4053,9.4675,True,True,False +1480,META,Meta,2025-04-10,positive,high,short,544.591,499.9204,531.4919,596.1502,-8.2026,-2.4053,9.4675,False,False,True +1373,META,Meta,2025-04-10,negative,medium,short,544.591,499.9204,531.4919,596.1502,-8.2026,-2.4053,9.4675,True,True,False +1374,META,Meta,2025-04-10,negative,medium,medium,544.591,499.9204,531.4919,596.1502,-8.2026,-2.4053,9.4675,True,True,False +1175,ORCL,Oracle,2025-03-31,negative,medium,short,137.9258,125.4463,133.3026,138.748,-9.048,-3.3519,0.5961,True,True,False +1176,ORCL,Oracle,2025-03-31,negative,medium,medium,137.9258,125.4463,133.3026,138.748,-9.048,-3.3519,0.5961,True,True,False +1490,1810.HK,Xiaomi,2025-03-28,positive,high,short,51.05,36.45,44.25,47.7,-28.5994,-13.3203,-6.5622,False,False,False +1491,1810.HK,Xiaomi,2025-03-28,positive,high,medium,51.05,36.45,44.25,47.7,-28.5994,-13.3203,-6.5622,False,False,False +1492,1810.HK,Xiaomi,2025-03-28,positive,medium,short,51.05,36.45,44.25,47.7,-28.5994,-13.3203,-6.5622,False,False,False +1481,TSLA,Tesla,2025-03-27,positive,medium,short,273.13,267.28,252.4,259.51,-2.1418,-7.5898,-4.9866,False,False,False +1482,TSLA,Tesla,2025-03-27,positive,low,medium,273.13,267.28,252.4,259.51,-2.1418,-7.5898,-4.9866,False,False,False +1554,RIVN,Rivian,2025-03-26,positive,medium,medium,12.1,12.49,11.77,11.8,3.2231,-2.7273,-2.4793,True,False,False +1494,TSM,TSMC,2025-03-25,negative,medium,medium,178.6869,166.5769,139.6405,149.5478,-6.7772,-21.8519,-16.3073,True,True,True +1181,META,Meta,2025-03-24,negative,medium,short,616.9253,574.5675,514.6444,483.1527,-6.866,-16.5791,-21.6838,True,True,True +1182,META,Meta,2025-03-24,negative,low,medium,616.9253,574.5675,514.6444,483.1527,-6.866,-16.5791,-21.6838,True,True,True +1183,FTNT,Fortinet,2025-03-17,negative,medium,short,96.67,99.79,96.26,96.85,3.2275,-0.4241,0.1862,False,True,False +1184,FTNT,Fortinet,2025-03-17,negative,medium,medium,96.67,99.79,96.26,96.85,3.2275,-0.4241,0.1862,False,True,False +1140,VOW.DE,Volkswagen,2025-03-14,negative,low,short,103.0161,97.3817,93.2029,82.3096,-5.4695,-9.526,-20.1003,True,True,True +1138,VOW.DE,Volkswagen,2025-03-13,negative,low,short,103.204,98.8842,95.7853,82.7792,-4.1856,-7.1884,-19.7907,True,True,True +1141,VOW.DE,Volkswagen,2025-03-06,positive,medium,short,105.2699,103.204,98.8842,86.6763,-1.9625,-6.066,-17.6628,False,False,False +1359,RIVN,Rivian,2025-03-05,positive,high,long,11.42,11.06,11.36,12.49,-3.1524,-0.5254,9.3695,False,False,True +1360,RIVN,Rivian,2025-03-05,positive,medium,short,11.42,11.06,11.36,12.49,-3.1524,-0.5254,9.3695,False,False,True +1354,META,Meta,2025-03-05,positive,medium,medium,653.8466,617.0841,582.2436,582.1139,-5.6225,-10.951,-10.9709,False,False,False +1355,META,Meta,2025-03-05,positive,low,medium,653.8466,617.0841,582.2436,582.1139,-5.6225,-10.951,-10.9709,False,False,False +1560,BLK,BlackRock,2025-03-02,positive,medium,short,941.8131,927.7991,909.9471,927.5837,-1.488,-3.3835,-1.5109,False,False,False +1562,BLK,BlackRock,2025-03-02,positive,medium,short,941.8131,927.7991,909.9471,927.5837,-1.488,-3.3835,-1.5109,False,False,False +1350,META,Meta,2025-02-27,positive,low,short,655.6095,625.4207,588.2797,600.7059,-4.6047,-10.2698,-8.3744,False,False,False +1351,META,Meta,2025-02-27,negative,medium,short,655.6095,625.4207,588.2797,600.7059,-4.6047,-10.2698,-8.3744,True,True,True +1142,SAP,SAP,2025-02-27,negative,low,short,272.1395,276.837,252.9034,265.7473,1.7261,-7.0685,-2.3489,False,True,True +1266,VOW.DE,Volkswagen,2025-02-20,positive,low,short,95.128,100.6685,105.2699,98.8842,5.8243,10.6614,3.9487,True,True,True +1269,RHM.DE,Rheinmetall,2025-02-13,positive,medium,short,753.1879,885.1202,995.9592,1281.5139,17.5165,32.2325,70.1453,True,True,True +1114,PLTR,Palantir,2025-02-08,positive,high,short,116.65,119.16,101.35,84.91,2.1517,-13.1162,-27.2096,True,False,False +1065,AMD,AMD,2025-02-04,positive,medium,medium,119.5,111.1,114.28,100.75,-7.0293,-4.3682,-15.6904,False,False,False +1066,AMD,AMD,2025-02-04,positive,medium,short,119.5,111.1,114.28,100.75,-7.0293,-4.3682,-15.6904,False,False,False +1125,NVDA,NVIDIA,2025-01-30,negative,medium,short,124.6092,128.6379,135.2457,120.1107,3.2331,8.5359,-3.6101,False,False,True +1244,NVDA,NVIDIA,2025-01-30,positive,medium,short,124.6092,128.6379,135.2457,120.1107,3.2331,8.5359,-3.6101,True,True,False +1249,000660.KS,SK Hynix,2025-01-24,negative,medium,short,218308.9062,196774.3594,200528.0938,206948.9375,-9.8643,-8.1448,-5.2036,True,True,True +1250,000660.KS,SK Hynix,2025-01-24,positive,medium,medium,218308.9062,196774.3594,200528.0938,206948.9375,-9.8643,-8.1448,-5.2036,False,False,False +1243,MS,Morgan Stanley,2025-01-24,positive,medium,short,133.331,134.8122,136.3217,128.2484,1.1109,2.2431,-3.812,True,True,False +1465,VOW.DE,Volkswagen,2025-01-23,negative,medium,short,92.3107,94.5645,92.6864,95.128,2.4415,0.4069,3.0519,False,False,False +1248,STX,Seagate,2025-01-23,positive,medium,short,106.1709,96.2413,94.5374,100.5108,-9.3525,-10.9574,-5.3311,False,False,False +1130,META,Meta,2025-01-21,positive,low,short,613.9965,671.6353,701.3759,713.5073,9.3875,14.2313,16.2071,True,True,True +1466,TSM,TSMC,2025-01-16,positive,high,short,211.3389,221.0109,204.8055,198.5871,4.5765,-3.0914,-6.0338,True,False,False +1467,TSM,TSMC,2025-01-16,positive,medium,medium,211.3389,221.0109,204.8055,198.5871,4.5765,-3.0914,-6.0338,True,False,False +1468,TSM,TSMC,2025-01-16,negative,medium,medium,211.3389,221.0109,204.8055,198.5871,4.5765,-3.0914,-6.0338,False,True,True +1312,META,Meta,2025-01-10,negative,high,short,613.3988,610.3213,644.9025,711.6646,-0.5017,5.1359,16.0199,True,False,False +1313,META,Meta,2025-01-10,positive,medium,medium,613.3988,610.3213,644.9025,711.6646,-0.5017,5.1359,16.0199,False,True,True +1159,NVDA,NVIDIA,2025-01-07,positive,medium,short,140.0941,131.7168,140.7839,118.6111,-5.9797,0.4924,-15.3347,False,True,False +1160,NVDA,NVIDIA,2025-01-07,positive,low,medium,140.0941,131.7168,140.7839,118.6111,-5.9797,0.4924,-15.3347,False,True,False +1157,RIVN,Rivian,2025-01-03,positive,high,short,16.49,13.85,14.21,12.56,-16.0097,-13.8266,-23.8326,False,False,False +1158,RIVN,Rivian,2025-01-03,positive,medium,medium,16.49,13.85,14.21,12.56,-16.0097,-13.8266,-23.8326,False,False,False +1162,AVGO,Broadcom,2024-12-31,positive,high,short,229.2828,226.1181,222.2216,205.0728,-1.3803,-3.0797,-10.559,False,False,False +1163,AVGO,Broadcom,2024-12-31,positive,medium,medium,229.2828,226.1181,222.2216,205.0728,-1.3803,-3.0797,-10.559,False,False,False +1161,AAPL,Apple,2024-12-26,positive,high,medium,257.6127,242.5252,235.5632,222.4449,-5.8567,-8.5592,-13.6514,False,False,False +1317,LLY,Eli Lilly,2024-12-23,positive,medium,short,789.0677,766.8309,758.17,735.626,-2.8181,-3.9157,-6.7728,False,False,False +1258,005930.KS,Samsung,2024-12-18,positive,medium,medium,53376.9062,52112.9688,52272.5312,52566.1953,-2.3679,-2.069,-1.5188,False,False,False +1427,SMCI,Super Micro Computer,2024-12-16,negative,medium,short,33.44,32.4,30.68,31.08,-3.11,-8.2536,-7.0574,True,True,True +1428,SMCI,Super Micro Computer,2024-12-16,negative,low,medium,33.44,32.4,30.68,31.08,-3.11,-8.2536,-7.0574,True,True,True +1254,META,Meta,2024-12-14,positive,medium,medium,621.7454,582.9113,597.4131,613.3988,-6.246,-3.9136,-1.3424,False,False,False +1255,META,Meta,2024-12-14,positive,high,short,621.7454,582.9113,597.4131,613.3988,-6.246,-3.9136,-1.3424,False,False,False +1424,AAPL,Apple,2024-12-13,positive,medium,medium,246.7819,253.1074,254.2014,235.5632,2.5632,3.0065,-4.546,True,True,False +1441,SPOT,Spotify,2024-12-11,positive,medium,short,476.91,448.65,457.98,479.73,-5.9256,-3.9693,0.5913,False,False,True +1439,RIVN,Rivian,2024-12-09,positive,medium,medium,14.45,15.34,13.75,15.715,6.1592,-4.8443,8.7543,True,False,True +1440,RIVN,Rivian,2024-12-09,positive,low,long,14.45,15.34,13.75,15.715,6.1592,-4.8443,8.7543,True,False,True +1431,CVX,Chevron,2024-12-08,positive,medium,short,148.6666,145.6285,135.1987,139.9309,-2.0435,-9.0591,-5.876,False,False,False +1432,CVX,Chevron,2024-12-08,positive,medium,medium,148.6666,145.6285,135.1987,139.9309,-2.0435,-9.0591,-5.876,False,False,False +1429,SHOP,Shopify,2024-12-06,positive,medium,short,118.37,114.63,108.95,109.25,-3.1596,-7.9581,-7.7047,False,False,False +1430,SHOP,Shopify,2024-12-06,positive,low,medium,118.37,114.63,108.95,109.25,-3.1596,-7.9581,-7.7047,False,False,False +1437,AMD,AMD,2024-12-04,positive,medium,short,143.99,130.15,121.41,120.63,-9.6118,-15.6816,-16.2234,False,False,False +1436,SHOP,Shopify,2024-12-02,negative,medium,short,112.98,115.29,115.94,106.69,2.0446,2.6199,-5.5674,False,False,True +1433,NOW,ServiceNow,2024-12-01,positive,high,medium,209.686,224.868,224.22,216.292,7.2403,6.9313,3.1504,True,True,True +1434,NOW,ServiceNow,2024-12-01,positive,medium,long,209.686,224.868,224.22,216.292,7.2403,6.9313,3.1504,True,True,True +1435,NOW,ServiceNow,2024-12-01,positive,high,long,209.686,224.868,224.22,216.292,7.2403,6.9313,3.1504,True,True,True +1442,META,Meta,2024-11-29,positive,high,long,571.5638,620.7766,617.373,597.4131,8.6102,8.0147,4.5226,True,True,True +1443,META,Meta,2024-11-29,negative,medium,short,571.5638,620.7766,617.373,597.4131,8.6102,8.0147,4.5226,False,False,False +1444,META,Meta,2024-11-29,positive,medium,long,571.5638,620.7766,617.373,597.4131,8.6102,8.0147,4.5226,True,True,True +1446,META,Meta,2024-11-21,positive,low,medium,560.3878,571.564,606.0078,593.1899,1.9944,8.1408,5.8535,True,True,True +1453,CMCSA,Comcast,2024-11-20,positive,medium,short,37.9328,37.5534,37.5446,33.4063,-1.0002,-1.0235,-11.933,False,False,False +1454,CMCSA,Comcast,2024-11-20,positive,medium,long,37.9328,37.5534,37.5446,33.4063,-1.0002,-1.0235,-11.933,False,False,False +1448,META,Meta,2024-11-14,negative,medium,short,574.3902,560.3878,571.564,627.7629,-2.4378,-0.492,9.2921,True,True,False +1449,META,Meta,2024-11-14,negative,medium,medium,574.3902,560.3878,571.564,627.7629,-2.4378,-0.492,9.2921,True,True,False +1450,META,Meta,2024-11-14,positive,high,long,574.3902,560.3878,571.564,627.7629,-2.4378,-0.492,9.2921,False,False,True +1527,TSLA,Tesla,2024-11-08,positive,high,short,321.22,320.72,352.56,389.22,-0.1557,9.7566,21.1693,False,True,True +1528,TSLA,Tesla,2024-11-08,positive,medium,medium,321.22,320.72,352.56,389.22,-0.1557,9.7566,21.1693,False,True,True +1552,RIVN,Rivian,2024-10-17,positive,low,short,10.12,10.43,10.1,10.31,3.0632,-0.1976,1.8775,True,False,True +1553,RIVN,Rivian,2024-10-17,positive,medium,short,10.12,10.43,10.1,10.31,3.0632,-0.1976,1.8775,True,False,True diff --git a/config.json b/config.json index 54ad940..06263de 100644 --- a/config.json +++ b/config.json @@ -16,7 +16,11 @@ "password": "changeme" }, "database": { - "path": "./archive.sqlite" + "type": "sqlite", + "path": "./archive.sqlite", + "postgres": { + "connectionString": "postgresql://user:password@localhost:5432/duriin" + } }, "sec": { "userAgent": "Augor benjamin.watt@imbenji.net", diff --git a/package-lock.json b/package-lock.json index 3cb4949..117fe1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,10 @@ "@fastify/static": "^9.1.3", "@google-cloud/bigquery": "^8.1.1", "better-sqlite3": "^12.4.1", + "deasync": "^0.1.31", "fastify": "^5.6.1", "node-cron": "^4.2.1", + "pg": "^8.20.0", "playwright": "^1.59.1", "rss-parser": "^3.13.0", "sqlite-vec": "^0.1.9" @@ -665,6 +667,20 @@ "node": ">= 12" } }, + "node_modules/deasync": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.31.tgz", + "integrity": "sha512-/6/cXqkw4LPqBVK6H0Y3L4zT7yI3pxykxPXErQ2tDCw0LJyThWL5VpBCpUOWX0vPq2OnF1pzcXvlNnvCiOQJuA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1" + }, + "engines": { + "node": ">=0.11.0" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1540,6 +1556,12 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "license": "MIT" + }, "node_modules/node-cron": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", @@ -1641,6 +1663,95 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.12.0", + "pg-pool": "^3.13.0", + "pg-protocol": "^1.13.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", + "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1742,6 +1853,45 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -2409,6 +2559,15 @@ "engines": { "node": ">=4.0" } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } } } } diff --git a/package.json b/package.json index c8180e2..83de665 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,10 @@ "@fastify/static": "^9.1.3", "@google-cloud/bigquery": "^8.1.1", "better-sqlite3": "^12.4.1", + "deasync": "^0.1.31", "fastify": "^5.6.1", "node-cron": "^4.2.1", + "pg": "^8.20.0", "playwright": "^1.59.1", "rss-parser": "^3.13.0", "sqlite-vec": "^0.1.9" diff --git a/public/admin/pages/intelligence/graph.html b/public/admin/pages/intelligence/graph.html index a6ad99b..9c83eab 100644 --- a/public/admin/pages/intelligence/graph.html +++ b/public/admin/pages/intelligence/graph.html @@ -16,7 +16,7 @@ diff --git a/scripts/migrate-to-postgres.js b/scripts/migrate-to-postgres.js new file mode 100644 index 0000000..e679542 --- /dev/null +++ b/scripts/migrate-to-postgres.js @@ -0,0 +1,284 @@ +#!/usr/bin/env node +// Migrates an existing SQLite archive.sqlite database into postgres. +// Run once after setting database.type = "postgres" in config.json. +// +// Usage: node scripts/migrate-to-postgres.js [--dry-run] +// +// What it does: +// 1. connects to postgres (using config.database.postgres) +// 2. ensures all tables exist (db-pg.js already creates them on require) +// 3. streams every row from each sqlite table and upserts into postgres +// 4. migrates article_embeddings blobs from article_embedding_store +// into the postgres vector column (requires pgvector extension) +// +// Skips rows that already exist (safe to re-run). + +const path = require('path'); +const Database = require('better-sqlite3'); +const sqliteVec = require('sqlite-vec'); +const { Pool } = require('pg'); +const config = require('../src/config'); + + +const DRY_RUN = process.argv.includes('--dry-run'); + +if (!config.database || config.database.type !== 'postgres') { + console.error('[migrate] config.database.type must be "postgres" to run this script'); + process.exit(1); +} + +const sqlitePath = path.resolve(__dirname, '..', config.database.path || './archive.sqlite'); + +let sqlite; +try { + sqlite = new Database(sqlitePath, { readonly: true }); + sqliteVec.load(sqlite); +} catch (e) { + console.error(`[migrate] could not open sqlite at ${sqlitePath}:`, e.message); + process.exit(1); +} + +const pool = new Pool(config.database.postgres); + +async function query(sql, params = []) { + const client = await pool.connect(); + try { + return await client.query(sql, params); + } finally { + client.release(); + } +} + +// tables to migrate in order (respects FK: events before articles) +const TABLES = [ + { + name: 'events', + columns: ['id', 'title', 'created_at'], + conflict: 'id', + }, + { + name: 'articles', + columns: [ + 'id', 'title', 'description', 'content', 'image', + 'content_status', 'content_error', 'content_attempted_at', + 'content_attempt_count', 'content_retry_after', + 'is_index_page', 'has_embedding', 'url', 'normalized_title', + 'source', 'pub_date', 'pub_date_effective', 'language', + 'event_id', 'ingested_at', + ], + conflict: 'url', + }, + { + name: 'article_embedding_store', + columns: ['article_id', 'model', 'embedding', 'embedded_at'], + conflict: '(article_id, model)', + blobColumns: ['embedding'], + }, + { + name: 'article_embedding_meta', + columns: ['article_id', 'model', 'embedded_at'], + conflict: 'article_id', + }, + { + name: 'query_embeddings', + columns: ['query', 'model', 'embedding', 'created_at'], + conflict: '(query, model)', + blobColumns: ['embedding'], + }, + { + name: 'gdelt_backfill_windows', + columns: ['source_id', 'window_start', 'window_end', 'completed_at'], + conflict: '(source_id, window_start, window_end)', + }, + { + name: 'crawler_page_classifications', + columns: ['url', 'site_name', 'classification', 'pattern', 'classified_at'], + conflict: 'url', + }, + { + name: 'crawler_url_patterns', + columns: ['site_name', 'pattern', 'classification', 'hit_count', 'updated_at'], + conflict: '(site_name, pattern)', + }, + { + name: 'crawler_site_rules', + columns: ['site_name', 'rule_type', 'rule_value', 'classification', 'hit_count', 'updated_at'], + conflict: '(site_name, rule_type, rule_value)', + }, + { + name: 'domain_fetch_policy', + columns: [ + 'domain', 'policy', 'consecutive_plain_failures', 'consecutive_browser_failures', + 'plain_success_count', 'browser_success_count', 'expires_at', 'updated_at', + ], + conflict: 'domain', + }, +]; + +async function migrateTable(table) { + let rows; + try { + rows = sqlite.prepare(`SELECT * FROM ${table.name}`).all(); + } catch (e) { + console.log(`[migrate] skipping ${table.name}: ${e.message}`); + return 0; + } + + if (rows.length === 0) { + console.log(`[migrate] ${table.name}: empty, skipping`); + return 0; + } + + console.log(`[migrate] ${table.name}: ${rows.length} rows`); + if (DRY_RUN) return rows.length; + + const cols = table.columns; + const placeholders = cols.map((_, i) => `$${i + 1}`).join(', '); + const colList = cols.join(', '); + + const sql = ` + INSERT INTO ${table.name} (${colList}) + VALUES (${placeholders}) + ON CONFLICT (${table.conflict}) DO NOTHING + `; + + let inserted = 0; + const BATCH = 500; + + for (let i = 0; i < rows.length; i += BATCH) { + const batch = rows.slice(i, i + BATCH); + const client = await pool.connect(); + + try { + await client.query('BEGIN'); + + for (const row of batch) { + const vals = cols.map(col => { + const v = row[col]; + + // sqlite blobs come back as Buffer — postgres bytea also accepts Buffer, good + if (table.blobColumns && table.blobColumns.includes(col) && v instanceof Buffer) { + return v; + } + + return v ?? null; + }); + + const r = await client.query(sql, vals); + inserted += r.rowCount; + } + + await client.query('COMMIT'); + } catch (e) { + await client.query('ROLLBACK'); + throw e; + } finally { + client.release(); + } + + process.stdout.write(`\r[migrate] ${table.name}: ${Math.min(i + BATCH, rows.length)}/${rows.length}`); + } + + console.log(`\r[migrate] ${table.name}: inserted ${inserted} new rows`); + return inserted; +} + +async function migrateVectors() { + // article_embeddings in sqlite is a vec0 virtual table — + // we can't SELECT * from it directly but we can read raw float32 + // arrays from article_embedding_store and push them to postgres vector column. + // + // Requires pgvector extension: CREATE EXTENSION IF NOT EXISTS vector; + + let hasPgvector = false; + try { + await query(`SELECT NULL::vector`); + hasPgvector = true; + } catch (_) {} + + if (!hasPgvector) { + console.log('[migrate] pgvector not available — skipping article_embeddings vector migration'); + console.log('[migrate] run: CREATE EXTENSION IF NOT EXISTS vector; then re-run this script'); + return; + } + + const rows = sqlite.prepare(` + SELECT article_id, embedding FROM article_embedding_store + `).all(); + + if (rows.length === 0) return; + + console.log(`[migrate] article_embeddings: ${rows.length} vectors`); + if (DRY_RUN) return; + + const client = await pool.connect(); + let inserted = 0; + + try { + await client.query('BEGIN'); + + for (const row of rows) { + // embedding is a Float32 buffer — convert to float array for pgvector + const buf = row.embedding; + const floats = []; + + for (let i = 0; i < buf.length; i += 4) { + floats.push(buf.readFloatLE(i)); + } + + const vec = '[' + floats.join(',') + ']'; + + const r = await client.query(` + INSERT INTO article_embeddings (article_id, embedding) + VALUES ($1, $2::vector) + ON CONFLICT (article_id) DO NOTHING + `, [row.article_id, vec]); + + inserted += r.rowCount; + } + + await client.query('COMMIT'); + } catch (e) { + await client.query('ROLLBACK'); + console.error('[migrate] vector migration failed:', e.message); + } finally { + client.release(); + } + + console.log(`[migrate] article_embeddings: inserted ${inserted} vectors`); +} + +async function resetSequences() { + // after bulk insert with explicit IDs, postgres sequences need to be reset + for (const t of [{ table: 'articles' }, { table: 'events' }]) { + await query(` + SELECT setval( + pg_get_serial_sequence('${t.table}', 'id'), + COALESCE((SELECT MAX(id) FROM ${t.table}), 1) + ) + `); + } + console.log('[migrate] sequences reset'); +} + +async function main() { + console.log(`[migrate] sqlite → postgres (dry-run: ${DRY_RUN})`); + console.log(`[migrate] source: ${sqlitePath}`); + + for (const table of TABLES) { + await migrateTable(table); + } + + await migrateVectors(); + + if (!DRY_RUN) await resetSequences(); + + console.log('[migrate] done'); + await pool.end(); + sqlite.close(); +} + +main().catch(e => { + console.error('[migrate] fatal:', e); + process.exit(1); +}); diff --git a/src/db-pg.js b/src/db-pg.js new file mode 100644 index 0000000..98bfb1c --- /dev/null +++ b/src/db-pg.js @@ -0,0 +1,226 @@ +// postgres adapter that mimics the better-sqlite3 synchronous interface. +// uses deasync to block the event loop until queries resolve so all +// existing consumers (which call .get()/.all()/.run() synchronously) keep working. + +const { Pool } = require('pg'); +const deasync = require('deasync'); +const config = require('./config'); + +const pool = new Pool(config.database.postgres); + +function querySync(sql, params) { + let done = false; + let result, err; + + pool.query(sql, params).then(r => { result = r; done = true; }).catch(e => { err = e; done = true; }); + deasync.loopWhile(() => !done); + + if (err) throw err; + return result; +} + +// translate ? placeholders to $1, $2, ... for postgres +function toPositional(sql) { + let i = 0; + return sql.replace(/\?/g, () => `$${++i}`); +} + + +// sqlite-vec uses: WHERE embedding MATCH ? AND k = ? +// pgvector uses: ORDER BY embedding <-> $1::vector LIMIT $2 +const NEAREST_NEIGHBORS_RE = /SELECT\s+article_id\s*,\s*distance\s+FROM\s+article_embeddings\s+WHERE\s+embedding\s+MATCH\s+\?\s+AND\s+k\s*=\s*\?\s+ORDER\s+BY\s+distance/is; + +function rewriteNearestNeighbors(sql) { + if (!NEAREST_NEIGHBORS_RE.test(sql)) return null; + return ` + SELECT article_id, (embedding <-> $1::vector) AS distance + FROM article_embeddings + ORDER BY embedding <-> $1::vector + LIMIT $2 + `; +} + +function Statement(sql) { + const pgSql = rewriteNearestNeighbors(sql) || toPositional(sql); + + return { + get(...params) { + const r = querySync(pgSql, params.flat()); + return r.rows[0] ?? undefined; + }, + + all(...params) { + const r = querySync(pgSql, params.flat()); + return r.rows; + }, + + run(...params) { + const r = querySync(pgSql, params.flat()); + return { changes: r.rowCount, lastInsertRowid: null }; + }, + }; +} + +function exec(sql) { + // split on ; and run each statement individually (DDL blocks) + const stmts = sql.split(';').map(s => s.trim()).filter(Boolean); + for (const stmt of stmts) { + querySync(stmt, []); + } +} + +function transaction(fn) { + return (...args) => { + querySync('BEGIN', []); + try { + const result = fn(...args); + querySync('COMMIT', []); + return result; + } catch (e) { + querySync('ROLLBACK', []); + throw e; + } + }; +} + +function prepare(sql) { + return Statement(sql); +} + +const pgDb = { prepare, exec, transaction, pool }; + +// create the schema in postgres, mirroring src/db.js + +exec(` + CREATE TABLE IF NOT EXISTS events ( + id SERIAL PRIMARY KEY, + title TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS articles ( + id SERIAL PRIMARY KEY, + title TEXT NOT NULL, + description TEXT, + content TEXT, + image TEXT, + content_status TEXT, + content_error TEXT, + content_attempted_at TEXT, + content_attempt_count INTEGER NOT NULL DEFAULT 0, + content_retry_after TEXT, + is_index_page INTEGER NOT NULL DEFAULT 0, + has_embedding INTEGER NOT NULL DEFAULT 0, + url TEXT NOT NULL UNIQUE, + normalized_title TEXT NOT NULL, + source TEXT NOT NULL, + pub_date TEXT, + pub_date_effective TEXT, + language TEXT, + event_id INTEGER REFERENCES events(id), + ingested_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) +`); + +exec(`CREATE INDEX IF NOT EXISTS idx_articles_source ON articles(source)`); +exec(`CREATE INDEX IF NOT EXISTS idx_articles_pub_date ON articles(pub_date)`); +exec(`CREATE INDEX IF NOT EXISTS idx_articles_ingested_at ON articles(ingested_at)`); +exec(`CREATE INDEX IF NOT EXISTS idx_articles_normalized_title ON articles(normalized_title)`); +exec(`CREATE INDEX IF NOT EXISTS idx_articles_event_id ON articles(event_id)`); +exec(`CREATE INDEX IF NOT EXISTS idx_articles_has_embedding ON articles(has_embedding)`); +exec(`CREATE INDEX IF NOT EXISTS idx_articles_pub_date_effective ON articles(pub_date_effective DESC)`); + +exec(` + CREATE TABLE IF NOT EXISTS article_embedding_store ( + article_id INTEGER NOT NULL, + model TEXT NOT NULL, + embedding BYTEA NOT NULL, + embedded_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (article_id, model) + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS article_embedding_meta ( + article_id INTEGER PRIMARY KEY, + model TEXT NOT NULL, + embedded_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS article_embeddings ( + article_id INTEGER PRIMARY KEY, + embedding vector(8192) + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS query_embeddings ( + query TEXT NOT NULL, + model TEXT NOT NULL, + embedding BYTEA NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (query, model) + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS gdelt_backfill_windows ( + source_id TEXT NOT NULL, + window_start TEXT NOT NULL, + window_end TEXT NOT NULL, + completed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (source_id, window_start, window_end) + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS crawler_page_classifications ( + url TEXT PRIMARY KEY, + site_name TEXT NOT NULL, + classification TEXT NOT NULL, + pattern TEXT, + classified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS crawler_url_patterns ( + site_name TEXT NOT NULL, + pattern TEXT NOT NULL, + classification TEXT NOT NULL, + hit_count INTEGER NOT NULL DEFAULT 1, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (site_name, pattern) + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS crawler_site_rules ( + site_name TEXT NOT NULL, + rule_type TEXT NOT NULL, + rule_value TEXT NOT NULL, + classification TEXT NOT NULL, + hit_count INTEGER NOT NULL DEFAULT 1, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (site_name, rule_type, rule_value) + ) +`); + +exec(` + CREATE TABLE IF NOT EXISTS domain_fetch_policy ( + domain TEXT PRIMARY KEY, + policy TEXT NOT NULL DEFAULT 'auto', + consecutive_plain_failures INTEGER NOT NULL DEFAULT 0, + consecutive_browser_failures INTEGER NOT NULL DEFAULT 0, + plain_success_count INTEGER NOT NULL DEFAULT 0, + browser_success_count INTEGER NOT NULL DEFAULT 0, + expires_at TEXT, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) +`); + +module.exports = pgDb; \ No newline at end of file diff --git a/src/db.js b/src/db.js index e04889a..9400479 100644 --- a/src/db.js +++ b/src/db.js @@ -1,7 +1,13 @@ +const config = require('./config'); + +if (config.database && config.database.type === 'postgres') { + module.exports = require('./db-pg'); + return; +} + const path = require('path'); const Database = require('better-sqlite3'); const sqliteVec = require('sqlite-vec'); -const config = require('./config'); const dbPath = path.resolve(__dirname, '..', config.database.path || './archive.sqlite'); const db = new Database(dbPath);