0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Khám Phá Portfolio: Cách Stocksimpy Theo Dõi Giao Dịch

Đăng vào 6 tháng trước

• 4 phút đọc

Khám Phá Portfolio: Cách Stocksimpy Theo Dõi Giao Dịch

Chào mừng bạn đến với phần 5 của chuỗi bài viết "Xây Dựng Stocksimpy", nơi tôi đang xây dựng một thư viện backtesting chứng khoán nhẹ bằng Python.

Trong bài trước, tôi đã giải thích lý do tại sao tôi muốn Stocksimpy giữ nguyên tính đơn giản: mỗi lớp nên có một mục đích rõ ràng, thay vì gộp tất cả vào một lớp backtester khổng lồ.

Tại Sao Cần Lớp Portfolio?

Các chỉ báo sẽ trở nên vô dụng nếu không có một tài khoản theo dõi giao dịch của bạn — vì vậy tôi đã xây dựng lớp Portfolio.

Portfolio thực chất là kế toán, theo dõi toàn bộ dòng tiền. Chắc chắn bạn có thể theo dõi điều này bằng một khung dữ liệu trong vòng lặp backtesting. Vậy tại sao lại cần Portfolio? Có một nguyên tắc trong phát triển phần mềm gọi là:

Đừng Lặp Lại Bản Thân (DRY)

Lập trình bao gồm các đối tượng, hàm, lớp và nhiều thứ khác. Tại sao lại phải lặp lại mình liên tục khi bạn có thể gọi cùng một hàm? Đây là lý do chính mà tôi muốn có một lớp Portfolio tập trung.

Không chỉ vậy, việc có một lớp Portfolio cho phép tôi tách biệt dòng tiền và thực hiện logic backtesting, vì vậy thay vì cố gắng gộp mọi thứ lại với nhau, tôi có thể tách biệt các tác vụ khác nhau trong mã. Nếu không, tôi sẽ phải viết lại logic mua/bán liên tục và thử tưởng tượng nếu phải thay đổi một lỗi nhỏ trong mã đó — tôi để phần còn lại cho bạn tưởng tượng.

Ba Trách Nhiệm Cốt Lõi

Khi tôi nhắc đến Portfolio — trong giao dịch: tổng tiền, cổ phiếu và các tài sản khác. Đó chính xác là những gì mà Portfolio làm, ngoài ra còn bất kỳ điều gì liên quan đến dòng chảy và ghi lại số tiền/tài sản đó.

Lưu Giữ Tiền Mặt và Tài Sản

Tại cốt lõi, Portfolio theo dõi số tiền mặt có sẵn (self.cash) và tất cả tài sản của bạn (self.holdings). Điều này có vẻ đơn giản, nhưng việc có một nơi duy nhất cho thông tin này giúp ngăn chặn sai sót và làm cho mã sạch hơn.

Các Hoạt Động Mua và Bán

Tôi không muốn vòng lặp backtester có quyền truy cập trực tiếp vào tiền mặt và tài sản. Vì vậy, tôi quyết định rằng trách nhiệm thứ hai nên là các hoạt động mua/bán. Giờ đây, việc mua/bán sẽ yêu cầu Portfolio biết giá hiện tại của cổ phiếu, có nghĩa là nó cần StockData, điều này tôi đã không muốn làm, vì Portfolio phải được sử dụng độc lập.

Giải pháp? Tôi chỉ cần thêm tham số price vào exec_trade() để giá trị này có thể được cung cấp bởi vòng lặp backtesting hoặc người dùng trực tiếp. Việc truy cập và thay đổi trực tiếp được thực hiện bởi exec_trade().

Theo Dõi Lịch Sử

Portfolio có thể có vẻ hoàn chỉnh đến giờ, nhưng có một trách nhiệm thứ ba quan trọng: theo dõi lịch sử. Người dùng cần có khả năng truy cập vào các thay đổi của danh mục khi mô phỏng mua/bán cổ phiếu và tổng giá trị. Điều này khá dễ thực hiện bằng cách sử dụng _log_trade() để ghi lại mọi giao dịch trong self.trade_log.

Dưới đây là một ví dụ về cách nó hoạt động:

python Copy
from portfolio import Portfolio

# Bắt đầu với $10,000
myportfolio = Portfolio(initial_cap = 10_000)

# Mua 10 cổ phiếu NVDA với giá $170 mỗi cổ phiếu
myportfolio.exec_trade(
  symbol='NVDA',
  trade_type='Buy',
  price=170,
  shares=10,
  date=current_date
)

Một lỗi thú vị mà tôi đã gặp phải: Python sẽ không cho phép bạn tăng giá trị cho một khóa chưa tồn tại trong một từ điển. Giải pháp? Sử dụng defaultdict(int) từ mô-đun collections của Python. Điều này tự động khởi tạo các khóa mới thành 0, giải quyết vấn đề một cách gọn gàng.

Tương Lai?

Portfolio được thiết kế để hoạt động độc lập, vì vậy nó có thể được sử dụng trong các vòng lặp backtesting tùy chỉnh. Nó đã xử lý nhiều cổ phiếu mà không gặp vấn đề gì, mặc dù phiên bản đầu tiên của Backtester sẽ chưa tận dụng hết chúng.

Còn Gì Khác?

Nếu bạn có bất kỳ gợi ý hoặc cải tiến nào cho Stocksimpy, hãy cho tôi biết qua các mạng xã hội hoặc bằng cách bình luận trực tiếp. Tôi muốn thư viện này hữu ích cho mọi người, đặc biệt là cho những ai mới bắt đầu với tài chính định lượng.


Cảm ơn bạn đã đọc — hy vọng bạn thích. Trước khi rời đi, hãy:

  • ⭐ Đánh giá stocksimpy trên Github
  • 🧠 Theo dõi tôi trên Twitter / X
  • 🔷 Tôi hiện có mặt trên Bluesky
  • 📰 Hoặc đọc thêm các bài viết của tôi trên Medium
  • 💬 Kết nối với tôi trên LinkedIn
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào