Hướng dẫn python chứng khoán

Chào các bạn!

Hôm nay chúng ta làm bài thực hành phân tích dữ liệu chứng khoán nhằm ôn tập lại kiến thức cơ bản phân tích dữ liệu dựa và các thư viện mà ta đã học

Đầu tiên ta import các thư viện quen thuộc để thực hành nhé

import pandas as pd
import numpy as np
import datetime# Xử lý ngày tháng

Tiếp theo, để load dữ liệu chứng khoáng trực tuyến, ta sử dụng thư viện Investpy, thư viện này ta phải cài đặt vào Colab

!pip install investpy
import investpy

Các thư viện khác khi nào sử dụng chúng ta sẽ import thêm

Giờ ta load dữ liệu chứng khoán từ 3 ngân hàng là Ngân hàng Á châu – ACB, ngân hàng ngoại thương –  VCB, và ngân hàng Công thương – CTG, thời gian lấy dữ liệu từ ngày 01/01/2015 đến ngày hiện tại, ta làm như sau:

Load data CTG

start = "01/01/2015"
end  = dt.datetime.now().strftime("%d/%m/%Y")
company = "CTG"
CTG = investpy.get_stock_historical_data(stock= company, country= 'vietnam', from_date = start, to_date = end)              
CTG.head()

Hướng dẫn python chứng khoán

Kết quả trả về cho ta là 1 Data Frame,  với index là Date, và bắt đầu từ ngày 05/01/2015, có lẽ các ngày 1,2,3 và 4 là ngày nghỉ lễ và thứ 7, chủ nhật, nên không có dữ liệu.

Trong đó ý nghĩa các cột:

  • Open là giá mở cửa
  • High là giá cao nhất trong phiên giao dịch
  • Low: giá thấp nhất trong phiên
  • Close: giá đóng cửa (hay giá kết phiên)
  • Volume: khối lượng giao dịch (tổng số cổ phiếu giao dịch trong phiên)
  • Currency: cột đơn vị tiền tệ

Tiếp tục, ta lấy thêm 2 ngân hàng còn lại là ACB, VCB và lần này ta xóa luôn cột tiền tệ vì không cần thiết sử dụng

Load ACB

ACB = investpy.get_stock_historical_data(stock= "ACB", country= 'vietnam', from_date = start, to_date = end)
                                        
ACB.drop("Currency", axis = 1, inplace = True)
ACB.head()

Hướng dẫn python chứng khoán

Load VCB

VCB = investpy.get_stock_historical_data(stock= "VCB", country= 'vietnam', from_date = start, to_date = end)
                                      
VCB.drop("Currency", axis = 1, inplace = True)
VCB.tail()# lấy thông tin 5 dòng cuối của VCB

Hướng dẫn python chứng khoán

Xem thông tin tổng quát dữ liệu trên

VCB.info()

Hướng dẫn python chứng khoán

Dữ liệu có 1745 dòng, không dữ liệu nào rỗng, với 4 cột là kiểu dữ liệu số thực và 1 cột kiểu số nguyên, tổng cộng 5 cột và index định dạng Datetime

Giờ ta nối 3 Data frame trên lại thành một bảng dữ liệu mới để tiện phân tích, ta đặt tên là bank_stock

Để nối các dữ liệu trên ta dùng phương thức concat() và truyền vào 1 list là các data frame trên

Trước tiên ta tạo 1 list_banks là tên các mã cổ phiếu trên

list_banks = ['CTG', 'ACB', 'VCB']

list_bank này có tác dụng để tạo đối số cho tham số keys trong lệnh concat()

# Tham số axis = 1 là nối theo cột
bank_stocks = pd.concat([CTG,ACB,VCB],axis=1, keys = list_banks)

Hướng dẫn python chứng khoán

Tiếp theo đặt tên cột cho data frame trên

bank_stocks.columns.names = ['Bank Name','Stock Info']

Hướng dẫn python chứng khoán

Sử dụng phương thức .xs() trong pandas để lập chỉ mục đa cấp để tìm giá trị đóng cửa lớn nhất của từng cổ phiếu trên, bạn có thể tìm hiểu thêm về phương thức xs() tại đây : https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.xs.html

bank_stocks.xs(key='Close',axis=1,level='Stock Info').max()

Hướng dẫn python chứng khoán

Giờ ta tính tỉ suất lợi nhuận dựa trên công thức sau:

Hướng dẫn python chứng khoán

Tương ứng với (giá đóng cửa hiện tại – giá đóng cửa ngày trước đó)/giá đóng cửa ngày trước đó

Ví dụ: bạn mua món một món hàng giá 5 đồng ngay hôm qua, hôm nay giá nó tăng lên 10 đồng, vậy tỷ suất lợi nhuận của bạn là giá hôm nay là 10 đồng trừ giá hôm qua là 5 đồng và ta chia cho giá hôm qua 5 đồng: (10-5)/5 = 1, tương ứng với tỷ suất lợi nhuận của bạn là một, nếu tính theo phần trăm lợi nhuận thì bạn đem tỷ suất lợi nhuận trên nhân với 100 lúc này bạn có 100% lợi nhuận trên giá vốn bạn bỏ ra.

Tỷ suất lợi nhuận càng cao, thì cổ phiếu càng nổi bật, khả năng sinh lời nhiều.

Tạo một DataFrame trống mới được gọi là value_banks. Data frame này sẽ chứa tỷ suất lợi nhuận cho từng cổ phiếu của ngân hàng trên

value_banks = pd.DataFrame()

Tạo một vòng lặp for để lặp qua với mỗi mã cổ phiếu ngân hàng

Tiếp theo, ta tạo một cột tên là “mã cổ phiếu + value_bank” = giá trị tỷ suất lợi nhuận

Để tính tỷ suất lợi nhuận, ta dùng hàm pct_change trong pandas và áp dụng cho giá đóng cửa cửa từng mã cổ phiếu theo code bên dưới.

Phương thức .pct_change() để tính toán thay đổi % theo thời gian. Sự thay đổi này được tính (giá trị row hiện tại – giá trị row trước đó)/ (giá trị row trước đó). bạn có thể tham khảo thêm phương thức này tại đây:
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pct_change.html

for name in list_banks:
    value_banks[name+' value_bank'] = bank_stocks[name]['Close'].pct_change()
value_banks.head()

Hướng dẫn python chứng khoán

Vì dòng đầu tiên không có dữ liệu để tính nên trả về giá trị NaN, ta có thể xóa luôn dòng này

value_banks.dropna(inplace= True)

Dùng Seaborn sử dụng biểu đồ pairplot để tìm cổ phiếu nổi bật dựa trên giá trị lợi nhuận bên trên

import seaborn as sns
sns.pairplot(value_banks)

Hướng dẫn python chứng khoán

Vẽ biểu đồ phân phối chuẩn lợi nhuận cổ phiếu ACB vào năm 2020

import matplotlib.pyplot as plt
plt.figure(figsize=(15,5)) # Tùy chỉnh kích thước biểu đồ
sns.distplot(value_banks.loc['2020-01-01':'2020-12-31']['ACB Value_bank'],color='green',bins=100)

Hướng dẫn python chứng khoán

Lấy giá đóng cửa các cổ phiếu trên bằng biểu đồ matplotlib

ta dùng vòng for để lặp qua Data frame các cổ phiếu trên

for tick in list_banks:
    bank_stocks[tick]['Close'].plot(figsize=(12,4),label=tick)
plt.legend()

Hướng dẫn python chứng khoán

Hoặc sử dụng phương thức xs() để lấy từng mã cổ phiếu

bank_stocks.xs(key='Close',axis=1,level='Stock Info').plot(figsize =(12,8))

Hướng dẫn python chứng khoán

Đường trung bình động – MA

Đường MA (hay còn gọi là Moving Average) là đường trung bình động, thể hiện biến động, chỉ báo xu hướng của giá cổ phiếu trong một khoảng thời gian. Mục đích chính của đường MA là theo dõi giá đang vận động theo xu hướng tăng hoặc giảm hay không có xu hướng

Vẽ đường trung bình động và giá đóng cửa cổ phiếu ACB bằng Matplotlib

plt.figure(figsize=(12,6))
ACB['Close'].loc['2020-01-01':'2021-01-01'].rolling(window=30).mean().plot(label='MA30')
ACB['Close'].loc['2020-01-01':'2021-01-01'].plot(label='ACB CLOSE')
plt.legend()

Hướng dẫn python chứng khoán

Dùng bản đồ nhiệt (Heatmap) để xem độ tương quan giá đóng cửa của các cổ phiếu trên

plt.figgure(figsize=(12,5))
sns.heatmap(bank_stocks.xs(key='Close',axis=1,level='Stock Info').corr(),annot=True)

Hướng dẫn python chứng khoán

Sử dụng Seaborn Clustermap để nhóm các cổ phiếu có tương quan với nhau

sns.clustermap(bank_stocks.xs(key='Close',axis=1,level='Stock Info').corr(),annot=True)

Hướng dẫn python chứng khoán

Sử dụng thư viện cufflinks – plotly để trực quan tương tác với biểu đồ

nhớ cài đặt thư viện cufflinks và plotly, vì 2 thư viện này không có sẵn trên colab nhé bạn

!pip install cufflinks
!pip install plotly

Import thư viện

import cufflinks as cf
cf.go_offline()
# Để hiển thị trên google colab ta import thêm plotly như bên dưới
import plotly.io as pio 
pio.renderers.default = "colab"

Vẽ biểu đồ thể hiện giá đóng cửa của các mã cổ phiếu trên bằng cufflinks

bank_stocks.xs(key='Close',axis=1,level='Stock Info').iplot(title = "Giá đóng cửa",
                                                            xTitle = "Năm", yTitle = "Giá")

Hướng dẫn python chứng khoán

Vẽ đường SMA 7, 14, 21 cổ phiếu CTG

Đường SMA là gì? Đường Simple Moving Average (SMA): là đường trung bình động đơn giản được tính bằng trung bình cộng các mức giá đóng cửa trong một khoảng thời gian giao dịch nhất định.

CTG['Close'].loc['2020-01-01':'2021-01-01'].ta_plot(study='sma',periods=[7,14,21],title='SMA CTG')

Hướng dẫn python chứng khoán

Vẽ dãi bollinger đơn giản cổ phiếu VCB trong năm 2020

VCB['Close'].loc['2020-01-01':'2021-01-01'].ta_plot(study='boll')

Hướng dẫn python chứng khoán

Vẽ biểu đồ hình nến mã chứng khoán ACB để phân tích kỹ thuật

Biểu đồ hình nến đơn giản từ năm 2020 mã chứng khoán ACB

ACB[['Open', 'High', 'Low', 'Close']].loc['2020-01-01':'2021-01-01'].iplot(kind='candle')

Hướng dẫn python chứng khoán

cf.datagen.ohlc()
acb_plot = cf.QuantFig(ACB,title = 'Biểu đồ hình nến',legend = "Top", name = "Nến")
acb_plot.add_bollinger_bands(colors =["red", 'green'])
acb_plot.iplot()

Hướng dẫn python chứng khoán

Phóng to:

Hướng dẫn python chứng khoán

Thêm vào các chỉ số phân tích kỹ thuật khác của mã chứng khoán ACB

Khối lượng giao dịch, đường macd, đường sma, đường rsi, dãi bollinger

acb_plot.add_sma([10,20],width=2,color=['green','lightgreen'],legendgroup=True)
acb_plot.add_rsi(periods=20,color='java')
acb_plot.add_bollinger_bands(periods=20,boll_std=2,colors=['magenta','grey'],fill=True)
acb_plot.add_volume()
acb_plot.add_macd()
acb_plot.iplot()

Hướng dẫn python chứng khoán

Bên trên ta đã cơ bản đi xong phần phân tích dữ liệu chứng khoán các mã cổ phiếu ngân hàng quen thuộc.

Các bạn dựa trên bài phân tích của mình, sau đó mở rộng thêm nhóm cổ phiếu, ví dụ nhóm cổ phiếu ngân hàng, nhóm cổ phiếu ngành xây dựng, nhóm cổ phiếu chứng khoán, nhóm cổ phiếu ngành thép… đễ phân tích, tìm hiểu mối tướng quan giữa các cổ phiếu đó. và sau đó tập trung cổ phiếu bạn quan tâm để phân tích sâu hơn.