MdevTrade: từ ý tưởng đến lúc hoàn thiện một AI Trading Agent
Mục lục

I. Câu chuyện bắt đầu từ một repo GitHub #
Mọi chuyện bắt đầu vào một buổi tối rảnh rỗi. Tôi lướt GitHub và fork mã nguồn của dự án TradingAgents theo phản xạ.
Thay vì dùng code if-else khô khan để quét các chỉ báo kỹ thuật, dự án này dùng một mô hình hoàn toàn khác: nhiều AI đóng nhiều vai khác nhau. Nó mô phỏng một sàn giao dịch thu nhỏ ngay trong RAM. Ở đó có một gã phân tích tin tức, một phe tin giá sẽ lên và một phe tin giá sẽ xuống ngồi cãi nhau chí chóe, và một quản lý đứng ra chốt hạ.
Lúc đó tôi tự hỏi: liệu các mô hình ngôn ngữ lớn (LLM) thực sự có khả năng tổng hợp tin tức vĩ mô để dự đoán thị trường? Hay những màn suy luận sắc lẹm kia chỉ là chém gió tinh vi sinh ra từ xác suất?
Để tự tìm câu trả lời, tôi bắt chước ý tưởng cốt lõi của repo này rồi xắn tay code lại thành một phiên bản mang tính thí nghiệm và an toàn hơn. Hệ thống có làm tốt hay không thì thú thật tôi không chắc, nhưng tôi đã bấm nút khởi chạy rồi. Cứ thử một thời gian xem nó đốt hết tiền hay giúp tôi có lãi.
Để đêm còn kê cao gối ngủ, tôi thiết lập một bộ giới hạn rủi ro cứng:
- Không đánh margin, không đòn bẩy — tức là không vay tiền sàn để đánh lớn hơn số vốn mình có. Vay thì lãi to mà cháy tài khoản cũng nhanh.
- Chỉ mua bán giao ngay (spot) — mua là sở hữu thật, không phải hợp đồng phái sinh. Ngoài phí giao dịch cơ bản thì gần như không có khoản phí ẩn nào khác, nên có thể “ôm” tài sản dài ngày mà tài khoản không bị chảy máu âm thầm.
- Mua đều tay theo kiểu DCA (dollar-cost averaging): chia tiền ra mua rải nhiều lần thay vì dồn một cú. Mua đắt có, mua rẻ có, và giá vốn trung bình ra một con số dễ chịu hơn là đoán đúng đáy.
- Chỉ một tài sản duy nhất: vàng token hóa (XAUT/USDT) — một token mà mỗi đơn vị được bảo chứng bằng vàng vật chất.
Tôi quyết định share toàn bộ phiên bản custom này. Phía dưới là những gì tôi đã làm trong source code, và các kết quả nghiên cứu của mình.
II. Nghiên cứu tính khả thi và quá trình tùy biến #
Trước khi đụng vào code, tôi ngồi đọc kỹ tài liệu học thuật để xem ý tưởng này có đứng vững không. Năm đúc kết dưới đây định hình toàn bộ những tùy biến của dự án.
1. Tin tức có hạn sử dụng, và nó ngắn hơn bạn tưởng #
Ý tưởng ban đầu của tôi khá tham lam: dùng AI để dự báo xu hướng xa 2 đến 6 tháng.
Nhưng các nghiên cứu chỉ ra rằng tin tức tài chính có thời gian bán hủy rất ngắn — mượn chữ từ vật lý hạt nhân, nghĩa là sau một khoảng thời gian nhất định thì một nửa tác động của tin đã tan biến khỏi giá. Với tin tài chính, khoảng đó tính bằng ngày và tuần, không phải tháng.
Ép mô hình dự báo quá xa thì nó mù trước những cú sốc chưa xảy ra. Và thay vì thú nhận “tôi không biết”, LLM sẽ chém gió bằng cách kéo dài xu hướng hôm nay sang tận tháng sau theo một đường thẳng. Đó là công thức của thảm họa.
- Tùy biến của tôi: rút khung dự báo về 1 đến 4 tuần. Đây là chỗ LLM tổng hợp tâm lý thị trường tốt nhất. Ở tầng thực thi, tôi dùng biên độ ATR động để tự động chốt lời ngay trong các nhịp ngắn này. ATR (average true range) là thước đo biên độ dao động trung bình của giá trong một khoảng thời gian — nói nôm na, “hôm nay con này nhảy mạnh cỡ nào” — nên lấy nó làm mốc chốt lời sẽ tự co giãn theo thị trường thay vì dùng một con số cố định.
2. Đừng bắt LLM làm toán #
Một cái bẫy chết người khi làm AI là ném thẳng 200 ngày dữ liệu giá vào prompt rồi hy vọng nó tự “nhìn” ra đường trung bình 200 ngày.
LLM xử lý chữ rất giỏi nhưng làm toán trên một mảng số thì cực dở — nó không thực sự tính, nó đoán con số nào trông hợp lý. Nhồi một nùi số liệu vào còn khiến nó loãng chú ý, bỏ sót đúng phần quan trọng.
Tùy biến của tôi: tách hoàn toàn việc tính khỏi việc suy luận.
Trong MdevTrade, agent phân tích thị trường không tự đi đếm nến. Nó gọi các thư viện Python chuẩn như
yfinancevàstockstatsđể tính chính xác các chỉ báo kỹ thuật — SMA (giá trung bình N ngày gần nhất, dùng để biết xu hướng chung) và MACD (so hai đường trung bình ngắn và dài để bắt thời điểm xu hướng đổi chiều). Sau đó nó dịch kết quả thành câu văn rồi mới nạp vào prompt. Ví dụ: “Giá đang nằm trên SMA 200 với độ dốc dương, xu hướng tăng vững chắc”.Máy tính làm phần số học, LLM làm phần đọc hiểu — mỗi bên làm đúng việc nó giỏi. Với giá thô, LLM chỉ nhận đúng 14 đến 30 ngày gần nhất để cảm nhận nhịp điệu ngắn hạn.
3. Rút kinh nghiệm theo chu kỳ, không theo từng lệnh #
Làm sao để AI học được từ những gì đã xảy ra? Nếu bắt nó ngồi đọc lại từng lệnh 5 đô bị lỗ của hôm qua trong một chiến lược mua rải đều, việc săm soi một lệnh lẻ tẻ là vô nghĩa và tốn tiền API. Một lệnh nhỏ trong chuỗi DCA gần như không mang thông tin gì — nhiễu nhiều hơn tín hiệu.
Tùy biến của tôi: đánh giá theo cả chu kỳ.
Tầng thực thi tính giá vốn trung bình của cả đợt gom hàng dài ngày — tổng tiền đã bỏ ra chia cho tổng lượng đã mua. Khi xu hướng đảo chiều, báo cáo tổng kết ném lại cho AI trông như thế này: “Chu kỳ tăng tháng 5 kết thúc. Giá vốn trung bình 2.650 USD. Lợi nhuận ròng +1,8%.” Ở mức tổng kết đó thì mới có hình mẫu để nhận ra.
4. Đừng bao giờ tin vào độ tự tin của AI #
Có nên cho AI tự quyết định số tiền mỗi lệnh (5 đến 10 đô) dựa trên mức độ “tự tin” của nó không? Câu trả lời từ các nghiên cứu: tuyệt đối không.
LLM thất bại toàn tập trong việc tự đánh giá mức độ chắc chắn. Nó được huấn luyện để nghe thật quả quyết, nên nó báo “tự tin 99%” cả khi đang bịa. Để nó tự định lượng vốn thì sớm muộn cũng có một ngày nó dồn hết tiền vào đúng cái bẫy.
- Tùy biến của tôi: giữ kỷ luật DCA cố định ở tầng thực thi. Kích thước lệnh chốt cứng bằng toán học truyền thống, không bao giờ để AI bẻ cong.
5. Cho AI cãi nhau quá hai vòng thì chúng bắt đầu gật gù #
Ban đầu tôi tưởng cứ cho nhiều AI vào một phòng chat rồi để chúng cãi nhau thì sẽ ra chân lý. Thực tế, các nghiên cứu chỉ ra rằng qua vòng thứ hai, chúng bắt đầu hùa theo nhau — mô hình được huấn luyện để đồng thuận và giữ hội thoại êm đẹp, nên nó nhượng bộ dần, hoặc cả hai kẹt trong một vòng lặp lặp lại y hệt nhau bằng những từ khác.
- Tùy biến của tôi: ép quy trình tranh biện vào đúng hai vòng.
- Vòng 1 (bịt mắt): hai phe bị cách ly hoàn toàn, mỗi bên viết báo cáo độc lập. Cách ly để tránh chuyện bên viết sau bị neo theo lập luận của bên viết trước.
- Vòng 2 (đối chất): mỗi bên chỉ được phép tìm và đánh vào một lỗ hổng logic của đối phương, cấm lặp lại văn mẫu vòng một.
- Xử lý bế tắc: khi dữ liệu quá nhiễu và hai phe bất phân thắng bại, quản lý nghiên cứu không được phép cưa đôi kết quả. Nó buộc phải dùng các quy tắc phá hòa cứng — ví dụ nén biên độ chốt lời lại vì thị trường đang rủi ro cao, hoặc đi theo xu hướng của đường trung bình 200 ngày.
III. Kiến trúc hệ thống: 5 bước và 12 agent #
Làm một thời gian, sự thật khắc nghiệt mới hiện ra: bạn không bao giờ giao quyền sinh sát tài khoản cho một hệ thống chạy bằng xác suất. LLM, xét đến cùng, chỉ là những cỗ máy tung xúc xắc trên đỉnh các trọng số nơ-ron. Lối thoát duy nhất là nhốt sự bất định đó vào bên trong tính tất định của code truyền thống.
Tham khảo ý tưởng của tác giả bản gốc, tôi chia project thành 5 bước với 12 agent, nhưng sửa lại từng node cho phù hợp với định hướng thực chiến của mình.
Toàn bộ hệ thống tách làm hai phân hệ độc lập hoàn toàn. Chỗ này là điểm quan trọng nhất của cả bài: phần AI không bao giờ chạm được vào tiền.
1. AI Brain (Research Graph) #
Thay vì viết một cái prompt dài thò lò rồi ngồi cầu nguyện, tôi dùng LangGraph để điều phối luồng suy luận. LangGraph cho phép mô tả quy trình dưới dạng một đồ thị các bước: mỗi node là một việc, và luồng đi giữa các node là code cứng do tôi viết, không phải do mô hình tự quyết. Mô hình chỉ được tự do bên trong từng node.
Bước 1 — Gom dữ liệu. Bốn agent chạy nối tiếp:
Market Analyst: kéo dữ liệu giá bằng
yfinancevà tính các chỉ báo kỹ thuật bằngstockstats.News Analyst: kéo tin tức tài chính vĩ mô, lọc nhiễu, chỉ giữ các sự kiện có khả năng tạo xu hướng 1 đến 4 tuần.
Social Analyst: đo tâm lý đám đông — chỉ số sợ hãi và tham lam, thứ tổng hợp từ biến động giá và mức độ sôi động của thảo luận — từ các nền tảng như StockTwits, để nắm dòng tiền của nhà đầu tư nhỏ lẻ.
Fundamentals Analyst: cào các chỉ số cơ bản của tài sản (P/E, PEG, ROE) để xem nó đang rẻ hay đắt so với giá trị thực.
[!NOTE] Tôi code node này để giữ trọn vẹn kiến trúc của tác giả gốc. Thực tế khi áp dụng cho vàng token hóa XAUT thì các chỉ số tài chính doanh nghiệp không tồn tại, nên tôi đã cho skip node này.
Bước 2 — Tranh biện. Đúng hai vòng như Mục II.5. Vòng một, hai phe viết độc lập, dùng dữ liệu từ bước 1 để dựng luận điểm. Vòng hai, hai phe đối chất, soi lỗ hổng logic hoặc dữ liệu sai lệch của nhau. Cuối cùng quản lý nghiên cứu tổng hợp các lập luận sắc nhất thành một báo cáo trung lập, đóng vai la bàn cho giai đoạn ra quyết định.
Bước 3 — Lên kế hoạch. Dựa vào báo cáo đó, agent Trader đề xuất một chiến lược cụ thể: điểm vào lệnh, ngưỡng cắt lỗ, ngưỡng chốt lời — tất cả tính theo biên độ biến động thực tế, không phải một tín hiệu định tính kiểu “nên mua”.
Bước 4 — Quản trị rủi ro. Kế hoạch bị soi bởi ba agent với ba khẩu vị khác nhau: một bên đẩy lợi nhuận, một bên giữ vốn, một bên soi tuân thủ. Nếu có xung đột hoặc dấu hiệu dồn hết vốn bất thường, Portfolio Manager can thiệp để chỉnh quy mô lệnh hoặc hủy hẳn.
Bước 5 — Lưu trữ. AI Brain bị bịt mắt hoàn toàn về số dư ví thật trên sàn. Việc cuối cùng của Portfolio Manager chỉ là xuất một file JSON tĩnh vào database, chứa đúng một quyết định — LÊN, XUỐNG, hoặc ĐỨNG NGOÀI — kèm ghi chú giải thích. Hết. Không có đường nào từ đây đi thẳng ra sàn.
2. Execution Hands (Binance Graph) #
Đây là một hệ thống Python truyền thống, nắm API key và quyền sinh quyền sát. Nó đọc file JSON từ AI Brain và quyết định có bắn lệnh lên sàn hay không.
Trái tim của nó là một cầu dao tự động. Bất kể AI tự tin đến đâu, nếu tổng danh mục tụt quá 15% so với mức đỉnh từng đạt được, cầu dao sập nguồn. Mọi lệnh bị đóng băng ngay lập tức, và cần người vào xem lại mới chạy tiếp được.
Cơ chế này chính là điểm mấu chốt: Software 1.0 dùng logic cứng để giữ Software 2.0 trong vòng kiểm soát. AI được phép sai — nó chắc chắn sẽ sai — nhưng biên độ của cái sai đó đã bị chốt cứng bằng một con số trong code, chứ không phụ thuộc vào việc hôm đó mô hình nghĩ gì.
Thú thật ở tầng thực thi này tôi vẫn chưa nghiên cứu quá sâu, mọi thứ đang dừng ở mức cơ bản nhất để đảm bảo an toàn. Chắc phải đợi hôm nào nằm mơ thấy ông Bụt hiện ra độ cho cái giải pháp xịn hơn thì tôi sẽ code lại phần này.
IV. Kết luận #
Ngồi đọc các bản báo cáo hằng ngày do dàn agent này tự xuất ra, tôi thấy logic đứng vững — sắc bén, đáng tin. Nếu tự tôi ngồi xem chart và đọc tin vĩ mô lấy, có lẽ kết luận rút ra cũng chẳng khác là bao.
Nhưng cần nói thẳng một điều: “báo cáo đọc thấy hợp lý” và “chiến lược có lãi” là hai chuyện khác nhau, và cái thứ nhất không chứng minh được cái thứ hai. Đây vẫn đang là giai đoạn chạy thử. Thị trường luôn có những cú vả không lường trước, đặc biệt là rủi ro trượt giá — giá khớp thực tế lệch khỏi giá bạn thấy lúc đặt lệnh, xảy ra khi tài sản ít người mua bán. Cứ phải chờ thời gian trả lời.
Dù kết quả lãi lỗ có ra sao, dự án này đã khẳng định một điều: thành công của việc ráp AI vào sản phẩm không nằm ở chỗ ném mọi thứ vào một cái hộp đen prompt rồi ngồi chắp tay cầu nguyện. Nó nằm ở chỗ vạch ranh giới. Các khối logic cứng — đồ thị luồng, cầu dao, tầng lấy dữ liệu — là thứ giam giữ và điều hướng cỗ máy xác suất, buộc nó làm việc theo kỷ luật. Phần AI lo việc đọc hiểu; phần code lo việc không để mất tiền.
[!NOTE] Mã nguồn toàn bộ dự án được public tại: https://github.com/vinhmdev-com/mdevtrade
Đặc biệt gửi lời cảm ơn chân thành đến tác giả của dự án gốc TradingAgents vì nguồn cảm hứng và ý tưởng kiến trúc tuyệt vời.