Suy nghĩ về Vibe Trading: Khi nào nên dùng AI, khi nào không.
Gần đây có một khái niệm gọi là Vibe Trading – dùng ngôn ngữ tự nhiên mô tả ý định giao dịch, để AI tự động thực thi. Nói một câu "chiến lược thận trọng, ưu tiên tài sản biến động thấp", AI tự động cấu hình cho bạn. Nghe có vẻ hay.
Nhưng trước khi nói về Vibe Trading, tôi muốn kể một câu chuyện gần đây, nó giải thích rõ hơn bất kỳ lý thuyết nào về "AI nên được dùng ở đâu".
Ngày 31 tháng 3, Claude Code của Anthropic đã vô tình để lộ mã nguồn trong một lần cập nhật npm – khoảng 512.000 dòng TypeScript (lưu ý: đây là tổng lượng code sau khi đóng gói, bao gồm dependencies và code sinh ra). Cộng đồng nhanh chóng phân tích ngược, các lập trình viên trên toàn thế giới lục tung code tìm tính năng mới.
Nhưng phát hiện khiến tôi bất ngờ nhất, không liên quan đến AI. Bản thân phát hiện này cũng không liên quan đến giao dịch, nhưng triết lý kỹ thuật đằng sau nó, những người làm quantitative hẳn sẽ có đồng cảm.
Trong một module được phân tích đánh dấu là userPromptKeywords, có một đoạn regex dùng để khớp các từ thô tục như shit, wtf, fucking broken – để nhanh chóng xác định xem người dùng có đang chửi thề không.
Công ty mô hình ngôn ngữ lớn hàng đầu thế giới dùng regex để phát hiện cảm xúc.
Không phải gọi Claude để phân tích cảm xúc. Không phải huấn luyện một bộ phân loại. Mà là một phép so khớp chuỗi chạy trong micro giây.
Tại sao?
1. Tại sao Anthropic không dùng AI của chính mình
Đây không phải là lười biếng. Đây là một quyết định kỹ thuật được cân nhắc kỹ lưỡng.
Claude Code xử lý hàng trăm nghìn tương tác người dùng mỗi ngày. Mỗi tương tác cần đánh giá "người dùng có biểu hiện sự thất vọng không" để điều chỉnh chiến lược phản hồi. Nếu mỗi lần đều gọi LLM để đánh giá:
- Độ trễ: Một lần suy luận LLM ít nhất vài trăm mili giây, regex khớp vài micro giây
- Chi phí: Gọi LLM tính theo token, regex gần như miễn phí
- Tính xác định: Regex hoặc khớp hoặc không, kết quả 100% xác định; đầu ra của LLM không xác định, cùng một đầu vào có thể cho đánh giá khác nhau
Vậy lựa chọn của Anthropic là: Dùng regex để sàng lọc nhanh (ngưỡng thấp, tốc độ cao, tính xác định mạnh), dành sức mạnh LLM cho những quyết định thực sự cần hiểu ngữ nghĩa.
Đây không phải là chi tiết kỹ thuật. Đây là một triết lý kiến trúc: Không phải mọi vấn đề đều đáng giải quyết bằng AI.
Những người làm quantitative hẳn sẽ đặc biệt đồng cảm với điều này.
2. Cùng một bài toán lựa chọn trong giao dịch định lượng
Trong chiến lược của bạn có hai loại quyết định:
Quyết định xác định – Nên dùng "quy tắc"
Ai đã viết chiến lược trên FMZ đều biết, logic giao dịch cốt lõi thường chỉ là vài dòng code xác định:
javascript
// Tín hiệu giao nhau đường trung bình – Ví dụ FMZ JavaScript
var records = exchange.GetRecords(PERIOD_D1)
var ma5 = TA.MA(records, 5)
var ma20 = TA.MA(records, 20)
var idx = records.length - 1
// Vàng giao cắt mua lên
if (ma5[idx] > ma20[idx] && ma5[idx-1] <= ma20[idx-1]) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 1)
Log("Đường trung bình vàng giao cắt, mở lệnh mua")
}
Điều kiện rõ ràng, kết quả xác định, không cần "hiểu" ngữ nghĩa. Dùng if-else, độ tin cậy 100%, thực thi trong mili giây.
Cùng ý tưởng với Anthropic dùng regex phát hiện cảm xúc – Vấn đề xác định, dùng công cụ xác định. Tất nhiên, regex là so khớp chuỗi, đường trung bình là tính toán toán học, công cụ khác nhau, nhưng vai trò của chúng trong mỗi hệ thống cũng tương tự: đều là phán đoán xác định không cần AI can thiệp.
Việc cắt lỗ, giao cho if-else thì độ tin cậy 100%, giao cho AI thì độ tin cậy là "phần lớn". Tài khoản của bạn không chịu nổi xác suất nhỏ đó.
Quyết định mơ hồ – Nên dùng AI
Nhưng có những quyết định không thể viết bằng if-else:
- Phân tích cảm xúc tin tức: Thông báo Fed ra, là diều hâu hay bồ câu? "Giữ nguyên lãi suất hiện tại, nhưng ủy ban sẽ theo dõi chặt chẽ dữ liệu" – câu này là tin tốt hay xấu? Đường trung bình không thể cho bạn biết, regex cũng không làm được đánh giá này.
- Phát hiện bất thường: Khối lượng thảo luận mạng xã hội của một altcoin nào đó tăng 800% trong 3 giờ, nhưng giá chưa động. Đây là "smart money đang vào lệnh" hay "ai đó đang tạo đà trước khi kéo giá"? Cần kết hợp thông tin đa chiều để đưa ra phán đoán mơ hồ.
- Sinh chiến lược: Bạn có một trực giác – "sau dạng mẫu này thường có một đợt tăng". Nhưng bạn không nói rõ điều kiện cụ thể. Bạn có thể mô tả trực giác này cho LLM, để nó giúp bạn chuyển đổi thành yếu tố định lượng có thể backtest.
Đặc điểm chung của các tình huống này: Đầu vào phi cấu trúc, tiêu chí đánh giá mơ hồ, cần "hiểu" chứ không chỉ "khớp".
3. Một cách phân lớp có thể tham khảo
Quay lại kiến trúc của Claude Code. Phân tích cộng đồng cho thấy một sự phân lớp rõ ràng:
| Lớp | Cơ chế trong Claude Code | Tương ứng trong giao dịch định lượng |
|---|---|---|
| Lớp sàng lọc nhanh | Regex, so khớp từ khóa | Đường trung bình giao cắt, cắt lỗ ngưỡng, giới hạn vị thế |
| Lớp hạ tầng kỹ thuật | Quản lý tiến trình, truyền thông điệp, kiểm soát quyền | API sàn, quản lý lệnh, engine quản lý rủi ro |
| Lớp quyết định ngữ nghĩa | Prompt LLM | Phân tích cảm xúc tin tức, nhận dạng mẫu hình bất thường, khám phá chiến lược |
Tất nhiên, Claude Code và giao dịch định lượng là hai lĩnh vực hoàn toàn khác nhau, sự tương ứng ở đây không phải là ánh xạ chính xác. Nhưng sự cộng hưởng về triết lý thiết kế là có thật – Chọn công cụ phù hợp nhất ở mỗi lớp, chứ không dùng một chiếc búa để đóng mọi đinh.
Cộng đồng mã nguồn mở cũng đang thực hành những ý tưởng tương tự. TradingAgents là một framework giao dịch định lượng đa Agent gần đây đáng chú ý (dựa trên LangGraph, có bài báo học thuật đi kèm). Nó mô phỏng cấu trúc đội ngũ của một công ty giao dịch thực: nhà phân tích kỹ thuật tính toán nến và chỉ báo, nhà phân tích cảm xúc giải mã tin tức dư luận, các nhà giao dịch với phong cách khác nhau tổng hợp ý kiến từ các bên để đưa ra quyết định cuối cùng. Không phải một AI toàn năng ôm hết mọi việc, mà các vai trò khác nhau làm nhiệm vụ riêng của mình.
Đáng chú ý, TradingAgents là một framework nghiên cứu, nó giải quyết vấn đề "AI làm thế nào để đưa ra quyết định giao dịch". Nhưng trong giao dịch thực tế, bạn còn cần nửa kia: kết nối sàn, quản lý lệnh, thực thi quản lý rủi ro, kiểm toán log – những việc hạ tầng kỹ thuật này, chính xác là những gì các nền tảng định lượng như FMZ đã giúp bạn làm sẵn.
4. Cách triển khai Vibe Trading: Một ví dụ kiến trúc phân lớp
Quay lại Vibe Trading ở đầu bài. Hướng đi là đúng, nhưng tiền đề là phân lớp phải rõ ràng.
Giả sử hôm nay BTC có đường trung bình vàng giao cắt, nhưng tin tức toàn là bất lợi về quản lý. Bạn làm thế nào? Chỉ nhìn vào đường trung bình, nên mở lệnh mua; chỉ nghe tin tức, không dám động. Đây là kịch bản điển hình cần phân lớp.
Trên FMZ, một kiến trúc phân lớp đơn giản có thể được triển khai như sau (lưu ý: ví dụ đơn giản hóa, khi giao dịch thực tế vui lòng tự hoàn thiện cài đặt hợp đồng và quản lý rủi ro):
javascript
/*
Thông số chiến lược (thêm trong tab "Tham số" của trang biên tập chiến lược FMZ):
OPENROUTER_API_KEY : kiểu chuỗi, nhập API Key OpenRouter của bạn
AI_MODEL : kiểu chuỗi, giá trị mặc định "google/gemini-2.5-flash", có thể đổi sang mô hình khác
*/
// Lớp quyết định ngữ nghĩa: Gọi AI qua OpenRouter để lấy tâm lý thị trường
function getAISentiment() {
var prompt = "Phân tích tin tức thị trường tiền điện tử hiện tại, đưa ra điểm số tâm lý (-1 đến 1, -1 cực kỳ hoảng loạn, 1 cực kỳ tham lam), chỉ trả về một con số"
var response = HttpQuery("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
body: JSON.stringify({
model: AI_MODEL,
messages: [{role: "user", content: prompt}],
temperature: 0
}),
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + OPENROUTER_API_KEY
},
timeout: 15000
})
var score = parseFloat(JSON.parse(response).choices[0].message.content)
// Khi AI trả về bất thường, quay về giá trị trung tính – độ tin cậy của hệ thống không phụ thuộc vào mỗi đầu ra đúng của AI
if (isNaN(score) || score < -1 || score > 1) {
Log("Định dạng trả về từ AI bất thường, sử dụng giá trị mặc định 0")
score = 0
}
Log("Điểm tâm lý AI:", score)
return score
}
function main() {
var lastSignalTime = 0 // Ghi lại thời gian nến của lần tín hiệu trước, tránh kích hoạt lặp lại trên cùng một cây nến
while (true) {
var records = exchange.GetRecords(PERIOD_D1)
if (!records || records.length < 20) { Sleep(1000); continue }
var ma5 = TA.MA(records, 5)
var ma20 = TA.MA(records, 20)
var idx = records.length - 1
var curTime = records[idx].Time
var isBullCross = ma5[idx] > ma20[idx] && ma5[idx-1] <= ma20[idx-1]
var isBearCross = ma5[idx] < ma20[idx] && ma5[idx-1] >= ma20[idx-1]
// Kiểm tra trạng thái vị thế
var pos = exchange.GetPosition()
var hasPosition = pos && pos.length > 0
// Lớp đầu tiên: Tín hiệu xác định làm "ngưỡng", giao cắt vàng + không có vị thế + chưa xử lý trên nến này, mới hỏi AI
if (isBullCross && !hasPosition && curTime !== lastSignalTime) {
lastSignalTime = curTime
var sentiment = getAISentiment()
// Lớp thứ hai: Tâm lý AI làm "tham khảo", ảnh hưởng đến khối lượng nhưng không độc lập kích hoạt giao dịch
if (sentiment > 0.2) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 1)
Log("Giao cắt vàng + AI lạc quan, mở toàn bộ")
} else if (sentiment > -0.3) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 0.5)
Log("Giao cắt vàng + AI trung tính, mở nửa")
} else {
Log("Giao cắt vàng nhưng AI bi quan, bỏ qua tín hiệu này")
}
}
// Giao cắt chết đóng vị thế: Quy tắc xác định, không qua AI
if (isBearCross && hasPosition) {
exchange.SetDirection("closebuy")
exchange.Sell(records[idx].Close, pos[0].Amount)
Log("Giao cắt chết đường trung bình, đóng vị thế")
}
// Lớp thứ ba: Cắt lỗ là "nguyên tắc sắt", không qua AI
if (hasPosition) {
var curPrice = records[idx].Close
var entryPrice = pos[0].Price
if (curPrice < entryPrice * 0.97) { // Giảm 3% so với giá mở
exchange.SetDirection("closebuy")
exchange.Sell(curPrice, pos[0].Amount)
Log("Cắt lỗ kích hoạt, đóng vị thế vô điều kiện, lỗ", ((curPrice/entryPrice - 1)*100).toFixed(2), "%")
}
}
Sleep(60 * 1000)
}
}
Logic cốt lõi của đoạn mã này đáng để giải thích chi tiết:
1. Giao cắt vàng đường trung bình là "ngưỡng". Chỉ khi tín hiệu xác định được kích hoạt trước, mới gọi AI. Không phải mỗi cây nến đều hỏi mô hình lớn – vừa tiết kiệm chi phí (API mô hình lớn tính phí theo token), vừa tránh nhiễu. Điều này nhất quán với cách tiếp cận của Anthropic: regex lọc trước, khi khớp mới khởi động xử lý nặng hơn.
2. Tâm lý AI là "tham khảo". Nó ảnh hưởng đến kích thước vị thế và có bỏ qua tín hiệu hay không, nhưng không độc lập kích hoạt giao dịch. Lưu ý mã đã xử lý ngoại lệ cho giá trị trả về của AI – nếu mô hình lớn trả về nội dung không thể phân tích, quay về giá trị trung tính 0. Độ tin cậy của hệ thống không nên phụ thuộc vào mỗi đầu ra đúng của AI.
3. Cắt lỗ là "nguyên tắc sắt". Giảm 3% so với giá mở, đóng vị thế vô điều kiện, không hỏi ý kiến AI. AI có thể nói "dài hạn lạc quan", nhưng tài khoản của bạn không thể chờ đến dài hạn. Ở đây dùng phần trăm giá để cắt lỗ cứng, không qua bất kỳ đánh giá mơ hồ nào.
Đây là cách mở đúng đắn của Vibe Trading: Dùng ngôn ngữ tự nhiên để AI giúp bạn "cảm nhận" bầu không khí thị trường, dùng mã xác định để bạn "thực thi" hành động giao dịch. Ranh giới giữa hai điều này không thể mờ nhạt.
Gợi ý thực hành: Trong hệ thống backtest của FMZ, trước tiên chạy chiến lược đường trung bình thuần túy làm đường cơ sở, sau đó thêm lớp tâm lý AI, so sánh lợi nhuận và drawdown. Nếu thêm AI vào mà kết quả xấu hơn – nghĩa là phân lớp có vấn đề, có thể AI đã can thiệp vào nơi không nên can thiệp. Mỗi lần AI trả về kết quả, dùng Log() ghi lại, để dễ dàng xem xét lại từng quyết định sau này.
5. Mang đi một câu
Công ty AI tiên tiến nhất dùng biểu thức chính quy để phát hiện tâm lý, không phải vì họ không thể tạo ra AI tốt hơn.
Mà vì họ biết: Chọn đúng công cụ quan trọng hơn chọn công cụ mạnh.
Chiến lược đường trung bình không hấp dẫn, biểu thức chính quy không cao cấp. Nhưng trong lĩnh vực của chúng, chúng đáng tin cậy hơn bất kỳ AI nào.
Ngược lại, khi bạn cần trích xuất từ một báo cáo vĩ mô 5000 chữ xem "bài này nghiêng về lạc quan hay bi quan đối với BTC" – đường trung bình không giúp được, biểu thức chính quy cũng không. Đó mới là lúc AI lên sân.
Vấn đề không phải "có dùng AI hay không", mà là "dùng ở lớp nào".
Tệp biểu thức chính quy khiêm tốn trong mã nguồn Claude Code đã trả lời cho chúng ta một câu hỏi thường bị bỏ qua. Còn FMZ mang đến cho bạn một cơ sở hạ tầng phân lớp sẵn sàng – giao diện sàn giao dịch, tính toán chỉ báo, quản lý thực tế, kiểm toán nhật ký đều đã được làm sẵn, bạn chỉ cần nghĩ rõ: Quyết định nào giao cho TA.MA(), quyết định nào giao cho AI.
Nguồn tham khảo:
- Alex Kim - Sự rò rỉ mã nguồn Claude Code — Phân tích phát hiện thất vọng biểu thức chính quy
- FMZ - Xây dựng hệ thống giao dịch tự động hỗ trợ bởi AI — Kiến trúc não bộ AI + đôi tay FMZ
- TradingAgents - Khung giao dịch tài chính LLM đa tác tử — Khung nguồn mở giao dịch định lượng đa tác tử
- Bài báo TradingAgents — Nghiên cứu học thuật về khung giao dịch tài chính đa tác tử
- VentureBeat - Rò rỉ mã nguồn Claude Code
- 1


