Belakangan ini AI benar-benar sedang sangat populer.
Tema utama yang paling kuat di pasar dalam dua tahun terakhir, pada akhirnya hampir semuanya tidak lepas dari AI. Nvidia, AMD, Broadcom, TSMC, Micron, Microsoft, Google, Meta, CoreWeave, Supermicro... Setiap beberapa waktu, pasti ada satu perusahaan yang tiba-tiba naik tajam karena laporan keuangan, pesanan, belanja modal, HBM, GPU, komputasi awan, pusat data.
Yang lebih menarik adalah, mereka seringkali tidak naik sendirian.
Terkadang Nvidia yang bergerak duluan, lalu pasar mulai menggali ASIC, modul optik, server, pendingin cair, listrik; terkadang laporan keuangan Micron melebihi ekspektasi, kemudian dana kembali melihat HBM, penyimpanan, peralatan semikonduktor, kemasan canggih; terkadang juga perusahaan cloud menaikkan belanja modal, seluruh rantai infrastruktur AI akan dinilai ulang.
Ini lebih seperti rotasi aset internal dalam tema AI. Pasar tidak hanya sekadar membeli satu saham, tetapi terus mencari cabang baru, interpretasi baru, dan target kenaikan tertinggal baru di bawah satu narasi besar.
Masalahnya kemudian muncul: jika hubungan-hubungan ini sepenuhnya diandalkan pada penyusunan manual, itu sangat melelahkan.
Satu orang bisa tahu Nvidia, AMD, Micron, Microsoft, Google, tetapi sangat sulit untuk terus melacak perubahan bisnis, perubahan berita, afiliasi sektor, dan pergerakan harga saham dari puluhan bahkan ratusan kontrak saham TradFi. Yang lebih merepotkan, banyak perusahaan tidak memiliki atribut tunggal. Google adalah AI cloud, Gemini, dan platform iklan; Microsoft adalah cloud, Copilot, dan perangkat lunak perusahaan; Broadcom memiliki ASIC, chip jaringan, dan juga terkait dengan pusat data AI.
Jadi saya mulai mencoba: mungkinkah model besar membantu kita membangun peta saham AI?
Bukan menyuruh model besar memberi tahu kita apa yang harus dibeli secara langsung, tetapi melakukan apa yang lebih dikuasainya: memahami bisnis perusahaan, mengklasifikasikan sub-sektor AI, merapikan berita, menjelaskan peristiwa, menilai saham tema serupa mana yang mungkin terpengaruh oleh pergerakan tidak wajar suatu perusahaan. Keputusan trading yang sesungguhnya, tetap diserahkan pada harga, statistik, dan manajemen risiko.
Masukkan Saham ke dalam Basket yang Tepat Terlebih Dahulu
Langkah pertama dari strategi bukanlah trading, tetapi membangun peta.
Saat ini di bursa sudah ada cukup banyak kontrak saham TradFi, yang secara langsung bisa mendapatkan serangkaian kontrak saham seperti NVDA, AMD, MU, MSFT, GOOGL, SMCI. Sistem akan menyaring kontrak kelas saham terlebih dahulu, hanya menyimpan target EQUITY yang sesungguhnya.
Ada satu detail yang sangat penting: ETF, indeks, leveraged ETF tidak boleh tercampur. Misalnya QQQs, SOXL, EWT dan sejenisnya, meskipun mungkin juga muncul dalam daftar kontrak, tetapi itu bukan saham perusahaan. Jika dimasukkan ke dalam basket saham AI, hubungan statistik di kemudian hari akan terkontaminasi.
Logika penyaringan inti kira-kira seperti ini:
python
def refresh_equity_universe(store, force_reanalyze):
ms = exchange.GetMarkets()
symbols = []
for key, market in ms.items():
info = market.get("Info", {}) or {}
sub_type = info.get("underlyingSubType", []) or []
underlying_type = info.get("underlyingType", "")
if ".swap" not in key:
continue
if "TradFi" not in sub_type:
continue
if underlying_type != "EQUITY":
continue
symbol = normalize_symbol(key)
store["markets"][symbol] = {
"symbol": symbol,
"contract": key,
"underlyingType": underlying_type,
"amountPrecision": market.get("AmountPrecision", 0),
"pricePrecision": market.get("PricePrecision", 2),
"ctVal": market.get("CtVal", 1) or 1,
"minQty": market.get("MinQty", 0) or 0,
}
symbols.append(symbol)
Setelah mendapatkan kumpulan saham, sistem akan meminta model besar untuk membuat profil setiap saham.
Profil bukan sekadar menulis "ini saham teknologi", tetapi harus menilai termasuk dalam sub-sektor AI yang mana. Misalnya, satu saham bisa termasuk dalam beberapa basket sekaligus. Google bisa termasuk dalam AI cloud, aplikasi model AI, iklan platform AI; Microsoft bisa termasuk dalam cloud dan aplikasi AI perusahaan; Nvidia bisa termasuk dalam komputasi AI dan server AI; Micron bisa termasuk dalam penyimpanan AI.
Poin penting dari langkah ini adalah: saham di era AI tidak berlabel tunggal, melainkan multi-label.
Setiap saham memiliki beberapa atribut: termasuk dalam basket apa, seberapa besar eksposurnya, di basket ini lebih mirip leader atau follower, perusahaan mana yang mungkin memengaruhinya, dan perusahaan mana yang mungkin dipengaruhinya.
Saya memberikan batasan yang kuat pada struktur keluaran model besar:
python
schema = {
"symbol": symbol,
"asset_type": "stock|adr|etf|leveraged_etf|index|fund|other",
"company_name": "",
"sector": "",
"business_summary": "",
"tradable": False,
"model_confidence": 0,
"baskets": [
{
"id": "ai_cloud",
"exposure": 0.0,
"role": "leader|follower|both|observer",
"sub_theme": "",
"reason": ""
}
],
"search_names": [],
"event_keywords": [],
"negative_keywords": [],
"possible_leaders": [],
"possible_followers": [],
"brave_queries": [],
"reason": ""
}
Yang paling krusial di sini adalah asset_type. Hanya stock dan adr yang bisa masuk ke basket, ETF, leveraged ETF, indeks, dana, komoditas, atau ETF regional semuanya langsung difilter.
Selain itu, reason harus menggunakan bahasa Indonesia, nama field harus konsisten, kepercayaan model diseragamkan menjadi 0 hingga 100. Jika tidak, halaman live trading nantinya akan terlihat berantakan.
Informasi Sektor Tidak Bisa Hanya Andalkan Imajinasi
Hanya memiliki klasifikasi saham saja tidak cukup.
Sektor AI berubah terlalu cepat. Hari ini pasar memperdagangkan GPU, besok mungkin HBM, lusa mungkin modul optik, beberapa hari kemudian mulai memperdagangkan pendingin cair, listrik, belanja modal perusahaan cloud.
Jika hanya mengandalkan pengetahuan model besar itu sendiri, sangat mudah ketinggalan zaman. Oleh karena itu sistem juga membutuhkan sumber informasi real-time.
Saya mengintegrasikan BraveSearch di sini. Sistem akan secara berkala mencari informasi sektor untuk setiap basket AI, juga mencari berita tentang saham-saham kunci di dalam basket.
Misalnya, untuk basket penyimpanan AI, akan mencari kata kunci seperti Micron, Western Digital, SanDisk, HBM, DRAM, NAND; untuk basket komunikasi optik AI, akan mencari informasi seperti Ciena, Credo, Lumentum, AAOI, modul optik 800G, 1.6T.
Alur inti dari intelijen sektor adalah:
python
def refresh_basket_intelligence(store):
if not BRAVE_KEY:
return
if not LLM_API_KEY:
return
intel = {}
for bid, basket in store["baskets"].items():
members = sorted(
basket["members"],
key=lambda x: x.get("exposure", 0),
reverse=True
)
top_symbols = [m["symbol"] for m in members[:8]]
basket_news = fetch_basket_news(basket, top_symbols)
stock_news = {}
for symbol in top_symbols[:6]:
profile = store["profiles"].get(symbol, {})
stock_news[symbol] = fetch_stock_news(profile, bid)
Sleep(800)
analysis = analyze_basket_intel_with_llm(
store, basket, top_symbols, basket_news, stock_news
)
if analysis:
analysis["basket"] = bid
analysis["basket_name"] = basket["name"]
analysis["symbols"] = top_symbols
analysis["updatedAt"] = int(time.time())
intel[bid] = analysis
store["basket_intel"] = intel
Fungsi langkah ini adalah untuk membangun latar belakang dinamis bagi setiap sub-sektor AI.
Model besar akan menggunakan berita yang diambil dari BraveSearch untuk menghasilkan tren sektor, katalis utama, risiko utama, kandidat leader, kandidat follower, serta hubungan yang perlu diverifikasi lebih lanjut.
Ini berbeda dengan langsung bertanya ke model besar "Bagaimana pandangan Anda tentang penyimpanan AI?" Kami pertama-tama memberikan berita real-time, lalu meminta ringkasan.
Bukan trading berbasis berita, tetapi harga yang abnormal terlebih dahulu
Awalnya saya juga pernah memikirkan trading berbasis berita.
Misalnya, ketika melihat laporan keuangan suatu perusahaan melebihi ekspektasi, saya meminta model besar untuk menilai saham mana yang diuntungkan, lalu langsung menghasilkan sinyal. Namun, setelah dipikir-pikir, cara ini sangat bising. Terlalu banyak berita, banyak berita yang tampak penting tetapi pasar tidak merespons sama sekali.
Jadi saya membalik logikanya.
Lihat harga terlebih dahulu, baru lihat berita.
Jika semua saham dalam suatu basket relatif stabil, sistem hanya mengamati. Hanya ketika suatu saham jelas menyimpang dari rata-rata kinerja sektor dan menjadi leader saat ini, sistem akan bertanya: mengapa ia bergerak? Langkah ini menggunakan ZScore di dalam basket.
Secara sederhana, ini melihat apakah suatu saham relatif lebih kuat atau lebih lemah dibandingkan saham lain di sektor yang sama. Jika suatu saham tiba-tiba melesat sementara saham lain dalam basket yang sama belum bereaksi secara sinkron, maka mungkin ada peluang penyebaran.
Logika inti perhitungan ZScore basket adalah sebagai berikut:
python
def calc_basket_zscores(store, symbols):
returns = {}
min_len = 999999
for symbol in symbols:
bars = get_records(
store["markets"][symbol]["contract"],
KLINE_PERIOD,
SYNC_WINDOW + 10
)
if len(bars) < SYNC_WINDOW + 2:
return None
r = calc_returns(bars)[-SYNC_WINDOW:]
returns[symbol] = r
min_len = min(min_len, len(r))
latest = {s: returns[s][-1] for s in symbols}
avg_latest = mean(list(latest.values()))
dev_series = {s: [] for s in symbols}
for i in range(min_len):
row = [returns[s][-min_len + i] for s in symbols]
row_avg = mean(row)
for s in symbols:
dev_series[s].append(returns[s][-min_len + i] - row_avg)
zscores = {}
max_abs = 0
for s in symbols:
sigma = std(dev_series[s])
z = (latest[s] - avg_latest) / sigma if sigma > 0 else 0
zscores[s] = round(z, 3)
max_abs = max(max_abs, abs(z))
return {"zscores": zscores, "maxAbs": max_abs}
Jika deviasi maksimum suatu basket melebihi ambang batas breakout, maka akan memasuki status BREAKOUT_DETECTED. Pada saat ini sistem tidak akan langsung trading, tetapi mulai mencari penyebab.
Berita hanya bertugas menjelaskan, hubungan statistik bertugas memverifikasi
Ketika leader mengalami breakout harga, sistem akan mengambil berita terbarunya, lalu meminta model besar menilai apakah berita tersebut dapat menjelaskan pergerakan harga yang tidak normal.
Namun, di sini bukan sekadar bertanya "Apakah berita ini positif?".
Sistem akan memberikan basket saat ini, intelijen sektor, status harga real-time, ZScore leader, kandidat follower, hubungan statistik yang telah diverifikasi, serta berita yang diambil dari BraveSearch, semuanya kepada model besar.
Model besar perlu menjawab:
(1) Apakah berita ini dapat menjelaskan abnormalitas harga leader.
(2) Apakah arah berita konsisten dengan arah harga.
(3) Apakah trading diizinkan.
(4) Follower mana yang terpengaruh.
(5) Seberapa besar dampak untuk setiap follower.
(6) Mengapa follower-follower tersebut mungkin terpengaruh.
Logika inti pencarian penyebab adalah sebagai berikut:
python
def explain_breakout_with_news(store, bid, leader, direction, leader_z, followers, edges):
if not BRAVE_KEY:
return None
if not LLM_API_KEY:
return None
profile = store["profiles"].get(leader, {})
news = fetch_stock_news(profile, bid)
if not news:
return None
event = analyze_breakout_news_with_llm(
store, bid, leader, direction, leader_z,
followers, edges, news
)
if not event:
return None
if not event.get("explains_price_move"):
return None
expected_direction = "bullish" if direction == "long" else "bearish"
if event.get("direction") != expected_direction:
return None
event["confidence"] = normalize_confidence(event.get("confidence", 0))
if event["confidence"] < MIN_NEWS_CONFIDENCE:
return None
if not event.get("trade_allowed"):
return None
return event
Tetapi meskipun model besar mengatakan bahwa seorang follower mungkin terpengaruh, kita tidak bisa langsung bertransaksi.
Juga harus melihat hubungan statistik K-line.
Sistem akan menghitung hubungan historis antar saham di setiap basket, misalnya apakah target sering mengikuti setelah source breakout, bagaimana korelasinya, berapa siklus lag optimal, dan bagaimana rata-rata return mengikuti.
Hanya source -> target yang lolos hubungan statistik yang akan menjadi active edge.
python
def rebuild_basket_stats(store):
edges = []
for bid, basket in store["baskets"].items():
symbols = [
m["symbol"] for m in basket["members"]
if m["symbol"] in store["markets"]
]
for source in symbols:
for target in symbols:
if source == target:
continue
metric = validate_pair(store, source, target)
if not metric:
continue
source_exp = basket_member_info(basket, source).get("exposure", 0)
target_exp = basket_member_info(basket, target).get("exposure", 0)
score = clamp(
metric["corr"] * 0.3 +
metric["follow"] * 0.4 +
min(source_exp, target_exp) * 0.3,
0, 1
)
edge = {
"basket": bid,
"source": source,
"target": target,
"corr": round(metric["corr"], 3),
"follow": round(metric["follow"], 3),
"lag": metric["lag"],
"avgReturn": round(metric["avgReturn"], 6),
"sample": metric["sample"],
"score": round(score, 3),
"active": (
score >= MIN_EDGE_SCORE and
metric["corr"] >= MIN_CORR and
metric["follow"] >= MIN_FOLLOW_SUCCESS
),
"updatedAt": int(time.time()),
}
edges.append(edge)
store["edges"] = edges
Langkah ini sangat penting.
Model besar pandai memahami logika, tetapi pasar belum tentu berjalan sesuai logika. Hubungan statistik digunakan untuk memvalidasi: apakah logika ini pernah diperdagangkan di pasar sebelumnya?
Yang diperdagangkan adalah difusi, bukan mengejar puncak
Strategi ini bukan untuk mengejar leader.
Leader sudah breakout, mengejarnya langsung mudah menjadi mengejar puncak. Yang benar-benar ingin dilakukan strategi adalah peluang difusi dalam basket AI yang sama.
Yaitu: leader sudah bergerak, berita juga masuk akal, tetapi beberapa follower belum sepenuhnya bereaksi. Jika follower ini dan leader memang memiliki hubungan keterkaitan secara historis, mungkin ada peluang mengikuti jangka pendek.
Dalam pemindaian breakout, pertama cari active edge, lalu cari follower yang tertinggal:
python
def scan_price_breakouts(store):
for bid, rt in store["realtime"].items():
if rt["state"] != "BREAKOUT_DETECTED":
continue
leader = rt["leader"]
z = 0
for m in rt["members"]:
if m["symbol"] == leader:
z = m["z"]
direction = "long" if z > 0 else "short"
edges = [
e for e in store["edges"]
if e["active"] and e["basket"] == bid and e["source"] == leader
]
followers = []
for e in edges:
target_rt = find_realtime_member(rt, e["target"])
if target_rt and abs(target_rt["z"]) < BREAKOUT_THRESHOLD * 0.75:
followers.append(e["target"])
if not followers:
continue
Hanya ketika penelusuran penyebab berita juga lolos, barulah akan menghasilkan confirmed signal.
Objek perdagangan terutama adalah follower.
Jika saat ini tidak ada posisi, buka posisi sesuai arah sinyal. Jika kontrak yang sama sudah memiliki posisi searah, tambah posisi. Jika sudah memiliki posisi berlawanan, tutup posisi terlebih dahulu, lalu buka posisi sesuai arah baru.
python
def execute_symbol_trade(store, signal, symbol, detail):
direction = signal["direction"]
if TRADE_MODE != "trade":
return open_or_add_position(store, signal, symbol, detail, add_mode=False)
pos = get_position_by_symbol(symbol)
if pos:
pos_dir = position_direction(pos)
if pos_dir == direction:
return open_or_add_position(store, signal, symbol, detail, add_mode=True)
close_existing_position(store, symbol, pos, "reverse_signal")
Sleep(1000)
return open_or_add_position(store, signal, symbol, detail, add_mode=False)
Ini juga karena banyak saham muncul secara bersamaan di beberapa basket. Sebuah saham mungkin menjadi follower di AI Cloud, dan menjadi anggota dari logika lain di AI Application. Sinyal dari basket yang berbeda mungkin memengaruhinya secara bersamaan, sehingga perlu menangani arah kontrak yang sama secara terpadu.
Manajemen risiko dibuat sederhana dulu, tetapi harus ada
Dalam hal manajemen risiko, saat ini menggunakan hard stop loss dan trailing stop loss.
Jika kerugian mencapai ambang batas, keluar; setelah profit mencapai tingkat tertentu, aktifkan trailing stop loss, jika terjadi penarikan terlalu banyak dari floating profit tertinggi, kunci profit dan keluar.
python
def monitor_positions(store):
for pos in exchange.GetPosition() or []:
symbol = position_symbol(pos)
if symbol not in store["markets"]:
continue
state = _G(position_state_key(symbol)) or {}
market = store["markets"][symbol]
ticker = exchange.GetTicker(market["contract"])
direction = position_direction(pos)
pnl_pct = (
(ticker["Last"] - pos["Price"]) /
pos["Price"] * 100 *
(1 if direction == "long" else -1)
)
if pnl_pct > state.get("peakPnlPct", 0):
state["peakPnlPct"] = pnl_pct
if not state.get("trailActive") and state.get("peakPnlPct", 0) >= TRAIL_ACTIVATE_PCT:
state["trailActive"] = True
hard_stop = False
if state.get("stop"):
hard_stop = (
ticker["Last"] <= state["stop"]
if direction == "long"
else ticker["Last"] >= state["stop"]
)
trail_hit = False
if state.get("trailActive"):
giveback = state.get("peakPnlPct", 0) - pnl_pct
allowed = max(
1.5,
state.get("peakPnlPct", 0) * TRAIL_GIVEBACK_PCT / 100.0
)
trail_hit = giveback >= allowed
if hard_stop or trail_hit:
close_existing_position(
store, symbol, pos,
"hard_stop" if hard_stop else "trailing_stop"
)
Ini belum merupakan versi final dari risk control, tetapi sudah cukup memadai sebagai pengamatan real-time versi pertama.
Ke depannya masih perlu ditambahkan batasan total posisi di level akun, eksposur per sektor, limit kerugian harian, konfirmasi eksekusi, dan batasan jumlah penambahan posisi.
Sejauh Mana Sistem Ini Sudah Berjalan?
Sistem saat ini sudah mampu menyelesaikan satu siklus penelitian yang cukup lengkap.
Sistem dapat secara otomatis memindai kontrak saham TradFi, secara otomatis meminta model besar untuk membuat profil basket saham long, secara otomatis membangun sub-sektor AI, secara otomatis menarik informasi sektor dan saham individual melalui BraveSearch, secara otomatis merangkum intelijen sektor, secara otomatis mendeteksi kekuatan real-time setiap basket, secara otomatis menghitung hubungan follower di dalam basket, dan melakukan pelacakan berita setelah terjadi breakout harga pada leader.
Jika penjelasan berita terbukti valid, arahnya konsisten, dan hubungan statistik juga mendukung, sistem akan menghasilkan confirmed signal. Dalam mode default, hanya memberikan notifikasi, tanpa trading real; setelah beralih ke mode trade, baru akan melakukan transaksi.
Halaman real-time tidak lagi hanya menampilkan log, melainkan menampilkan gambaran umum sistem, status real-time basket, intelijen sektor, sinyal terkini, transaksi terbaru, dan langkah-langkah terbaru dalam bentuk tabel. Dengan demikian, dapat terlihat dengan jelas di langkah mana sistem terhenti: apakah hanya karena anomali harga, atau karena tidak ada penjelasan berita, atau karena follower tidak memenuhi kondisi, atau karena intervensi risk control.
Hal-hal yang Masih Belum Matang
Sejujurnya, sistem ini belum bisa dikategorikan sebagai strategi trading otomatis yang matang.
Sistem ini lebih menyerupai kerangka kerja riset rotasi tema AI, yang telah mampu menghubungkan "profil saham, intelijen sektor, anomali harga, pelacakan berita, verifikasi statistik, sinyal trading", namun masih perlu terus diuji.
Beberapa aspek yang paling perlu disempurnakan:
(1) Kualitas profil saham. Model besar terkadang memasukkan saham-saham pinggiran ke dalam basket, sehingga asset_type harus dipaksakan untuk menghindari tercampurnya ETF, indeks, atau dana regional.
(2) Kualitas berita. Tidak semua berita yang diperoleh BraveSearch merupakan berita inti; model perlu menilai mana yang benar-benar dapat menjelaskan pergerakan harga.
(3) Hubungan statistik. Hubungan follower historis tidak menjamin validitas di masa depan, perlu dilakukan review berkelanjutan.
(4) Risk control trading. Sebelum melakukan trading otomatis, harus ditambahkan batasan posisi di level akun, eksposur sektor, kerugian harian, dan konfirmasi eksekusi.
Oleh karena itu, saat ini lebih cocok untuk menjalankan mode notify terlebih dahulu, dan melihat kualitas dari confirmed signal.
Jika setelah beberapa waktu ditemukan bahwa sinyal memang mampu menjelaskan pergerakan pasar yang tidak biasa, dan follower sering bereaksi setelahnya, barulah dipertimbangkan untuk trading real dengan posisi kecil.
Penutup
Strategi ini tidak membuat AI langsung melakukan order.
Saya selalu berpendapat bahwa posisi yang paling tepat untuk model besar dalam sistem trading bukanlah "memberi tahu saya apa yang harus dibeli", melainkan membantu kita memproses struktur informasi yang sulit dipertahankan secara manual: bisnis perusahaan, afiliasi sektor, berita real-time, interpretasi peristiwa, jalur rotasi modal, dan pihak-pihak yang berpotensi terpengaruh.
Trading yang sesungguhnya harus tetap diserahkan pada harga, statistik, dan risk control.
Strategi kuantitatif di era AI seharusnya tidak hanya menambahkan satu antarmuka model besar, melainkan menghubungkan data real-time, grafik tematik, berita peristiwa, struktur harga, eksekusi trading, dan interpretasi review.
Strategi grafik saham AI ini adalah sebuah upaya yang dilakukan sepanjang arah tersebut.
Kode sumber strategi: AI 产业链 TradFi 合约图谱交易系统
- 1





