
DuckDB là gì? Hướng dẫn DuckDB Python phân tích dữ liệu chứng khoán
Mục lục
Bạn đang làm việc với dữ liệu chứng khoán và cảm thấy:
- Excel quá chậm khi xử lý file lớn?
- Pandas DataFrame linh hoạt nhưng cú pháp phức tạp, khó nhớ?
- Database thì mạnh mẽ nhưng thiết lập rườm rà?
DuckDB là gì?
DuckDB cho phép bạn chạy câu lệnh SQL trực tiếp trên Pandas DataFrame, CSV và nhiều định dạng khác với tốc độ xử lý tối ưu. Công cụ này giúp đơn giản hóa các thao tác lọc và join phức tạp bằng câu lệnh SQL quen thuộc.
DuckDB giải quyết bài toán gì cho dân chứng khoán?
Trong lĩnh vực chứng khoán, tốc độ và khả năng xử lý dữ liệu lớn là yếu tố then chốt để đưa ra quyết định đầu tư kịp thời. DuckDB hỗ trợ giải quyết tốt các bài toán sau:
- Nhà đầu tư cá nhân: Phân tích lịch sử giao dịch, tìm kiếm cơ hội đầu tư từ bộ lọc cổ phiếu phức tạp mà không cần mở Excel.
- Chuyên viên phân tích: Kết hợp dữ liệu từ nhiều nguồn (báo cáo tài chính, dữ liệu thị trường, tin tức) một cách nhanh chóng để tạo ra báo cáo chuyên sâu.
- Chuyên viên dữ liệu: Xây dựng các pipeline dữ liệu mạnh mẽ, tự động hóa quy trình ETL1 để phục vụ cho các mô hình phân tích và dự báo.
- Nhà giao dịch (quỹ, tự doanh, cá nhân): Backtest chiến lược giao dịch, tìm kiếm các mẫu hình (pattern) trên dữ liệu lịch sử với tốc độ cao.
Bảng so sánh DuckDB với Pandas và Excel
So sánh DuckDB với Excel truyền thống và Pandas trong Python
| Tiêu chí | DuckDB | Pandas | Excel |
|---|---|---|---|
| Xử lý dữ liệu lớn | Rất tốt | Trung bình | Kém |
| Cú pháp | SQL | Python | Giao diện |
| Tích hợp Python | Có | Có | Không |
| Hiệu năng | Cao | Trung bình | Thấp |
So sánh DuckDB với Excel, Pandas và Database truyền thống
- Excel: DuckDB vượt trội về tốc độ và khả năng xử lý dữ liệu lớn, giúp thực hiện truy vấn phức tạp trên hàng triệu dòng dữ liệu một cách nhanh chóng.
- Pandas: Cú pháp SQL của DuckDB gần gũi với những ai đã có nền tảng cơ sở dữ liệu, đồng thời dễ viết hơn khi sử dụng các mô hình AI hỗ trợ, đặc biệt với các phép toán gộp nhóm (group by), liên kết bảng (join) hay hàm cửa sổ (window functions).
- Hệ quản trị cơ sở dữ liệu truyền thống (SQL Server, PostgreSQL)2: DuckDB không yêu cầu cài đặt và cấu hình máy chủ phức tạp. Cơ chế hoạt động của nó tương đồng với SQLite3 nhưng được tối ưu tốt hơn cho phân tích dữ liệu lớn.
Khả năng truy vấn SQL đa nguồn của DuckDB
DuckDB trên mọi nguồn dữ liệu phổ biến
DuckDB cho phép bạn truy vấn dữ liệu bằng SQL trực tiếp từ nhiều định dạng:
- Pandas DataFrame: Phân tích dữ liệu đã có trong DataFrame một cách dễ dàng.
- CSV/Parquet files: Đọc và truy vấn trực tiếp các file dữ liệu lớn mà không cần tải toàn bộ vào bộ nhớ.
- HTTP Endpoints4: Truy cập dữ liệu từ các nguồn trực tuyến thông qua HTTP.
- SQLite database: Kết hợp dữ liệu từ DuckDB với SQLite.
Điều này giúp bạn linh hoạt hơn trong việc làm việc với dữ liệu, không còn bị giới hạn bởi định dạng hay nguồn gốc của dữ liệu.
DuckDB tutorial: Hướng dẫn DuckDB Python phân tích dữ liệu chứng khoán
DuckDB rất dễ cài đặt và sử dụng mà không cần cấu hình phức tạp. Bạn chỉ cần thực hiện lệnh cài đặt thông thường để bắt đầu sử dụng.
Bước 1: Cài đặt DuckDB Python
pip install duckdbDuckDB hỗ trợ kết nối trực tiếp với Pandas DataFrame, giúp bạn tận dụng dữ liệu có sẵn trong bộ nhớ mà không cần thực hiện các bước chuyển đổi trung gian.
Bước 2: Kết nối DuckDB với DataFrame
import duckdb
import pandas as pd
# Tạo DataFrame mẫu
data = {'ticker': ['FPT', 'VNM', 'HPG'],
'price': [100, 120, 30],
'volume': [1000, 2000, 1500]}
df = pd.DataFrame(data)
# Kết nối DuckDB với DataFrame
con = duckdb.connect(database=':memory:', read_only=False)Bạn có thể dùng SQL để truy vấn và phân tích dữ liệu ngay trên DataFrame mà không cần phụ thuộc hoàn toàn vào các cú pháp đặc thù của Pandas.
Bước 3: Truy vấn dữ liệu với DuckDB SQL functions
# Truy vấn SQL trực tiếp trên DataFrame 'df'
result = con.execute("SELECT ticker, price FROM df WHERE volume > 1500").df()
# In kết quả
print(result)
con.close()Cách tiếp cận này giúp các nhà phân tích dữ liệu và lập trình viên làm việc trực quan hơn bằng ngôn ngữ SQL quen thuộc. Dưới đây là ví dụ thực tế sử dụng DuckDB Python cùng dữ liệu chứng khoán.
DuckDB cho tài chính: Phân tích dữ liệu chứng khoán với DuckDB Python
Với DuckDB, bạn có thể dễ dàng kết hợp với các thư viện Python khác như vnstock để lấy dữ liệu chứng khoán, sau đó phân tích trực tiếp bằng SQL mà không cần chuyển đổi qua nhiều bước trung gian.
Chuẩn bị dữ liệu
Để thực hành, chúng ta sẽ sử dụng thư viện vnstock để tải dữ liệu chứng khoán.
pip install vnstockimport duckdb
import pandas as pd
from vnstock import Quote
quote = Quote(symbol='VCI', source='VCI')
df = quote.history(start='2020-01-01', end='2024-05-25')
# Kết nối DuckDB
con = duckdb.connect(database=':memory:')Một ứng dụng thực tế của DuckDB là tính toán các chỉ số tài chính qua truy vấn SQL. Dưới đây là ví dụ tính tỷ suất sinh lời trung bình theo tháng.
Tính toán lợi nhuận trung bình theo tháng
result = con.execute("""
SELECT strftime(time, '%Y-%m') AS month,
AVG((close - open) / open) AS avg_monthly_return
FROM df
GROUP BY month
ORDER BY month
""").df()
print(result)Tương tự, việc lọc các phiên giao dịch có biến động giá lớn để phục vụ kiểm thử chiến lược cũng được thực hiện nhanh gọn bằng một câu lệnh SQL duy nhất.
Tìm kiếm các ngày tăng giá đột biến
result = con.execute("""
SELECT time, (close - open) / open AS daily_return
FROM df
WHERE (close - open) / open > 0.05 -- Lọc các ngày tăng trên 5%
ORDER BY daily_return DESC
""").df()
print(result)Mở rộng khả năng với DuckDB:
Đọc dữ liệu trực tiếp từ file CSV
Trước tiên hãy tải file csv ví dụ về để thực hiện theo hướng dẫn
import requests
url = 'https://raw.githubusercontent.com/vnstock-official/vnstock_market_data/refs/heads/main/historical_price/all_time/ACB.csv'
response = requests.get(url)
with open('ACB.csv', 'wb') as f:
f.write(response.content)Đọc file CSV với DuckDB:
import duckdb
# Đọc file CSV với DuckDB không cần tới Pandas
con = duckdb.connect(database=':memory:')
my_table_from_csv = con.execute("SELECT * FROM read_csv_auto('ACB.csv')").df()
print(my_table_from_csv)
con.close()Truy vấn dữ liệu từ nhiều bảng (Pandas DataFrame và CSV)
# Giả sử bạn đã có DataFrame df và đã tải file ACB.csv về máy
query = """
SELECT *
FROM df t1
JOIN read_csv_auto('ACB.csv') t2
ON t1.time = t2.date -- Giả sử join qua cột ngày
"""
combined_result = con.execute(query).df()
print(combined_result)
con.close()Câu hỏi thường gặp về DuckDB
DuckDB có miễn phí không?
Có, DuckDB là mã nguồn mở và miễn phí.
DuckDB dùng cho dữ liệu lớn được không?
Có, DuckDB tối ưu cho phân tích dữ liệu hàng triệu dòng.
DuckDB có hỗ trợ cloud không?
DuckDB có thể dùng trên cloud thông qua các dịch vụ lưu trữ file như S3, GCS, Azure Blob.
Cách cài đặt DuckDB trên Windows/Mac/Linux?
Chỉ cần
pip install duckdb cho Python.
Lời kết
DuckDB là một công cụ hữu ích giúp bạn tối ưu hóa quy trình xử lý dữ liệu chứng khoán lớn ngay trong môi trường lập trình quen thuộc. Việc tận dụng cú pháp SQL trực tiếp trên các định dạng tệp và DataFrame giúp rút ngắn thời gian xử lý và đơn giản hóa các tác vụ ETL phức tạp.
Hãy thử tích hợp DuckDB vào workflow hàng ngày của bạn để tăng tốc độ phân tích và nâng cao hiệu suất làm việc. Chúc bạn thành công!
Footnotes
-
ETL (Extract, Transform, Load - Trích xuất, Chuyển đổi, Tải) là quy trình tích hợp dữ liệu bằng cách lấy dữ liệu từ các nguồn khác nhau, xử lý chuẩn hóa và lưu trữ vào kho dữ liệu. ↩
-
PostgreSQL và SQL Server là các hệ quản trị cơ sở dữ liệu quan hệ truyền thống hoạt động theo mô hình client-server, đòi hỏi thiết lập và vận hành máy chủ. ↩
-
SQLite là hệ quản trị cơ sở dữ liệu dạng nhúng phổ biến và gọn nhẹ, thường tối ưu cho các giao dịch nhỏ (OLTP) thay vì phân tích dữ liệu lớn (OLAP). ↩
-
HTTP Endpoints là các địa chỉ kết nối (URL) được cung cấp bởi API để ứng dụng gửi yêu cầu HTTP và nhận dữ liệu phản hồi. ↩
Bình luận