Môi trường lập trình bot trading: dựng một lần dùng mãi
Phần này nhàm chán nên ai cũng muốn bỏ qua. Nhưng một dự án bắt đầu bằng vài tệp rời rạc sẽ thành thứ không ai sửa nổi đúng lúc cần sửa gấp.
Môi trường lập trình bot trading là phần nhàm chán nhất của lộ trình này, nên ai cũng muốn bỏ qua và bắt tay viết chiến lược ngay. Bài này ngắn và đáng đọc, vì một dự án bắt đầu bằng vài tệp rời rạc sẽ thành thứ không ai sửa nổi — đúng vào lúc bạn cần sửa gấp giữa phiên.
Python và môi trường ảo
Chọn bản Python ổn định gần nhất mà các thư viện dữ liệu tài chính đã hỗ trợ. Tránh bản vừa ra vài tuần: thư viện trong lĩnh vực này thường chậm cập nhật và bạn sẽ mắc kẹt vì một gói không cài được.
Môi trường ảo là bắt buộc, không phải tuỳ chọn. Lý do rất cụ thể: không có nó, một lần cài thư viện cho dự án khác có thể nâng cấp gói mà bot đang dùng, làm bot hỏng theo cách khó hiểu. Mỗi dự án một môi trường riêng, cố định phiên bản thư viện.
Ghi lại danh sách thư viện kèm phiên bản chính xác. Sáu tháng sau, khi dựng lại bot trên máy chủ mới, bạn cần đúng những phiên bản đã kiểm định chứ không phải bản mới nhất.
Cấu trúc thư mục
Bố cục dưới đây đủ dùng từ ngày đầu tới lúc bot chạy tiền thật, và tách bạch đúng những ranh giới cần tách.
bot/
data/ lấy và làm sạch dữ liệu
fetch.py gọi nguồn, lưu thô
clean.py chuẩn hoá, kiểm tra chất lượng
strategy/ quy tắc vào ra, không biết gì về tiền
signal.py
risk/ khối lượng và giới hạn
sizing.py
broker/ nói chuyện với API, gói riêng phần bẩn
client.py
paper.py bản giả lập, cùng giao diện
run/
live.py vòng lặp chạy thật
backtest.py chạy trên dữ liệu lịch sử
config.py đọc cấu hình từ biến môi trường
logs/ nhật ký, không đưa vào kho mã
storage/ dữ liệu thô và đã sạch, không đưa vào kho mã
notebooks/ khám phá dữ liệu, không chứa logic chạy thật
Bố cục này phản ánh đúng năm khối của kiến trúc bot. Ranh giới quan trọng nhất là thư mục broker: nó có hai bản cùng giao diện — bản thật gọi API và bản giả lập. Nhờ vậy chuyển giữa chạy thử và chạy thật là đổi đúng một dòng, không phải sửa logic.
Thư mục notebooks tách riêng và không chứa logic chạy thật. Sai lầm phổ biến là thử nghiệm chiến lược trong notebook rồi chép tay sang bot; hai bản lệch nhau và bạn không biết bản nào đúng. Notebook chỉ nên gọi vào các hàm trong strategy, không định nghĩa lại chúng.
Cấu hình tách khỏi mã
Mọi thứ thay đổi giữa máy của bạn và máy chủ phải nằm ngoài mã: khoá API, đường dẫn dữ liệu, có chạy thật hay không, giới hạn rủi ro.
Cách làm chuẩn là đọc từ biến môi trường, với một tệp môi trường ở máy cá nhân và biến môi trường thật trên máy chủ. Tệp đó không bao giờ đưa vào hệ thống quản lý mã nguồn — thêm nó vào danh sách loại trừ ngay từ commit đầu tiên.
Ba nguyên tắc về khoá API đáng nhớ kỹ:
Cấp quyền tối thiểu. Khoá chỉ để lấy dữ liệu thì không bật quyền đặt lệnh. Với sàn crypto, tuyệt đối không bật quyền rút tiền.
Giới hạn theo địa chỉ IP nếu nhà cung cấp cho phép, để khoá bị lộ cũng không dùng được từ nơi khác.
Có một biến rõ ràng bật tắt chế độ thật, và mặc định là tắt. Bot phải cần một hành động có ý thức mới đặt được lệnh thật — nếu không, sớm muộn bạn sẽ chạy nhầm bản thử nghiệm trên tài khoản thật.
Quản lý phiên bản mã
Dùng git ngay từ đầu, kể cả khi làm một mình. Lý do không phải để cộng tác mà để quay lại được: khi bot đổi hành vi sau một lần sửa, bạn cần biết chính xác đã sửa gì.
Thói quen đáng tập: mỗi lần bắt đầu chạy tiền thật với một phiên bản, ghi lại mã định danh commit vào nhật ký. Ba tháng sau nhìn lại kết quả, bạn biết chính xác con số đó đến từ phiên bản mã nào.
Danh sách loại trừ tối thiểu: tệp môi trường, thư mục dữ liệu, nhật ký, và mọi thứ chứa khoá.
Ghi nhật ký từ dòng mã đầu tiên
Đừng dùng lệnh in ra màn hình. Dùng thư viện ghi nhật ký chuẩn, xuất ra tệp, có dấu thời gian và mức độ.
Ba mức đủ dùng: thông tin cho mọi quyết định bình thường, cảnh báo cho những gì bất thường nhưng xử lý được, và lỗi cho những gì cần người can thiệp.
Phần này có một bài riêng ở vị trí 11 của lộ trình, nhưng hãy bật nhật ký ngay từ bây giờ — mọi thứ bạn không ghi lại trong tuần đầu là thông tin mất vĩnh viễn.
Điểm mấu chốt nằm ở mũi tên phản hồi: chuyển giữa chạy thử và chạy thật là đổi một biến môi trường, không phải sửa mã. Mọi cách làm khác — sửa một dòng rồi nhớ sửa lại, hay giữ hai bản mã song song — đều sẽ dẫn tới một lần chạy nhầm.
Nhánh đầu tiên đáng làm thành thói quen: một lần đẩy khoá lên kho mã công khai là phải thu hồi và tạo lại toàn bộ khoá, kể cả khi bạn xoá ngay sau đó.
Hai bản broker: thật và giả lập
Đây là chi tiết thiết kế đáng làm ngay từ đầu, vì thêm vào sau rất tốn công.
Thư mục broker có hai tệp cùng cung cấp một bộ hàm giống hệt nhau: đặt lệnh, huỷ lệnh, hỏi vị thế, hỏi số dư. Bản thật gọi API công ty chứng khoán; bản giả lập giữ mọi thứ trong bộ nhớ và ghi ra nhật ký.
Phần còn lại của bot không biết mình đang nói chuyện với bản nào — nó chỉ gọi các hàm đó. Cấu hình quyết định nạp bản nào.
Cách này mang lại ba thứ. Chạy song song không rủi ro: bot nhận dữ liệu thật, tính toán thật, ghi lại lệnh lẽ ra đã đặt, nhưng không gửi gì ra thị trường. Backtest dùng chung mã: bản giả lập chạy trên dữ liệu lịch sử chính là bộ máy backtest, nên bạn không có hai bản logic lệch nhau. Thử tình huống hiếm: bản giả lập cho phép giả lập lệnh bị từ chối, khớp một phần, hay mất kết nối — những thứ chờ gặp trên thị trường thật thì rất lâu, mà xử lý sai thì rất đắt.
Thứ tự vận hành của lộ trình từ backtest tới tiền thật dựa hoàn toàn vào thiết kế này: cùng một mã chiến lược chạy qua ba giai đoạn, chỉ khác tệp broker được nạp.
Nhìn sơ đồ này thì thấy rõ vì sao hai bản broker đáng làm từ đầu: nếu backtest và chạy thật dùng hai bộ mã khác nhau, mọi khác biệt giữa kết quả mô phỏng và kết quả thật đều có hai nguyên nhân khả dĩ — thị trường, hoặc mã lệch nhau — và bạn không phân biệt được cái nào.
Kiểm tra trước khi sang bài sau
Ba việc nên làm được trước khi tiếp tục: tạo được môi trường ảo và cài thư viện với phiên bản cố định; chạy được một tệp đọc cấu hình từ biến môi trường và in ra chế độ đang chạy; và commit được lần đầu mà không có tệp nào chứa khoá.
Bài tiếp theo bắt đầu phần dữ liệu: lấy giá cho thị trường Việt Nam từ đâu và làm sạch thế nào.
Câu hỏi thường gặp
- Dùng Python bản nào?
- Bản ổn định gần nhất mà các thư viện bạn cần đã hỗ trợ. Tránh bản vừa ra vài tuần vì thư viện dữ liệu tài chính thường chậm cập nhật.
- Có cần môi trường ảo không?
- Có. Không có nó thì một lần cập nhật thư viện cho dự án khác có thể làm bot đang chạy hỏng, và bạn sẽ mất nhiều giờ mới tìm ra nguyên nhân.
- Nên dùng notebook hay tệp mã?
- Notebook tốt cho khám phá dữ liệu, tệp mã cho mọi thứ chạy thật. Sai lầm phổ biến là để logic chiến lược nằm trong notebook rồi chép tay sang bot — hai bản sẽ lệch nhau.
- Khoá API lưu ở đâu?
- Trong tệp môi trường không đưa vào hệ thống quản lý mã nguồn, hoặc trong biến môi trường của máy chủ. Tuyệt đối không viết thẳng trong mã, kể cả khi kho mã để riêng tư.
Đọc tiếp
- Công cụ, dữ liệu & lập trìnhPython và dữ liệu thị trường Việt Nam: dựng bộ công cụ tối thiểu
- Công cụ, dữ liệu & lập trìnhLấy dữ liệu giá chứng khoán Việt Nam cho bot
- Phân tích kỹ thuật & price actionPrice action: đọc hành vi giá mà không cần chỉ báo
- Phái sinh VN30F1MPhái sinh VN30F1M là gì: hướng dẫn từ đầu cho người mới