Hướng dẫn yfinance python - con trăn yfinance
Hôm nay chúng ta sẽ cùng nhau tạo một website phân tích chỉ số thị trường chứng khoán của Alphabet Inc (thuộc Google), sử dụng Python và một số thư viện hỗ trợ: Show
Prerequisite cho bài viết này tất nhiên là bạn phải có một kiến thức cơ bản về ngôn ngữ Python và một chút về jupyternotebook - ứng dụng chạy trên nền web cho phép chạy interactive python, nếu không bạn cũng có thể đọc lướt qua như một sự tò mò và dò xét xem "Python liệu làm được trò trống gì?". OK. let's move on! 1. Cài đặt pandas_datareader để get dữ liệuNhư đã giới thiệu từ trước, cách thường lệ mà chúng ta vẫn làm khi kiếm data là sử dụng web browser, lên google gõ keyword cần tìm, đến trang web cung cấp datasource và thực hiện tải về, song với sử dụng thư viện pandas_datareader và Python, bạn có thể tải trực tiếp mà không cần dùng đến bất kì browser nào. Thời gian trước, pandas_datareader chỉ là một module trong pandas library, nhưng hiện tại nó đã một standalone library. Để cài đặt thư viện trên môi trường Windows, bạn chỉ cần gõ trên command, ở đây mình đã cài đặt sẵn:
2. Tạo file code trên jupyer notebookGet data from datasourceVới những ai chưa biết/chưa từng nghe tới, jupyer notebook là một ứng dụng chạy trên nền web cho phép chạy interactive python, tương tự như một IDE vậy. Mình tạo mới một file và đặt tên là stock_analysis.py Tiếp theo, chúng ta sẽ chọn một mã chứng khoán để phân tích, mình thích GOOGLE nên chúng ta sẽ chọn GOOGLE để phân tích, mã chứng khoán tương ứng cho công ty này là GOOG, bạn có thể chọn bất kì công ty nào khác tuỳ thích miễn là công ty đấy có bán cổ phiếu trên sàn chứng khoán Đầu tiên chúng ta cần require hai thư viện cần thiết là pandas_datareader và datetime, sau đó thực hiện get dữ liệu. DataReader nhận vào 4 tham số lần lượt là:
Dữ liệu thu về là một bảng hai chiều dạng data-frame. Nếu bạn không có kiến thức về các chỉ số trong bảng, đừng lo mình sẽ giới thiệu trong phần tiếp theo. OK, đã thu được một chút thành quá là một bảng với chi chít số, chúng ta sẽ tiếp tục phân tích bảng dữ liệu, ý nghĩa của các dòng, cột, các con số
Trong phạm vi bài viết này mình chỉ giới thiệu sơ qua về các cột, chúng ta sẽ chỉ sử dụng các cột High, Low, Open, Close mà thôi. Visualize data using candlestick chartOkay, đầu tiên chúng ta sẽ nhìn qua kết quả mà chúng ta hướng đến, trả lời cho câu hỏi: How the output looks like? Nếu bạn chưa biết về candlestick thì có thể xem thêm chú thích ở đây nhé: Mình tạo một hàm mới có tên là inc_des() với input là chỉ số close và open của từng ngày và output là kết quả so sánh hai giá trị: Increase, Decrease hay Equal Sau đó thêm từ các chỉ số trong bảng, ta thêm cột Status với các trạng thái tương ứng được trả về từ hàm inc_dec():
Lúc này, một cột mới với tên cột là "Status" được add vào dataframe: Chúng ta sẽ bắt đầu việc xây dựng hệ trục tọa độ cho biểu đồ bằng hàm figure
Tiếp tục dựng các hình chữ nhật (thân nến - rectangle) bằng hàm rect() với tọa độ của hình chữ nhật được xác định như sau Toạ độ x được xác định bằng đúng ngày xét đến trên trục OX, tọa độ trên và dưới của hình chữ nhật được xác định bằng chỉ số open và close, có nghĩa là tâm của hình chữ nhật trên trục Oy sẽ bằng giá trung bình của Open và Close, mình thêm một cột có tên là Middle để tính giá trị trung bình nói trên và một cột Height để tính chiều cao của hình chữ nhật.
Theo thường lệ, những ngày giá trị của cổ phiếu tăng (close > open), biểu đồ sẽ hiển thị bằng màu xanh, ngược lại người ta thường biểu diễn bằng màu đỏ ( =)) thị trường đẫm máu) nên ta sẽ tách riêng câu lệnh vẽ hình chữ nhật cho ngày tăng và cho ngày giảm thành hai câu lệnh riêng biệt như sau:
Merge tất cả các đoạn code và chạy:
Yeah, gần được nửa chặng đường rồi, tiếp theo chúng ta sẽ vẽ các đường biểu thị chỉ số High - Low Đơn giản hơn so với vẽ hình chữ nhật, ta chỉ cần sử dụng method segment để vẽ các đoạn thẳng (khúc). Tham khảo thêm về segment tại đây nhé
Chạy tiếp xem có gì mới nào :-? OK có vẻ khá ổn nhưng vẫn chưa chuẩn, do segment() được đặt sau rect() nên đoạn thẳng sẽ đè lên hình chữ nhật, để khắc phục vấn đề này, ta chỉ cần move câu lệnh vừa thêm vào trước các câu lệnh vẽ hình chữ nhật (rect). Cùng sửa lại và xem kết quả nhé: Ầu, nhìn khá ổn áp rồi. Tiếp tục để có cái nhìn tổng quan hơn hay nhìn được bức tranh vĩ mô hơn, ta cần kéo dài khoảng thời gian. Mình sẽ sửa start_date từ 2019/12/1 thành 2019/06/15. Vậy là ta sẽ thấy được bức tranh tổng quan từ 2019/06/15 đến 2019/12/15. Ầu, nhìn khá ổn áp rồi. Tiếp tục để có cái nhìn tổng quan hơn hay nhìn được bức tranh vĩ mô hơn, ta cần kéo dài khoảng thời gian. Mình sẽ sửa start_date từ 2019/12/1 thành 2019/06/15. Vậy là ta sẽ thấy được bức tranh tổng quan từ 2019/06/15 đến 2019/12/15. Kết quả: Yay, looks nice trông nguy hiểm phết rồi. Vậy là trong phần 1 này, mình đã tạo một biểu đồ thống kê chứng khoán dạng đơn giản, đây gần như chỉ là một phần nhỏ mô tả sức mạnh vô cùng lớn của Python cùng tập hợp vô số các thư viện thứ 3 hỗ trợ. Ở Phần 2 tiếp theo, mình sẽ hướng dẫn các bạn kết hợp kết quả của phần một cùng một chút ít kiến thức về Flask framework để tạo nên một trang web đơn giản và deploy lên Heroku. trông nguy hiểm phết rồi. Vậy là trong phần 1 này, mình đã tạo một biểu đồ thống kê chứng khoán dạng đơn giản, đây gần như chỉ là một phần nhỏ mô tả sức mạnh vô cùng lớn của Python cùng tập hợp vô số các thư viện thứ 3 hỗ trợ. Ở Phần 2 tiếp theo, mình sẽ hướng dẫn các bạn kết hợp kết quả của phần một cùng một chút ít kiến thức về Flask framework để tạo nên một trang web đơn giản và deploy lên Heroku.Many thanks. Have fun! |