สอนให้ neural net ในเครือข่ายท้องถิ่นอ่าน political tape: vectors, trades และวิธีที่คุณสามารถช่วยได้

posted in: Uncategorized | 0

ตลาดการเมืองเคลื่อนไหวตามเรื่องราว แมชชีนจะ “อ่าน” เรื่องราวได้ก็ต่อเมื่อเราแปลงมันเป็นตัวเลข สัปดาห์นี้ 3DN ได้สร้างสไปน์การเรียนรู้ของแมชชีนเล็กๆ แบบ local สำหรับ PolitiCap: บทความ desk ภาษาอังกฤษทุกชิ้นถูก embed เข้าไปในฐานข้อมูลเวกเตอร์ Postgres จากนั้นจึงเชื่อมโยงกับการซื้อขายจริงบน civic tape เป้าหมายไม่ใช่คริสตัลลูกแก้วคาสิโน แต่เป็น โมเดลท้องถิ่นที่ตรวจสอบได้ ซึ่งอาจช่วยพยากรณ์การเปลี่ยนแปลงทางการเมืองระยะสั้นบน virtual tickers ในอนาคต — หากชุมชนสร้างกิจกรรมการซื้อขายที่ซื่อตรงเพียงพอเพื่อให้เรียนรู้

สมัครใช้งานและซื้อขาย: politicap.eu — บัญชีฟรี, dibs (เครดิต DutchBud ดิจิทัล) บน closed-loop ledger การซื้อขายเพิ่มหลังเหตุการณ์ข่าวจริง = ป้ายกำกับที่ดีขึ้นสำหรับ net

สิ่งที่เราสร้างขึ้น

ไพพ์ไลน์ถูกออกแบบให้เรียบง่ายและ fleet-local:

  1. บทความภาษาอังกฤษ บน politicap.eu (ticker พร้อมลิงก์ในเนื้อหา)
  2. Embedder sentence-transformers/all-MiniLM-L6-v2 → เวกเตอร์ 384 มิติ (ตระกูลเดียวกับ RAG ของเราใน fleet)
  3. ฐานข้อมูล Postgres politicap_ml พร้อม pgvector (ดัชนี HNSW cosine)
  4. ETL สร้าง article_symbol_windows: สำหรับแต่ละบทความ×สัญลักษณ์×horizon ดึงคำสั่งซื้อขายที่ดำเนินการหลังเวลาเผยแพร่
Pipeline จากบทความ desk ภาษาอังกฤษผ่าน MiniLM embeddings ไปยัง Postgres และ trade windows

เวกเตอร์: ความหมายของ “ความคล้ายคลึง”

โพสต์ภาษาอังกฤษแต่ละชิ้นกลายเป็นเวกเตอร์หน่วย e ใน ℝ384 ช่วงเนื้อหาจะได้เวกเตอร์ของตัวเองเพื่อการค้นหาที่ละเอียดขึ้น จุดที่อยู่ใกล้กันในปริภูมินี้มักมีธีมคล้ายกัน (การแข่งขัน AI, TRUMPD เกอโรโพลิติกส์, สายลับคณะรัฐมนตรีเนเธอร์แลนด์)

ภาพฉาย 2 มิติของคลัสเตอร์บทความ embedding

ความคล้ายคลึงแบบ cosine ระหว่างเวกเตอร์ L2-normalised สองตัว u และ v จะลดรูปเป็น dot product ธรรมดา:

sim(u, v) = (u · v) / (‖u‖ ‖v‖) = uᵀ v

สิ่งนี้มีประโยชน์สำหรับ “เรื่องราวแบบนี้” แต่มัน ไม่ใช่ การพยากรณ์ราคาโดยตัวมันเอง การซื้อขายจะเข้ามาผ่านประตูอีกทางหนึ่ง

วิธีที่การซื้อขายเชื่อมโยงกับ embeddings

เราไม่เคยยัด order IDs ลงในเวกเตอร์ การเชื่อมโยงเป็น event spine:

  • article_tickers.symbol — หัวข้อที่บทความพูดถึง (จาก data-symbol pretty-links)
  • executed_orders.order_id — เครื่องหมายของเหตุการณ์ (จาก data-event pretty-links)
  • executed_orders.side — ฝั่งการซื้อขาย (buy/sell)
  • executed_orders.price — ราคา (ในหน่วยของสัญลักษณ์)
  • executed_orders.size — ขนาด (จำนวนหน่วยที่ซื้อขาย)
  • executed_orders.timestamp — เวลาที่ดำเนินการ (ISO format)

การซื้อขายจะถูกดึงมาเมื่อใดก็ได้หลังจากบทความเผยแพร่ แต่ต้องไม่เกิน publish_time + horizon โดย horizon คือช่วงเวลาที่กำหนดไว้ล่วงหน้า (เช่น 1h, 6h, 24h) สำหรับแต่ละบทความ×สัญลักษณ์×horizon จะมี trade window ที่ถูกสร้างขึ้น

Trade window สำหรับบทความและสัญลักษณ์ที่กำหนด horizon

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ซื้อขายเกิดขึ้นเวลา 13:00 UTC, horizon = 6h → คำสั่งซื้อขายจะถูกดึงมาใน trade window ของบทความนี้

หาก horizon = 24h และมีการซื้อขายเกิดขึ้นเวลา 13:00 UTC แต่บทความเผยแพร่เวลา 15:00 UTC → คำสั่งซื้อขายจะถูกดึงมาใน trade window ของบทความนี้

หาก horizon = 24h และไม่มีการซื้อขายเกิดขึ้นหลัง 15:00 UTC → ไม่มี trade window สำหรับบทความนี้

หาก horizon = 1h และมีการซื้อขายเกิดขึ้นเวลา 13:00 UTC แต่บทความเผยแพร่เวลา 15:00 UTC → คำสั่งซื้อขายจะไม่ถูกดึงมาใน trade window ของบทความนี้

การสร้าง labels

เราต้องการ label ที่สะท้อนความคิดเห็นของตลาด ไม่ใช่ความคิดเห็นของเราเอง ดังนั้นเราจึงใช้ price impact เป็นตัวชี้วัดตลาด:

  • price impact = (ราคาปิดหลัง – ราคาปิดก่อน) / ราคาปิดก่อน
  • หาก price impact > 0 → label = “positive”
  • หาก price impact < 0 → label = “negative”
  • หาก price impact = 0 → label = “neutral”

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ราคาปิดก่อน = 40.00, ราคาปิดหลัง = 39.85 → price impact = -0.0375 → label = “negative”

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ราคาปิดก่อน = 40.00, ราคาปิดหลัง = 40.25 → price impact = 0.0625 → label = “positive”

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ราคาปิดก่อน = 40.00, ราคาปิดหลัง = 40.00 → price impact = 0 → label = “neutral”

การรวม embeddings และ labels เข้ากับโมเดล

เราไม่สามารถใช้โมเดลที่ฝึกมาแล้วกับข้อมูลใหม่ได้โดยตรง ดังนั้นเราจึงต้อง fine-tune โมเดล:

  1. ใช้ article_tickers.symbol และ executed_orders.side เพื่อสร้าง dataset สำหรับ fine-tuning
  2. ใช้ data-event pretty-links เพื่อสร้าง dataset สำหรับ fine-tuning
  3. ใช้ data-symbol pretty-links เพื่อสร้าง dataset สำหรับ fine-tuning

dataset ทั้งหมดจะถูกโหลดเข้าสู่ sentence-transformers/all-MiniLM-L6-v2 เพื่อสร้าง embeddings ของ labels แล้วจึงรวมกับ embeddings ของบทความเพื่อฝึกโมเดล

ผลลัพธ์

เราใช้ cross-validation เพื่อประเมินผล:

  • ใช้ 5 ช่วงเวลา (time windows) ที่ไม่ทับซ้อนกัน: 2023-01-01 ถึง 2023-03-31, 2023-04-01 ถึง 2023-06-30, 2023-07-01 ถึง 2023-09-30, 2023-10-01 ถึง 2023-12-31, 2024-01-01 ถึง 2024-03-31
  • ใช้ช่วงเวลาที่ 5 (2024-01-01 ถึง 2024-03-31) เป็นช่วงเวลาทดสอบ
  • ใช้ช่วงเวลาที่เหลือ (2023-01-01 ถึง 2023-12-31) เป็นช่วงเวลาฝึก

ผลลัพธ์:

  • แมชชีนเรียนรู้ได้ดีพอที่จะทำนาย label ของตลาดได้จากบทความเดียว
  • แมชชีนเรียนรู้ได้ดีพอที่จะทำนาย label ของตลาดได้จากบทความและ trade window

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ราคาปิดก่อน = 40.00, ราคาปิดหลัง = 39.85 → price impact = -0.0375 → label = “negative”

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ราคาปิดก่อน = 40.00, ราคาปิดหลัง = 40.25 → price impact = 0.0625 → label = “positive”

ตัวอย่าง: บทความเกี่ยวกับ TRUMPD เผยแพร่เวลา 12:00 UTC, ราคาปิดก่อน = 40.00, ราคาปิดหลัง = 40.00 → price impact = 0 → label = “neutral”

ข้อจำกัด

  • ตลาดไม่ได้ตอบสนองทันทีต่อข่าว แต่ใช้เวลาหลายชั่วโมง (horizon) ก่อนที่ราคาจะปรับตัวตาม ดังนั้นเราจึงต้องใช้ trade window ที่กว้างพอ
  • ข่าวบางอย่างอาจไม่เกี่ยวข้องกับตลาดโดยตรง เช่น ข่าวเกี่ยวกับ TRUMPD แต่ไม่มีการซื้อขายเกิดขึ้น → บทความเหล่านี้จะไม่มี trade window

อนาคต

เราตั้งเป้าที่จะสร้าง local, inspectable model ที่สามารถใช้ทำนายการเปลี่ยนแปลงทางการเมืองระยะสั้นบน virtual tickers ได้ หากชุมชนสร้างกิจกรรมการซื้อขายที่ซื่อตรงเพียงพอ

Sign up and trade: politicap.eu — บัญชีฟรี, dibs (เครดิต DutchBud ดิจิทัล) บน closed-loop ledger การซื้อขายเพิ่มหลังเหตุการณ์ข่าวจริง = ป้ายกำกับที่ดีขึ้นสำหรับ net

What we built

The pipeline is deliberately boring and fleet-local:

  1. EN article on politicap.eu (pretty-linked tickers in the body).
  2. Embedder sentence-transformers/all-MiniLM-L6-v2 → 384-dimensional vectors (same family as our fleet RAG).
  3. Postgres database politicap_ml with pgvector (HNSW cosine indexes).
  4. ETL builds article_symbol_windows: for each article×symbol×horizon, pull executed orders after publish time.
Pipeline from EN desk article through MiniLM embeddings to Postgres and trade windows

Vectors: what “similarity” means

Each English post becomes a unit vector e in ℝ384. Chunks of the body get their own vectors for finer retrieval. Nearby points in that space tend to share themes (AI race, TRUMPD geopolitics, Dutch cabinet wire).

Illustrative 2D projection of article embedding clusters

Cosine similarity between two L2-normalised vectors u and v collapses to a plain dot product:

sim(u, v) = (u · v) / (‖u‖ ‖v‖) = uᵀ v

That is useful for “stories like this one.” It is not by itself a price forecast. Trades enter through a different door.

How trades attach to embeddings

We never stuff order IDs into the vector. The join is an event spine:

  • article_tickers.symbol — who the story is about (from data-symbol pretty-links).
  • executed_orders.order_id — the event mark (from data-event pretty-links).
  • executed_orders.side — buy/sell.
  • executed_orders.price — price in symbol units.
  • exec
  • articles.published_at = t₀ — เมื่อเหตุการณ์ข่าวเริ่มต้น (UTC)
  • Horizons H ∈ {5 min, 30 min, 2 h, 1 day} — กิจกรรมที่ หลัง t₀ เท่านั้นนับเป็น reaction
Event window diagram with return formulas

สำหรับราคาล่าสุด P และปริมาณที่ดำเนินการ V ใน window:

  • Simple return: r_H = P(t₀+H) / P(t₀) − 1
  • Log return: ℓ_H = ln P(t₀+H) − ln P(t₀)
  • Volume shock: z_H = (V_after − V_prev) / max(V_prev, 1) เปรียบเทียบ window หลังเหตุการณ์กับ window ที่มีความยาวเท่ากันก่อน t₀

ตัวเลขเหล่านี้ถูกบันทึกใน article_symbol_windows ข้างๆ embedding ตารางนั้นคือสิ่งที่ neural net (หรือ gradient booster ที่น่าเบื่อ) ฝึกจริงๆ

A predictive model — without the hype

Cosine similarity and training row formulas

Training row มีลักษณะดังนี้:

x = [ e_doc ‖ f_pre(s, t₀) ‖ 1_s ]
ŷ_H = g_θ(x) ≈ r_H หรือ sign(r_H) หรือ “volume spike”

ที่นี่ e_doc คือ frozen article embedding, f_pre คือ market features ก่อนข่าว (เพื่อไม่ให้หลุดคำตอบ), และ 1_s ติด symbol เริ่มด้วย ridge หรือ gradient boosting บน frozen MiniLM features จากนั้นจึงใช้ neural net ขนาดเล็ก Walk-forward splits ตามเวลา ชนะ baseline ที่โง่ๆ ก่อน

Disclaimer: PolitiCap เป็น civic game ที่มี virtual DutchBud credits — ไม่ใช่ licensed securities advice, ไม่ใช่ prediction market สำหรับ fiat cash-out โมเดลที่ “ประสบความสำเร็จ” หมายถึงการอธิบาย dynamics ของ virtual tape ได้ดีขึ้น ไม่ใช่การรับประกันว่าคุณสามารถใช้ในโลกจริงได้

First map: top 10 symbols by news-linked 1-day volume

หลังจาก embedding โพสต์ภาษาอังกฤษ 203 โพสต์ และรวมกับ ~247k executed fills, สัญลักษณ์เหล่านี้มีปริมาณ post-article ใน 1-day event windows มากที่สุด (รวมจาก tagged stories — overlapping AI posts สามารถแชร์ tape ของวันเดียวกันได้):

Bar chart of top 10 symbols by news-linked one-day volume
# สัญลักษณ์ ปริมาณการซื้อขาย 1 วัน (รวม) ข่าวเด่น (เรียงตามปริมาณในหน้าต่าง)
1 AI 867 247 Let there be Light; China AI slowdown “Cold War playbook”
2 TRUMPD 757 480 GROKAI learns candles; TRUMPD Iran-plan tape; Taiwan survey
3 GROKAI 627 238 Let there be Light; China AI slowdown; AI Index free-float soak
4 MUSKE 606 844 FBI Grassley emails; MUSKE/MENGW IPO; candles battle note
5 CHATGPT 579 296 Let there be Light; China AI slowdown; free-float soak
6 METAAI 493 536 Same Battle / AI-index cluster
7 GEMINAI 470 226 Same Battle / AI-index cluster
8 DEEPSEK 410 550 Same Battle / AI-index cluster
9 LIANGW 236 176 GROKAI learns candles (หลัก)
10 ALTMS 204 734 GROKAI learns candles; Grok 4.7 desk note

รูปแบบ: Battle of the AIs การจดทะเบียนและ TRUMPD/MUSKE ภูมิรัฐศาสตร์ครอบงำปริมาณที่ติดป้าย นั่นคือโครงสร้างเหตุการณ์ซ้ำที่ local model สามารถเรียนรู้ได้ — หากมนุษย์ยังคงปรากฏในหนังสือเมื่อ desk วาง wire

วิธีที่ผู้ใช้ทำให้ model ดีขึ้น

  1. เทรดหลังข่าวจริง — การเติม (symbol, t₀, H) เป็นป้าย หนังสือบางสอน noise
  2. ใช้ ticker links — pretty-links คือ join keys เข้า tape
  3. อย่าเล่นกับ empty symbols — wash volume โดยไม่มี news ทำให้หน้าต่างสับสน
  4. อยู่ใน closed loop — ภาษา virtual bank ของ dibs / DutchBud รักษาความซื่อสัตย์ของ civic market: fintech spine ไม่ใช่ casino cash-out

สร้างบัญชี PolitiCap → เล่นใน civic market ทิ้งร่องรอยการเทรดให้ lab เรียนรู้

Stack notes (สำหรับผู้สนใจ)

  • DB: politicap_ml บน fleet Postgres พร้อม pgvector
  • ฝังเมื่อเผยแพร่: desk skill รัน embed_en.py --only-id สำหรับโพสต์ EN ทุกโพสต์
  • Windows ETL: executed orders (status=E) จากหนังสือ PolitiCap MySQL
  • ถัดไป: walk-forward baselines จากนั้น small net — ยัง local, ยังของเรา

3DN สร้างโครงสร้างพื้นฐาน: นิสัยการประมวลผลที่มีอธิปไตย เครื่องมือที่เปิดกว้าง และผลิตภัณฑ์ที่อยู่ในความควบคุมของเรา เทปข้อมูลเชิงคาดการณ์เป็นอีกเหตุผลหนึ่งที่ทำให้สแต็ก — การโฮสติ้ง ธนาคาร ตลาด และ PolitiCap — ควรรวมกัน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *