Bối cảnh và vấn đề nghiên cứu

Sự phát triển mạnh mẽ của ngành công nghệ thông tin trong kỷ nguyên công nghiệp 4.0 đã đưa các ứng dụng phần mềm trở thành công cụ hỗ trợ cho công tác quản lý, điều hành và phân tích kinh tế. Trong các hoạt động kinh doanh truyền thống, việc thống kê chi tiết thủ công thường tiềm ẩn sai lệch và tốc độ xử lý dữ liệu chậm. Sự ra đời của các ngôn ngữ lập trình hiện đại, đặc biệt là Python – ngôn ngữ giữ vị trí hàng đầu trong các ngôn ngữ lập trình phổ biến với cú pháp rõ ràng, khả năng hướng đối tượng mạnh mẽ và hệ sinh thái thư viện phong phú – đã mở ra khả năng xử lý các tập dữ liệu lớn và giải quyết các bài toán phân tích định lượng phức tạp.

Trong lĩnh vực tài chính, dự báo biến động giá chứng khoán là một bài toán thực tiễn quan trọng, cung cấp cơ sở thông tin phục vụ quá trình ra quyết định của các nhà đầu tư và nhà quản trị. Đề tài "Tìm hiểu ngôn ngữ lập trình Python, viết chương trình thử nghiệm dự báo sự biến động của giá chứng khoán" được thực hiện nhằm mục tiêu làm chủ các kỹ thuật xử lý dữ liệu trên nền tảng Python và xây dựng chương trình thử nghiệm dự báo chuỗi thời gian tài chính.

Các nhiệm vụ nghiên cứu cụ thể của đề tài bao gồm:

  1. Tìm hiểu tổng quan và chuyên sâu về ngôn ngữ lập trình Python, môi trường phát triển, cấu trúc dữ liệu và các thư viện hỗ trợ phân tích dữ liệu.
  2. Tìm hiểu cơ sở lý thuyết về bài toán dự báo và bài toán dự báo trong ngôn ngữ Python.
  3. Nghiên cứu bài toán dự báo sự biến động của giá chứng khoán và các mô hình dự báo thống kê phù hợp.
  4. Xây dựng chương trình thử nghiệm bằng ngôn ngữ Python để dự báo biến động giá cổ phiếu dựa trên dữ liệu thực tế.

Đối tượng nghiên cứu của đồ án là ngôn ngữ lập trình Python, các thư viện phân tích dữ liệu (Pandas, Matplotlib, NumPy, module CSV), lý thuyết chuỗi thời gian và các mô hình thống kê dự báo giá cổ phiếu. Phạm vi không gian nghiên cứu tập trung vào số liệu giá cổ phiếu của các công ty niêm yết trên thị trường chứng khoán Việt Nam, được thực hiện tại Trường Đại học Quản lý và Công nghệ Hải Phòng. Phạm vi thời gian thực hiện đề tài từ ngày 03 tháng 08 năm 2020 đến ngày 17 tháng 10 năm 2020.

Cơ sở lý thuyết và phương pháp

Khung lý thuyết của đề tài được xây dựng dựa trên lý thuyết phân tích chuỗi thời gian (Time Series) và các mô hình dự báo thống kê cổ điển. Chuỗi thời gian được định nghĩa là một dãy dữ liệu quan sát tại các thời điểm kế tiếp nhau theo cùng một đơn vị đo mẫu. Trình tự thời gian là yếu tố then chốt làm cho các đại lượng thống kê thông thường (như trung bình mẫu, độ lệch quân phương mẫu, khoảng tin cậy hay kiểm định giả thuyết chuẩn) không còn hoàn toàn thích hợp. Một chuỗi thời gian kinh tế - tài chính được cấu thành từ 4 thành phần chính:

  • Thành phần xu thế ($Trend$): Thể hiện sự tăng trưởng hoặc giảm sút dài hạn của chuỗi dữ liệu.
  • Thành phần mùa vụ ($Seasonality$): Biến động lặp đi lặp lại có tính chu kỳ ngắn hạn (thường là chu kỳ 1 năm) do thời tiết, ngày lễ hoặc tập quán.
  • Thành phần ngẫu nhiên ($Irregular/Random$): Các biến động đột biến không có quy luật do các yếu tố bất thường như chiến tranh, thiên tai hay khủng hoảng.
  • Thành phần chu kỳ ($Cyclical$): Sự dao động dài hạn theo các chu kỳ kinh tế vĩ mô kéo dài từ 5, 7 đến 10 năm qua các pha suy thoái, phục hồi và bùng nổ.

Để giải quyết bài toán dự báo giá cổ phiếu, tác giả sử dụng 3 mô hình dự báo thống kê:

  1. Mô hình trung bình trượt đơn (Moving Average - MA): Làm mịn chuỗi dữ liệu bằng cách lấy trung bình cộng của các giá trị trong một khoảng thời gian (kích thước cửa sổ trượt).
  2. Mô hình làm mịn theo cấp số nhân (Single Exponential Smoothing): Gán trọng số giảm dần theo cấp số nhân cho các quan sát quá khứ để dự báo giá trị tương lai.
  3. Mô hình làm mịn hàm mũ kép (Double Exponential Smoothing): Mở rộng từ làm mịn hàm mũ đơn để mô hình hóa và dự báo các chuỗi thời gian có xuất hiện thành phần xu thế.

Phương pháp nghiên cứu được triển khai bao gồm:

  • Phương pháp phân tích và tổng hợp lý thuyết: Hệ thống hóa cú pháp, cấu trúc dữ liệu của Python và các hàm toán học trong các thư viện chuyên dụng.
  • Phương pháp trực quan hóa chuỗi thời gian: Sử dụng 3 dạng biểu đồ để nhận diện đặc tính dữ liệu: biểu đồ chuỗi gốc $x_t$ theo thời gian $t$; biểu đồ tỷ lệ biến động $(x_t / x_{t-1}) \times 100$ theo $t$; và biểu đồ sai phân bậc một $x_t - x_{t-1}$ theo $t$.
  • Phương pháp thực nghiệm mô hình hóa: Lập trình cài đặt các thuật toán bằng Python, chạy thử nghiệm trên dữ liệu chứng khoán với các tham số khác nhau (thay đổi kích thước cửa sổ trượt MA ở các mức 15 ngày, 30 ngày và 60 ngày; tinh chỉnh hệ số làm mịn hàm mũ) và đánh giá kết quả qua biểu đồ đối chiếu.

Nguồn dữ liệu sử dụng trong đồ án là dữ liệu thứ cấp về giá giao dịch lịch sử của các công ty niêm yết trên thị trường chứng khoán Việt Nam, được lưu trữ dưới định dạng tệp văn bản phân tách bằng dấu phẩy (.csv).

Thiết kế và triển khai chương trình thử nghiệm

Chương trình thử nghiệm dự báo giá chứng khoán được thiết kế và triển khai trên môi trường máy tính cá nhân với các công nghệ và công cụ sau:

  • Môi trường phát triển tích hợp (IDE): PyCharm IDE.
  • Ngôn ngữ lập trình: Python (cài đặt từ python.org) và công cụ quản lý gói pip.
  • Các thư viện bổ trợ:
    • pandas: Đọc dữ liệu từ tệp CSV vào cấu trúc DataFrame, trích xuất các cột dữ liệu theo tên hoặc chỉ số, chuyển đổi sang mảng NumPy và xử lý dữ liệu thiếu.
    • matplotlib (phân hệ matplotlib.pyplot): Thiết lập đối tượng đồ họa gồm Figure, Axes, Axis và Artist để vẽ biểu đồ đường biểu diễn giá thực tế và đường dự báo với các tham số định dạng màu sắc (r, g, b, y) và nét vẽ (-, --).
    • csv: Module chuẩn của Python phục vụ thao tác đọc ghi tệp dữ liệu với các thiết lập định dạng phân tách và xử lý ký tự trích dẫn (QUOTE_ALL, QUOTE_MINIMAL, QUOTE_NONNUMERIC, QUOTE_NONE).
    • numpy: Hỗ trợ xử lý mảng đa chiều và tính toán toán học ma trận.

Quy trình thực thi của chương trình bao gồm:

  1. Đọc và nạp dữ liệu: Tệp dữ liệu chứng khoán dạng CSV được nạp vào bộ nhớ bằng hàm pandas.read_csv() với các tham số cấu hình mã hóa ký tự utf-8, ký tự phân cách sep=',' và thiết lập tiêu đề header.
  2. Kiểm tra cấu trúc dữ liệu: Sử dụng thuộc tính .shape và phương thức .info() để kiểm tra số lượng hàng, số lượng cột và kiểu dữ liệu trước khi trích xuất chuỗi giá đóng cửa.
  3. Tính toán dự báo: Áp dụng các thuật toán Moving Average (với kích thước cửa sổ $W = 15, 30, 60$), Exponential Smoothing và Double Exponential Smoothing trên mảng dữ liệu giá.
  4. Xuất kết quả đồ thị: Sử dụng phương thức plt.plot() để hiển thị đường biểu diễn dữ liệu thực tế đè lên đường dự báo nhằm quan sát trực quan độ lệch và độ trễ pha của từng mô hình.

Nội dung chính theo từng chương

Chương 1: Ngôn ngữ lập trình Python

Chương này tập trung trình bày tổng quan về lịch sử hình thành và cấu trúc nền tảng của ngôn ngữ Python. Python được khởi xướng bởi Guido van Rossum tại CWI (Hà Lan) vào cuối những năm 1980 và bắt đầu thực hiện từ tháng 12 năm 1989 như một ngôn ngữ kế thừa của ABC. Các mốc phát triển quan trọng gồm phiên bản Python 2.0 (phát hành ngày 16/10/2000 bổ sung bộ gom rác tự động và hỗ trợ Unicode) và phiên bản Python 3.0 / Py3k (phát hành ngày 03/12/2008 nhằm tái cấu trúc toàn diện).

Tác giả đi sâu vào các thành phần lập trình cơ bản trong Python:

  • Môi trường phát triển: Hướng dẫn cài đặt Python, cấu hình PyCharm IDE, tạo tệp mã nguồn đuôi .py và sử dụng lệnh chú thích #.
  • Cấu trúc dữ liệu tích hợp: Trình bày chi tiết về List (danh sách tuần tự có chỉ số từ 0), Dictionary (cấu trúc lưu trữ cặp khóa - giá trị key-value), Set (tập hợp không có thứ tự và không chứa phần tử trùng lặp), và Tuple (bộ dữ liệu bất biến không thể thay đổi giá trị sau khi khởi tạo).
  • Cấu trúc điều khiển: Phân tích cơ chế hoạt động của lệnh rẽ nhánh if-else, vòng lặp tập hợp for...in và vòng lặp điều kiện while.
  • Xây dựng hàm và tài liệu: Khai báo hàm bằng từ khóa def, truyền tham số (parameters) và nhận đối số (arguments), lệnh trả về return, cùng kỹ thuật viết chuỗi tài liệu DocStrings để chú thích chức năng hàm.
  • Hệ thống thư viện phân tích dữ liệu: Khái quát vai trò của NumPy (xử lý mảng đa chiều), SciPy (thuật toán đại số tuyến tính, biến đổi Fourier), Pandas (thao tác dữ liệu bảng với DataFrame), Scikit-learn (tiền xử lý và học máy) và IPython.
  • Kỹ thuật thao tác dữ liệu: Chi tiết cách đọc ghi tệp CSV bằng module csv và thư viện pandas (các hàm .head(), .tail(), .info(), truy xuất theo cột và trượt chỉ số), cùng kỹ thuật vẽ biểu đồ với matplotlib.pyplot.

Chương 2: Bài toán dự báo

Chương 2 trình bày cơ sở lý luận về công tác dự báo và vai trò của dự báo trong quản trị kinh doanh và kinh tế. Dự báo được định nghĩa là quá trình tạo ra các nhận định về các hiện tượng mà đầu ra của chúng chưa thể quan sát được tại thời điểm hiện tại. Dự báo hỗ trợ nhà quản lý trong ba tình huống chủ chốt: điều tiết nguồn tài nguyên sẵn có (sản xuất, nhân lực, tài chính), lập kế hoạch yêu cầu bổ sung tài nguyên trong tương lai, và thiết kế quy hoạch dài hạn. Tác giả cũng nhấn mạnh sai số là yếu tố không thể tránh khỏi trong mọi mô hình dự báo.

Chương này phân tích bản chất của dữ liệu chuỗi thời gian (Time Series) và phân rã chuỗi thời gian thành 4 thành phần: xu thế ($T$), mùa vụ ($S$), chu kỳ ($C$) và yếu tố ngẫu nhiên ($I$). Bên cạnh đó, tác giả phân tích ba phương pháp hiển thị đồ thị chuỗi thời gian nhằm phục vụ nhận dạng đặc trưng dữ liệu trước khi mô hình hóa:

  • Đồ thị $x_t$ theo $t$: Giữ nguyên chuỗi số liệu gốc để theo dõi hướng vận động tổng thể.
  • Đồ thị $(x_t / x_{t-1}) \times 100$ theo $t$: Thể hiện tốc độ tăng trưởng hoặc suy giảm tương đối giữa hai mốc thời gian liền kề.
  • Đồ thị $x_t - x_{t-1}$ theo $t$: Phản ánh giá trị chênh lệch tuyệt đối (sai phân) giữa các bước thời gian.

Về mặt dữ liệu đầu vào, chương phân biệt giữa dữ liệu bên trong và dữ liệu bên ngoài, đồng thời xác lập 3 tiêu chuẩn bắt buộc của thông tin dự báo: tính liên quan trực tiếp, độ tin cậy của phương pháp thu thập và tính thời sự của dữ liệu.

Chương 3: Bài toán dự báo giá cổ phiếu và thực nghiệm

Chương 3 là phần thực nghiệm cốt lõi của đồ án. Tác giả phát biểu bài toán dự báo biến động giá cổ phiếu trên thị trường chứng khoán Việt Nam, thiết lập công thức toán học và lập trình triển khai 3 mô hình dự báo:

  • Mô hình Moving Average (MA): Được thử nghiệm với 3 kích thước cửa sổ trượt khác nhau. Kết quả cho thấy:
    • Cửa sổ trượt 60 ngày ($W=60$): Đường dự báo có độ làm mịn cao nhất, triệt tiêu hầu hết dao động nhỏ nhưng tạo ra độ trễ pha lớn so với diễn biến đường giá thực tế.
    • Cửa sổ trượt 30 ngày ($W=30$): Giảm bớt độ trễ, phản ánh tốt xu thế trung hạn.
    • Cửa sổ trượt 15 ngày ($W=15$): Bám rất sát biến động giá theo từng phiên giao dịch, độ nhạy cao nhưng chịu ảnh hưởng của các dao động nhiễu ngắn hạn.
  • Mô hình làm mịn theo cấp số nhân (Exponential Smoothing): Kết quả thực nghiệm cho thấy mô hình có khả năng làm mịn chuỗi giá đóng cửa dựa trên trọng số suy giảm hàm mũ, thích hợp cho chuỗi dữ liệu biến động đều.
  • Mô hình làm mịn hàm mũ kép (Double Exponential Smoothing): Mô hình thích ứng tốt hơn với các đoạn chuỗi thời gian có xu thế tăng hoặc giảm rõ rệt, cải thiện độ bám sát của đường dự báo so với mô hình làm mịn đơn.

Kết quả và đóng góp

Đồ án đã đạt được các kết quả cụ thể thông qua quá trình tính toán và chạy thử nghiệm chương trình:

  • Hoàn thành việc nghiên cứu và làm chủ cú pháp ngôn ngữ Python, các cấu trúc dữ liệu nền tảng và các hàm xử lý dữ liệu trong thư viện Pandas, Matplotlib và module CSV.
  • Xây dựng thành công mã nguồn thử nghiệm đọc tệp dữ liệu chứng khoán (minh họa thử nghiệm với tệp dữ liệu chứa 2.526 hàng và 14 cột thuộc tính) và thực hiện tính toán dự báo chuỗi thời gian giá cổ phiếu.
  • Triển khai và trực quan hóa thành công kết quả dự báo của 3 mô hình thống kê trên dữ liệu giá chứng khoán tại Việt Nam.

Bảng tổng hợp đặc điểm thực nghiệm của các mô hình dự báo trong đồ án:

Mô hình dự báo Tham số thực nghiệm Đặc điểm kết quả ghi nhận
Moving Average (MA) Cửa sổ trượt $W = 60$ ngày Đường dự báo rất trơn, khử nhiễu mạnh, độ trễ lớn so với giá thực
Moving Average (MA) Cửa sổ trượt $W = 30$ ngày Cân bằng mức độ làm mịn và khả năng bám theo xu hướng biến động
Moving Average (MA) Cửa sổ trượt $W = 15$ ngày Phản ứng nhanh, bám sát các biến động ngắn hạn nhưng còn nhiều nhiễu
Exponential Smoothing Hệ số làm mịn hàm mũ đơn Trọng số giảm dần theo thời gian, phù hợp chuỗi ít biến động xu thế
Double Exponential Smoothing Hệ số làm mịn hàm mũ kép Nắm bắt được thành phần xu thế ($Trend$), đường dự báo bám sát hơn

Về mặt đóng góp, đồ án đã hệ thống hóa lý thuyết chuỗi thời gian kết hợp với hướng dẫn thực hành lập trình phân tích dữ liệu trên ngôn ngữ Python. Công trình cung cấp minh chứng thực nghiệm về ảnh hưởng của việc lựa chọn kích thước cửa sổ trượt và phương pháp làm mịn hàm mũ đối với kết quả dự báo giá cổ phiếu tại thị trường Việt Nam.

Hạn chế và hướng nghiên cứu tiếp

Hạn chế của đồ án:

  • Phạm vi phương pháp nghiên cứu mới chỉ dừng lại ở các mô hình thống kê chuỗi thời gian cổ điển (trung bình trượt đơn, làm mịn hàm mũ đơn và kép), chưa triển khai các thuật toán học máy (Machine Learning) nâng cao từ thư viện Scikit-learn.
  • Dữ liệu thực nghiệm được xử lý ngoại tuyến từ tệp CSV cố định, chưa có cơ chế kết nối API để thu thập và xử lý luồng dữ liệu giao dịch trực tuyến theo thời gian thực.
  • Chưa xây dựng giao diện người dùng đồ họa tương tác hoàn chỉnh để người dùng tùy biến nhập mã cổ phiếu và tự động hiển thị kết quả phân tích.

Hướng nghiên cứu tiếp theo:

  • Nghiên cứu và áp dụng các mô hình học máy có giám sát và mô hình học sâu chuyên sâu cho bài toán chuỗi thời gian nhằm nâng cao độ chính xác dự báo.
  • Tích hợp thêm các chỉ báo phân tích kỹ thuật và xử lý dữ liệu đa chiều từ nhiều mã cổ phiếu niêm yết đồng thời.
  • Phát triển chương trình thành một ứng dụng hoàn chỉnh có khả năng tự động cập nhật dữ liệu từ sàn giao dịch chứng khoán.

Giá trị tham khảo

Đồ án là tài liệu học thuật có giá trị tham khảo thiết thực cho:

  • Sinh viên ngành Công nghệ thông tin, Hệ thống thông tin và Khoa học dữ liệu: Cung cấp tài liệu có hệ thống về cú pháp Python cơ bản, cách sử dụng PyCharm, kỹ thuật xử lý tệp CSV, cấu trúc DataFrame trong Pandas và kỹ thuật trực quan hóa dữ liệu bằng Matplotlib.
  • Sinh viên và nhà nghiên cứu thuộc khối ngành Kinh tế, Tài chính - Ngân hàng: Tham khảo cơ sở lý thuyết về phân tích chuỗi thời gian, 4 thành phần biến động kinh tế và cách tiếp cận lập trình thực nghiệm để mô phỏng các mô hình dự báo giá tài chính.
  • Phần đáng tham khảo nhất trong đồ án là Chương 1 (hướng dẫn chi tiết về cấu trúc dữ liệu và thư viện phân tích) và Chương 3 (phương pháp cài đặt và so sánh thực nghiệm các kích thước cửa sổ trượt của mô hình Moving Average).

Câu hỏi thường gặp

1. Đồ án đã thử nghiệm những mô hình dự báo thống kê cụ thể nào?
Tác giả đã lập trình và thử nghiệm 3 mô hình thống kê: mô hình trung bình trượt đơn Moving Average (MA) với 3 kích thước cửa sổ trượt (15 ngày, 30 ngày, 60 ngày), mô hình làm mịn theo cấp số nhân (Single Exponential Smoothing), và mô hình làm mịn hàm mũ kép (Double Exponential Smoothing).

2. Các thư viện Python nào được phân tích và sử dụng trong nghiên cứu?
Đồ án tìm hiểu hệ sinh thái thư viện khoa học dữ liệu gồm NumPy, SciPy, Pandas, Scikit-learn, IPython và Matplotlib. Trong phần thực nghiệm, hai thư viện chính được sử dụng trực tiếp để xử lý dữ liệu và vẽ đồ thị là Pandas và Matplotlib (phân hệ Pyplot), kết hợp cùng module csv chuẩn của Python.

3. Tác giả đã trình bày những phương pháp trực quan hóa chuỗi thời gian nào trong Chương 2?
Đồ án trình bày 3 phương pháp hiển thị đồ thị: đồ thị chuỗi dữ liệu gốc ($x_t$ theo $t$), đồ thị tỷ lệ phần trăm so với bước thời gian trước ($(x_t / x_{t-1}) \times 100$ theo $t$), và đồ thị sai phân tuyệt đối giữa các bước kế tiếp ($x_t - x_{t-1}$ theo $t$).

4. Dữ liệu chuỗi thời gian trong đồ án được phân rã thành những thành phần nào?
Chuỗi thời gian được phân rã thành 4 thành phần: thành phần xu thế ($Trend$ - tăng giảm dài hạn), thành phần mùa vụ ($Seasonality$ - lặp lại theo chu kỳ năm), thành phần chu kỳ ($Cyclical$ - dao động kinh tế vĩ mô 5-10 năm), và thành phần ngẫu nhiên ($Irregular$ - biến động do sự kiện bất thường).

5. Kết quả thực nghiệm của mô hình Moving Average khác biệt như thế nào khi thay đổi kích thước cửa sổ trượt?
Kích thước cửa sổ trượt 60 ngày cho đường dự báo trơn mượt nhưng có độ trễ lớn; kích thước 30 ngày tạo ra sự cân bằng giữa khử nhiễu và độ bám sát; trong khi kích thước 15 ngày phản ứng nhanh và bám sát biến động giá thực tế từng phiên nhưng chứa nhiều dao động nhiễu ngắn hạn.

Kết luận

Đồ án tốt nghiệp của sinh viên Lê Gia Tiến đã hoàn thành đầy đủ các mục tiêu nghiên cứu đặt ra về việc tìm hiểu ngôn ngữ lập trình Python và hệ sinh thái thư viện phân tích dữ liệu chuyên dụng. Công trình đã hệ thống hóa cơ sở lý luận về chuỗi thời gian và xây dựng thành công chương trình thử nghiệm dự báo biến động giá cổ phiếu trên thị trường chứng khoán Việt Nam bằng các mô hình Moving Average, Exponential Smoothing và Double Exponential Smoothing. Kết quả nghiên cứu là tài liệu tham khảo có giá trị trong việc ứng dụng công nghệ thông tin vào giải quyết các bài toán phân tích định lượng tài chính.