researcher: Arsip Riset Kuantitatif yang Dapat Dicari untuk Manusia dan Agen AI
Riset kuantitatif ada di mana-mana sekaligus tidak ada di mana pun. Makalah yang Anda butuhkan ada di arXiv. Implementasi rujukannya ada di GitHub. Intuisinya terkubur dalam sebuah pos blog yang ditulis seseorang pada tahun 2019. Logika entry/exit yang sebenarnya adalah skrip Pine di TradingView dengan 400 suka dan tanpa dokumentasi. Empat korpus, empat kotak pencarian, empat set konvensi, nol referensi silang. Ketika Anda mencoba memutuskan apakah sebuah gagasan layak untuk dibacktest selama seminggu, fragmentasi itulah biaya yang sebenarnya — bukan pada membacanya, melainkan pada menemukannya.
Maka kami membangun sendiri. researcher.marketmaker.cc adalah arsip terkurasi dan mesin pencari untuk riset trading kuantitatif. Ia menyatukan materi yang biasanya tersebar di arXiv, GitHub, blog kuant, dan TradingView ke dalam satu tempat, mengindeks semuanya untuk pencarian teks penuh, dan — ini bagian yang paling kami pedulikan — memaparkan seluruh korpus kepada agen AI melalui endpoint Model Context Protocol (MCP) dan REST API publik. Ini adalah substrat riset yang dapat ditelusuri manusia dengan keyboard dan dikueri agen dengan satu pemanggilan tool, didukung oleh indeks yang sama persis.
Pos ini adalah tinjauan tentang apa yang ada di dalamnya, bagaimana ia dibangun, dan mengapa ia menempati posisinya dalam stack agen AI kami.
Apa yang Ada di Dalam Korpus

researcher menyatukan empat dataset utama, masing-masing dengan indeks teks penuhnya sendiri. Jumlah di bawah ini adalah per 2026-06-12, dan angkanya bergerak — pipeline arXiv berjalan setiap hari dan indeks dibangun ulang dari sumber, sehingga angkanya terus bertambah.
| Dataset | Sumber | Dokumen | Apa yang Anda cari |
|---|---|---|---|
| Makalah | arXiv q-fin (1997–2026) | ~18.647 | judul, abstrak, penulis (filter berdasarkan kategori) |
| Kode | Repositori GitHub | ~12.957 | nama, deskripsi, topik (filter berdasarkan bahasa, stars) |
| Artikel | Blog kuant | ~4.633 | judul, deskripsi (filter berdasarkan sumber, tanggal) |
| Strategi | Skrip Pine TradingView | ~15.180 | judul, deskripsi, tag (filter berdasarkan kategori) |
Itu sedikit lebih dari 51.000 dokumen di seluruh empat indeks yang dapat dicari. Indeks makalah adalah korpus tunggal terbesar dan yang paling banyak kami garap: itu adalah seluruh aliran riset keuangan kuantitatif arXiv (q-fin.*) yang membentang hingga tahun 1997, bukan subset yang dipilih tangan. Sebelumnya situs ini hanya menyajikan beberapa ratus makalah terkurasi; indeks saat ini adalah korpus q-fin lengkap, dengan provenans terkurasi digabungkan di atasnya sehingga sebuah makalah yang juga dirujuk oleh blog kuant tertentu membawa atribusi tersebut.
Di luar empat indeks pencarian, situs yang menghadap manusia menambahkan lebih banyak lagi: catatan riset dan rangkuman harian yang kami tulis sendiri, direktori situs dan penulis kuant, sebuah bagian video yang mengindeks kanal YouTube yang relevan, dan direktori dana. Keempat indeks adalah tulang punggung yang dapat dicari; segala sesuatu yang lain adalah kurasi di sekelilingnya.
Sumber Kebenaran Tunggal

Hal yang diam-diam rusak bagi kami di awal — dan hal yang kini kami rancang dengan keras untuk menghindarinya — adalah ketidaksesuaian jumlah. Halaman utama menyebut satu angka, pencarian mengembalikan angka lain, API angka ketiga. Pada suatu titik halaman depan mengiklankan 719 makalah sementara pencarian mengembalikan lebih dari 18.000. Tidak ada yang lebih merusak kepercayaan pada sebuah tool riset selain korpus yang tidak bisa sepakat dengan dirinya sendiri tentang seberapa besar ukurannya.
Solusinya adalah membuat setiap permukaan membaca dari satu tempat. Untuk korpus makalah, Meilisearch adalah sumber kebenaran. Tidak ada salinan kedua dari makalah yang berdiam di dalam bundel aplikasi; jumlah di halaman utama, jumlah di /papers, jumlah yang dikembalikan API, dan dokumen yang benar-benar Anda cari semuanya adalah indeks yang sama. Korpus itu sendiri dibangun secara offline oleh sebuah langkah ingesti yang mengambil set makalah terkurasi, menggabungkannya dengan aliran arXiv (dideduplikasi berdasarkan id arXiv, dengan array provenans digabungkan), mengurutkan dari yang terbaru, dan menulis satu file ~25 MB yang dikonsumsi oleh indexer. File itu kira-kira berisi 15.000–18.000 rekaman dan secara sengaja tidak dibundel ke dalam klien — korpus seukuran itu tidak ada urusan untuk dikirim ke browser.
Tiga dataset lainnya (kode, artikel, skrip Pine) dibaca di sisi server dari file JSON-nya dan diindeks dari file yang sama, dengan migrasi ke Meili-sebagai-sumber sebagai langkah berikutnya yang direncanakan. Aturannya menyeluruh: baca data di server, jangan pernah import dataset berukuran multi-megabyte ke dalam bundel klien, dan biarkan indeks serta jumlah yang ditampilkan berasal dari asal yang sama. Desinkronisasi menjadi mustahil secara struktural.
Pencarian: Teks Penuh, Toleran terhadap Typo, Berfaset

Mesin pencariannya adalah Meilisearch, berjalan di server yang sama dengan aplikasi dan terikat ke localhost — ia tidak dipaparkan secara publik. Kami menggunakannya sebagai mesin pencari teks penuh, bukan penyimpan vektor. Tidak ada embedding, tidak ada keajaiban kemiripan semantik. Untuk "temukan saya makalah dan repo yang menyebut konsep ini," pencarian leksikal yang toleran terhadap typo atas judul, abstrak, deskripsi, penulis, dan tag terasa cepat, dapat diprediksi, dan dapat di-debug dengan cara yang tidak dimiliki indeks embedding. Setiap indeks menyimpan dokumen asli lengkap ditambah _id tambahan, sehingga pencarian mengembalikan rekaman yang terhidrasi penuh yang dapat dirender langsung oleh aplikasi — tanpa pengambilan kedua untuk merehidrasi hasil.
Beberapa detail yang penting dalam praktiknya:
-
Toleransi typo dan pemeringkatan relevansi datang secara cuma-cuma dari Meilisearch. Mencari
momentmtetap menemukan makalah momentum; hasilnya diperingkat, bukan sekadar difilter. -
Pemfilteran berfaset. Makalah difilter berdasarkan
categoryarXiv (q-fin.PM,q-fin.TR, …), repo berdasarkanlanguagedanstars, artikel berdasarkansourcedandate, skrip Pine berdasarkancategory. Halaman/papersmembangun dropdown kategorinya dari distribusi faset langsung dari indeks, sehingga opsi filter selalu mencerminkan apa yang sebenarnya ada di dalam korpus. -
Pemisahan camelCase. Meilisearch melakukan tokenisasi pada spasi dan tanda baca tetapi tidak pada camelCase. Itu berarti sebuah repo yang secara harfiah bernama
TradingAgentsakan menjadi satu token tunggal, tak terjangkau oleh kueri alami "trading agents." Selama pengindeksan kami menurunkan sebuah fieldname_split—TradingAgents→TradingAgents Trading Agents,ai-hedge-fund→ai-hedge-fund ai hedge fund— dan menambahkannya ke atribut yang dapat dicari. Token asli disimpan lebih dahulu sehingga pencocokan nama persis tetap berperingkat paling tinggi, dan field turunan tidak pernah dikembalikan ke klien. Hal kecil ini yang membuat perbedaan antara menemukan repo unggulan dan tidak. -
Telusuri = terbaru lebih dulu. Kueri kosong bukanlah kesalahan; itu adalah jalur penelusuran. Di
/paperskueri kosong mengurutkan berdasarkanpublishedsecara menurun, sehingga halaman itu berfungsi ganda sebagai feed kronologis terbalik dari riset q-fin terbaru. -
Indeks sampingan untuk agregat. Beberapa angka tidak dapat dihitung Meilisearch dengan murah pada waktu kueri — total stars di semua repo, total file Python, total notebook. Daripada memindai seluruh korpus pada setiap pemuatan halaman, indexer menulis jumlah-jumlah itu sekali, pada waktu pengindeksan, ke dalam sebuah indeks kecil
researcher_metayang menyimpan satu dokumen per dataset. Endpointstatsmembacanya kembali secara langsung. Jumlah yang berubah hanya pada saat reindex dihitung hanya pada saat reindex. -
Plafon paginasi yang benar-benar dapat dipakai. Indeks makalah menaikkan
maxTotalHitsMeilisearch menjadi 50.000 dan menandaipublishedsebagai dapat diurutkan, sehingga Anda dapat menelusuri jauh ke dalam korpus ~18 ribu dokumen dan mengurutkan keseluruhannya dari yang terbaru — bukan hanya halaman pertama dari hasil relevansi.
Indexer bersifat idempoten: ia membuat setiap indeks jika tidak ada, menerapkan ulang setelan, dan melakukan upsert setiap dokumen dalam batch 2.000 yang dikunci berdasarkan _id (makalah menurunkannya dari id arXiv, repo dan artikel dari hash URL). Karena seluruh indeks dapat direkonstruksi dari file sumber, tidak ada cadangan yang perlu dikelola — rollback hanyalah reindex. Menjalankannya ulang aman secara konstruksi.
Dapat Diakses Agen: MCP dan API Publik

Inilah bagian yang mengikat researcher ke sisanya dari apa yang kami lakukan. Korpus ini bukan sekadar situs web dengan kotak pencarian — ia adalah tool yang dapat dipanggil agen AI.
Endpoint MCP
researcher memaparkan server Model Context Protocol di /api/mcp melalui Streamable HTTP. Agen apa pun yang kompatibel dengan MCP — Claude, agen kustom dalam stack kami sendiri, apa pun yang berbicara protokol ini — dapat terhubung dan memanggil tool baca-saja terhadap korpus langsung. Ada 13 tool, dikelompokkan berdasarkan dataset, mengikuti bentuk search / get / list yang konsisten:
| Grup | Tool |
|---|---|
| Makalah | search_papers, get_paper, list_papers |
| Kode | search_repos, get_repo, list_repos |
| Artikel | search_articles, get_article, list_articles_by_site |
| Strategi | search_pine, get_pine_script, list_pine |
| Pengetahuan | knowledge_query (stub yang anggun, dicadangkan untuk lapisan graf di masa depan) |
Skema tool ditulis untuk kepentingan agen, bukan manusia. search_papers, misalnya, mengiklankan dirinya sebagai pencarian yang diperingkat berdasarkan relevansi dan toleran terhadap typo atas judul, abstrak, dan penulis, dengan filter category opsional (mis. q-fin.PM) dan batas hasil — dan memberi tahu agen untuk memanggil get_paper guna mendapatkan abstrak lengkap setelah ia mempersempit pilihan. search mengembalikan hasil yang ringkas seukuran cuplikan sehingga agen dapat memindai banyak hasil dengan murah; get mengembalikan rekaman lengkap setelah ia memilih salah satunya. Bentuk dua langkah itu menjaga jendela konteks agen agar tidak tenggelam dalam abstrak yang tidak ia butuhkan.
Secara konkret, agen yang menyelidiki, katakanlah, optimal execution dapat menjalankan search_papers("optimal execution", category: "q-fin.TR") untuk mendapatkan daftar pendek judul dan cuplikan yang diperingkat, search_repos("optimal execution", language: "Python") untuk menemukan implementasi yang diurutkan berdasarkan relevansi dan dapat difilter berdasarkan stars, dan search_pine("VWAP") untuk melihat bagaimana gagasan yang sama muncul sebagai strategi TradingView yang dipublikasikan — tiga pemanggilan tool terhadap tiga korpus yang, satu jam lalu, adalah tiga situs web berbeda. Lalu satu get_paper menarik abstrak lengkap untuk yang tampak menjanjikan. Agen tidak pernah meninggalkan protokol, dan setiap hasil adalah rekaman nyata dan terhidrasi alih-alih stub hasil pencarian yang harus diambil ulang.
REST API publik
Untuk konsumen non-MCP ada permukaan REST paralel di bawah /api/v1/: papers, repos, articles, pine, dan agregat stats. Ia berbicara JSON polos dengan parameter q, category, limit, dan offset, mengembalikan total sebenarnya dan distribusi faset di samping setiap halaman, serta berkemampuan CORS. GET /api/v1/papers?q=optimal+execution&category=q-fin.TR adalah satu baris dari mana saja. Endpoint yang sama menggerakkan halaman /papers milik situs itu sendiri — browser hanyalah klien API lainnya.
Gagal secara jujur
Backend pencarian yang berbohong lebih buruk daripada yang mati. Kami mengambil sikap yang disengaja tentang apa yang terjadi ketika Meilisearch tidak dapat dijangkau. Lapisan data melempar (throw) saat gagal alih-alih diam-diam mengembalikan hasil kosong — dan pemanggil yang memutuskan cara menanganinya. Untuk dataset yang masih menyimpan salinan dalam memori, tool melakukan fallback ke .filter() polos atas salinan itu, sehingga situs tetap menyala. Untuk makalah, di mana Meilisearch adalah sumber kebenaran dan tidak ada salinan kedua, tool dan API mengembalikan error eksplisit (API merespons 503) alih-alih menyajikan data basi atau parsial. Setiap pemanggilan pencarian memiliki timeout singkat sehingga indeks yang menggantung tidak dapat menghentikan sebuah tool. Prinsipnya: merosot dengan lantang, jangan pernah diam-diam menyerahkan jawaban yang salah.
Bagaimana Data Masuk

Korpus diberi makan oleh pipeline scraper, semuanya berjalan terhadap sumber bebas dan publik.
- Makalah berasal dari API Atom arXiv. Sebuah harvester menarik korpus
q-finlengkap ke dalam JSONL, sebuah langkah build menggabungkannya dengan set terkurasi (dedup berdasarkan id arXiv, provenans digabungkan), dan hasilnya diserahkan ke indexer. Harvester juga memiliki mode "perkaya id-id spesifik ini" untuk menyemai dari daftar bacaan eksternal. - Kode adalah crawl repositori GitHub yang relevan dengan kuant, ditangkap dengan metadata yang penting untuk pemfilteran — stars, forks, bahasa utama, topik, serta jumlah file Python dan notebook.
- Artikel di-scrape dari blog dan agregator kuant, dengan yang lebih baik dicerminkan secara lokal agar bertahan dari link rot. Halaman utama menandai artikel mana yang telah kami simpan salinan lokalnya.
- Strategi adalah skrip Pine TradingView dengan metadatanya — penulis, kategori, tag, suka, dan apakah listingnya menyertakan kode, chart, atau analisis.
- Video mengindeks kanal YouTube yang relevan sehingga talk dan walkthrough dapat ditemukan bersama materi tertulis.
Reindexing di produksi berjalan melalui terowongan SSH ke Meilisearch yang terikat ke localhost, karena mesin tidak pernah dipaparkan ke internet. Seluruh loop — harvest, build, deploy, index — dirancang untuk dijalankan ulang secara idempoten, yang persis seperti yang dilakukan cron harian.
Akses dan Hosting

researcher berjalan di Server 1 kami sebagai stack Docker Compose kecil: sebuah kontainer Next.js di belakang Traefik dan sebuah kontainer Meilisearch yang terikat ke localhost. Aplikasi Next.js membaca datasetnya di sisi server dan berkomunikasi dengan Meilisearch melalui jaringan internal.
Akses dibatasi melalui auth.marketmaker.cc, layanan identitas bersama kami. Token adalah JWT RS256 yang diverifikasi terhadap JWKS layanan auth — setiap keputusan otorisasi memeriksa tanda tangan (dengan pemeriksaan issuer dan algoritma yang ketat, gagal-tertutup jika endpoint kunci tidak dapat dijangkau), dan jalur decode tanpa verifikasi hanya digunakan untuk UI kosmetik seperti menampilkan email Anda di navbar. Layanan auth menerbitkan peran per-layanan; pada researcher peran admin membatasi area admin internal (tempat kami menjalankan dan memantau scraper), dan halaman utama publik tidak memerlukan token sama sekali. Ini adalah fabrik auth yang sama yang menjadi muka tool internal kami yang lain, sehingga satu login berlaku di seluruh ekosistem.
Di Mana Ia Cocok dalam Stack Marketmaker

researcher adalah infrastruktur, bukan tujuan akhir. Intinya bukan situs webnya — melainkan bahwa kami kini memiliki tampilan yang dapat dikueri atas bidang ini yang dibagikan baik oleh orang maupun agen.
Bagi kami sebagai manusia, di situlah banyak isi dari blog ini berasal. Ketika kami meninjau sebuah tool seperti VectorBT atau membedah sebuah framework seperti TradingAgents atau Fincept Terminal, titik awalnya sering kali adalah pencarian di seluruh researcher: makalah apa yang menjadi fondasi ini, repo apa lagi yang memecahkan masalah yang sama, siapa yang menulis tentangnya. Arsip adalah corongnya; pos blog adalah apa yang jatuh keluar darinya.
Bagi agen AI kami, ini adalah sesuatu yang lebih struktural. Substrat riset yang dapat dijangkau melalui MCP berarti agen yang mengerjakan strategi tidak harus men-scrape arXiv secara langsung, menjuggling empat API berbeda, atau menebak-nebak apa yang ada di luar sana — ia memanggil search_papers, search_repos, search_pine terhadap korpus yang sudah terpadu, terdeduplikasi, dan terindeks. Itu adalah arah yang sama dengan perkakas command-and-operate (cmdop) dan agen kami: berikan agen tool yang bertipe, baca-saja, dan terdokumentasi dengan baik atas data nyata, gagal dengan lantang ketika backend tidak tersedia, dan biarkan satu backend bersama melayani UI manusia dan antarmuka mesin dari indeks yang identik. Manusia menelusuri dan agen mengkueri — tetapi keduanya melihat arsip yang sama, dan itulah keseluruhan gagasannya.
Kesimpulan
researcher berawal sebagai solusi untuk masalah kecil yang menjengkelkan — bahwa riset kuant tersebar di empat tempat yang tidak saling berbicara — dan berubah menjadi sesuatu yang kami andalkan setiap hari. Kira-kira 51.000 dokumen di seluruh makalah, kode, artikel, dan strategi, semuanya di belakang satu mesin pencari teks penuh, semuanya dapat dijangkau baik oleh manusia dengan browser maupun oleh agen dengan klien MCP. Ia sengaja tidak glamor: pencarian teks penuh, bukan embedding; satu sumber kebenaran, bukan cache yang pintar; tool yang melempar error secara jujur, bukan yang menutup-nutupi gangguan.
Jika Anda membangun agen untuk riset trading, pelajarannya menggeneralisasi melampaui korpus kami yang khusus ini: hal dengan daya ungkit tertinggi yang dapat Anda berikan kepada agen bukanlah model yang lebih besar melainkan tampilan data yang ia butuhkan yang bersih, terpadu, dan dapat dikueri — dipaparkan melalui indeks yang sama yang dipercaya manusia. Itulah researcher.
Penulis
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.