Rấtnhiều kỷ lục đã được ghi nhận trong năm qua, trong đó nhiều mã cổ phiếu có những lúc mangđến niềm vui lớn, nhưng cũng có lúc là nỗi buồn xót xa đối với nhiều nhà đầu tư trên sàn.Không
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
**********
BÁO CÁO LƯU TRỮ VÀ XỬ LÝ DỮ LIỆU LỚN
ĐỀ TÀI: Xây dựng data pipeline xử lý dữ liệu từ thị
trường chứng khoán
Nhóm 28
Giảng viên hướng dẫn: TS Trần Việt Trung
Trang 2MỤC LỤC
2.2 2 Luồng xử lý dữ liệu chính của hệ thống 4
c Xử lý dữ liệu tại pyspark_application 10
d Cung cấp API cung cấp thông tin các bài báo thu thập được 13
Đóng góp thành viên
STT H và tênọ MSSV Công vi c th c hi nệ ự ệ
1 Trầần Đ c H iứ ả 20194270 Nghiên c u và cài ứ
đ t môi trặ ường docker, x lý d li uử ữ ệ
2 Nguyêễn Phương
Nam
20194336 Crawl d li u các ữ ệ
bài báo, têần x lý ử
d li u báoữ ệ
3 Nguyêễn M nh Duyạ 20194262 Crawl d li u t api ữ ệ ừ
ssi, têần x lý d ử ữ
li u ssiệ
4 Nguyêễn Tr ng Hùngọ 20194290 Xầy d ng server ự
cung cầấp api các bài báo
Trang 3Chương 1: Giới thiệu đề tài
Trong năm 2022, thị trường chứng khoán Việt Nam (TTCK) cũng ghi nhận những kỷ lục về
số lượng nhà đầu tư mới tham gia, có tháng lên tới gần nửa triệu tài khoản được mở mới, khối ngoại mua ròng kỷ lục hay thanh khoản một số cổ phiếu lên tới cả trăm triệu đơn vị/phiên Thị trường cũng ghi nhận những biến động khó lường và đầy cảm xúc của nhiều cổ phiếu Trong tháng 11 và 12, TTCK cũng ghi nhận những phiên hồi phục mạnh nhất thế giới Rất nhiều kỷ lục đã được ghi nhận trong năm qua, trong đó nhiều mã cổ phiếu có những lúc mang đến niềm vui lớn, nhưng cũng có lúc là nỗi buồn xót xa đối với nhiều nhà đầu tư trên sàn Không ít mã cổ phiếu lên đỉnh cao mọi thời đại, tăng gấp 5-7, thậm chí vài chục lần, trong một khoảng thời gian ngắn nhưng rồi rớt rất nhanh, khiến các nhà đầu tư hoang mang lo sợ
Chính vì vậy một công cụ trợ giúp nhà đầu tư thấy được toàn cảnh thị trường một cách chi tiết và toàn diện trở thành một nhu cầu quan trọng đối với mỗi nhà đầu tư
Nhìn thấy nhu cầu cao như vậy nhóm chúng em quyết định xây dựng áp dụng các công nghệ lưu trữ và xử lý dữ liệu lớn cho dữ liệu chứng khoán tại thị trường Việt Nam nhằm cung cấp cho nhà đầu tư các thông tin hữu ích khi tham gia thị trường, giúp nhà đầu tư có thể đưa ra các quyết định ít rủi ro nhất
Các công nghệ mà nhóm sử dụng trong hệ thống phân tích thông tin tuyển dụng này bao gồm Hadoop File System, Spark, Kafka, Mongodb, ExpressJS, ElasticSearch và Kibana
Trang 4Chương 2: Tổng quan hệ thống
2.1 Data Pipeline
Hệ thống đảm bảo 2 luồng dữ liệu nguồn được xử lý riêng biệt
- Đầu tiên là dữ liệu chứng khoán thô được lấy từ public api của ssi được ghi vào hadoop và gửi đường dẫn file lên kafka sau đó spark lắng nghe kafka và đọc dữ liệu thô ra xử lý rồi lưu 1 bản trở lại hadoop và lưu 1 bản lên elasticsearch để phục vụ hiển thị dữ liệu
- Thứ 2 là luồng xử lý dữ liệu các bài báo ban đầu dữ liệu được lấy từ link rss của các nguồn báo khác nhau và gửi lên kafka, spark sẽ lắng nghe kafka và xử lý dữ liệu được gửi đến Sau đó spark lưu 1 bản vào hadoop, 1 bản vào mongodb và 1 bản vào kibana
2.2 Các thành phần của hệ thống
a Article crawler
Một chương trình chạy trên môi trường NodeJS sử dụng thư viện Axios và CherioJS
để tìm nạp các bài báo từ link RSS của VNExpress và trích xuất nội dung bài báo bằng cách lấy nội dung của các thẻ p từ mã HTML rồi gửi danh sách các bài báo lên Kafka topic ‘article’
b Stock_iboard_crawler
Một chương trình chạy trên python:3.7 định kỳ (1 phút) sẽ gọi api của SSI iboard để lấy thông tin hiện tại của các mã chứng khoán Sau đó ghi dữ liệu này lên hadoop và gửi đường dẫn hadoop cùng đường dẫn file config, dấu thời gian lên Kafka topic
‘crawl_data’
c Kafka, Zookeeper.
Hàng đợi công việc Kafka có 2 topic ‘crawl_data’ cho dữ liệu từ ssi và ‘article’ cho dữ liệu các bài báo
d Hadoop
Hệ thống lưu trữ file phân tán hadoop được sử dụng để lưu trữ dữ liệu thô từ ssi
‘/project20221/raw’ các file config cho dữ liệu ssi ‘/project20221/config’, dữ liệu ssi
đã qua xử lý ‘/project20221/clean’ cùng với thông tin các bài báo
‘/project20221/articles.parquet’ ở định dạng các file parquet
e Pyspark_application
Ứng dụng spark được viết trên môi trường python:3.7 lắng nghe và nhận công việc từ
Trang 5Kafka rồi thực hiện các thao tác xử lý, lưu trữ dữ liệu
f Mongodb
Cơ sở dữ liệu có 1 bảng articles để lưu trữ thông tin các bài báo sử dụng Mongodb Atlas
g NodeJS server: Article_server
Server chạy trên môi trường NodeJS kết nối với Mongodb và cung cấp 1 API trả về danh sách các bài báo được lưu trữ
h Elasticsearch Kibana
Công cụ lưu trữ và trực quan hóa dữ liệu
Trang 62.2 2 Luồng xử lý dữ liệu chính của hệ thống
Luồng xử lý dữ liệu ssi
Trang 7Luồng xử lý dữ liệu các bài báo kinh tế
Trang 8Chương 3 Triển khai
3.1 Triển khai
3.1.1 Cài đặt
Hệ thống được cài đặt bằng docker, docker compose Thông số cụ thể của các container có trong bảng dưới:
Cluster Container Port Image
Hadoop namenode 9870
bde2020/hadoop- namenode:2.0.0-hadoop3.2.1-java8
datanode 9864
bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 Spark spark-master 8080
bde2020/spark-master:3.3.0-hadoop3.3 spark-worker 8081
bde2020/spark-worker:3.3.0-hadoop3.3 Elasticsearch elasticsearch 9200 docker.elastic.co/elasticsearch/ela
sticsearch:7.15.1 kibana 5601 docker.elastic.co/kibana/kibana:7
15.1 Kafka zookeeper 2181 wurstmeister/zookeeper
kafka 9092 wurstmeister/kafka
App pyspark_application myracoon/racoon_pyspark:mong
o stock_iboard_crawler myracoon/racoon_pyspark:mong
o articles_crawler myracoon/racoon_node:latest articles_server 3000 myracoon/racoon_node:latest
3.1.2 Thực hiện
a Crawl dữ liệu từ vnexpress
Nhóm lặp 10 phút 1 lần sử dụng RSS được cung cấp bởi vnexpress:
‘https://vnexpress.net/rss/kinh-doanh.rss’ để có được danh sách các bài báo bằng thư viện axios ở định dạng xml và dùng xml2json để đưa về json sử dụng
Sau đó với mỗi bài link sẽ sử dụng axios để lấy html rồi sử dụng Cheerio.js để lấy nội dung các thẻ p trong mã html của bài báo
Trang 9Cuối cùng gửi tất cả lên Kafka topic ‘article’
/article_crawler/index.js
b Crawl dữ liệu từ SSI Iboard
Đối với dữ liệu từ bảng giá SSI nhóm sử dụng python với thư viện request để gọi api
Trang 10/stock_iboard_crawler/serives/api.py Đối với dữ liệu từ bảng giá SSI nhóm sử dụng python với thư viện request để gọi api, thông tin để gọi api như đương dẫn, body, … được lưu trong các file json tại
‘/stock_iboard_crawler/config’ mà sẽ được stock_iboard_crawler ghi lên hadoop mỗi lần khởi động lại ví dụ:
/stock_iboard_crawler/config/ssi_stock_data_HNX.json
Dữ liệu sau khi lấy về sẽ được ghi 1 bản vào hadoop và gửi đường dẫn hadoop này lên Kafka cùng với đường dẫn file config và dấu thời gian
Trang 11c Xử lý dữ liệu tại pyspark_application
Đầu tiên khi khởi động pyspark_application sẽ tạo một ứng dụng spark, kết nối đến và lắng nghe kafka, tạo 1 kết nối đến mongodb
Tạo client spark Nhóm thực hiện tạo client spark với 4 core tối đa vì trong môi trường docker nhóm chỉ có thể chạy 1 spark worker với 8 core mà cần 4 core nữa cho ssi_iboard_crawler Sau đó nếu chưa có thông tin các mã chứng khoán thì chương trình sẽ sử dụng thư viện request để tìm nạp tất cả thông tin các mã chứng khoán và ghi ra
‘/data/stock.json’
Trang 12- Dữ liệu báo từ topic ‘article’
Sau khi có đầy đủ dữ liệu chương trình sẽ lắng nghe và xử lý dữ liệu từ kafka Đối với
dữ liệu từ topic ‘article’ là danh sách các bài báo thì chương trình sẽ thực hiện tiền xử
lý để loại bỏ các bài báo trùng lặp bằng cách tính cột id = ‘nguồn báo’ + ‘id của bài báo’ và xác định trùng lặp bằng cách kiểm tra id này đã tồn tại trong dataframe chứa các bài báo đã được ghi vào hadoop trong quá khứ chưa, cùng với việc chuẩn hóa lại thời gian xuất bản
/pyspark_application/services/article.py Sau đó sẽ sử dụng spark map để tìm ra các tag của bài báo (các mã chứng khoán được nhắc đến trong nội dung bài báo) bằng cách sử dụng regex để chỉ lấy ra chữ, số, dấu cách từ nội dung bài báo -> tách thành từng từ -> so khớp với từng mã chứng khoán -> trả về cột tag là chuỗi các mã chứng khoán cách nhau bởi dấu cách
/pyspark_application/services/article.py Sau đó ghi thông tin này vào hadoop và mongodb
Trang 13Tiếp theo tách từng bài báo theo từng lần mã cổ phiếu xuất hiện, xóa đi các hàng có tag rỗng và ghi vào elasticsearch
/pyspark_application/services/article.py
- Dữ liệu từ topic ‘crawl_data’
Dữ liệu từ SSI có 2 vấn đề một là dữ liệu sẽ có thể bị thiếu đi các cột dữ liệu do chưa đến giờ hoặc SSI chưa cập nhật thì api sẽ không trả về, và các cột có trả về thì cũng
có thể thiếu, bằng ký tự rỗng hoặc bằng null Vì vậy cần phải tiền xử lý
Đối với các vấn đề trên nhóm sử dụng hàm fill_data
/pyspark_application/services/ssi_stock_data.py Cùng với withColumn, dataframe.na.fill để tạo các mới nếu chưa tồn tại, cast lại các cột có giá trị thuộc kiểu string về đúng kiểu có thể tính toán là double, long, … điền giá trị mặc định vào các chỗ trống
Sau khi kết thúc quá trình tiền xử lý, nhóm sử dụng spark map để lặp qua từng hàng một và thêm vào các cột thông tin của doanh nghiệp tương ứng với mã cổ phiếu và sàn giao dịch
Sau đó vì dữ liệu doanh nghiệp được lấy từ api chưa hề qua xử lý vậy nên sẽ tồn tại các giá trị null và các trường như vốn điều lệ, số lượng nhân viên đều ở dạng string
Để xử lý điều đó nhóm thực hiện 2 đoạn code sau để đưa về kiểu giá trị đúng và điền giá trị mặc định vào các chỗ trống
Trang 14/pyspark_application/services/ssi_stock_data.py Sau khi xử lý lưu 1 bản dữ liệu vào Hadoop và 1 bản vào elasticsearch
/pyspark_application/services/ssi_stock_data.py
d Cung cấp API cung cấp thông tin các bài báo thu thập được
Dữ liệu các bài báo sau khi được ghi vào database mongodb sẽ có thể đọc thông qua một api cung cấp bởi 1 server nodejs Api cung cấp ở cổng 3000 container
article_server hoặc được map với cổng 3000 ở máy local
Trang 15Ví dụ sử dụng api ở cổng 3000
e Biểu diễn dữ liệu trên kibana
Dữ liệu SSI
Với dữ liệu từ SSI board nhóm sử dụng để visualize các thông số cơ bản của thị trường ví dụ như các mã có khối lượng giao dịch lớn nhất, các mã cổ phiếu có mức tăng, giảm lớn nhất trên sàn, độ rộng thị trường, phân bố khối lượng cổ phiếu giao dịch theo giá
Trang 16Ngoài các biểu đồ về toàn bộ thị trường với dữ liệu trên nhóm còn có thể xây dựng công cụ để theo dõi sự thay đổi của 1 cổ phiếu bất kỳ
Theo dõi mã cổ phiếu AAA trên sàn hose ngày 31 / 1
Theo dõi mã cổ phiếu AAA trên sàn hose sáng ngày 9 / 2
Với Kibana nhóm còn thử nghiệm so sánh mức độ thay đổi của một cổ phiếu về giá
và tỷ trọng giao dịch so với các cổ phiếu khác cùng ngành để giúp người dùng dễ
Trang 17dàng nhận định rủi ro, đưa ra các quyết định sáng suốt hơn trong việc lựa chọn đầu tư.
So sánh thay đổi về giá của AAA so với các cổ phiếu cùng ngành 1353 - Hóa chất
So sánh tỷ trọng khối lượng của AAA so với các cổ phiếu cùng sub sector 1353 - Hóa
chất
Dữ liệu các bài báo
Ngoài sử dụng cho api cung cấp thông tin các bài báo dữ liệu từ các bài báo còn được phần tích để tìm ra các mã doanh nghiệp được nhắc đến trong bài báo để tìm được độ phổ biến của một mã cổ phiếu trên phương tiện truyền thông
Trang 18Độ phổ biến trên các phương tiện truyền thông
Trang 19Chương 4: Kết luận và định hướng
Sau quá trình làm bài tập lớn, nhóm đã tìm hiểu vả triển khai được cơ bản về các công nghệ Kafka, Spark, Hadoop, Elasticsearch cùng Kibana từ đó đã xây dựng được một công cụ thực
sự có tác dụng giúp cho nhà đầu tư muốn có cái nhìn bao quát, toàn diện về thị trường chứng khoán
Định hướng tương lai có thể ứng dụng các công nghệ mới như học máy, các thuật toán phân tích văn bản và đa dạng hóa các nguồn tin như các bình luận trên nền tảng mạng xã hội cũng như mở rộng thêm các nguồn báo để có thể có được cái nhìn rõ nhất về suy nghĩ của thị trường
Đến đây thì project cũng đã hoàn thiện Nhóm 28 chúng em xin cảm ơn thầy đã hướng dẫn trong suốt quá trình làm project này Chúng em xin chân thành cảm ơn!
Trang 20TÀI LIỆU THAM KHẢO
[1] TS Trần Việt Trung, Slide lưu trữ và xử lý dữ liệu lớn
[2] Kafka documentation , https://kafka.apache.org/documentation/
[3] Pyspark documentation, https://spark.apache.org/docs/latest/api/python/
[5] MongoDB documentation, MongoDB Documentation
[7] Spark, Apache Spark Installation on Windows - Spark
[9] PySpark Document, Apache Spark Installation on Windows - Spark
[10] PySpark UDF, PySpark UDF (User Defined Function) - Spark
[12] Mongoose Document, Mongoose v6.4.6: Documents (mongoosejs.com)
[13] ExpressJS, Express "Hello World" example (expressjs.com)