Giả sử phí giao dịch là 0%, xác định đường SMAngắn hạn và đường SMAdài hạn để nhà đầu tư có thê kiếm được số tiền nhiều nhất sau khi thực hiện chiến thuật giao dịch dựa trên dwong SMA...
Trang 1
TRƯỜNG ĐẠI HỌC NGÂN HÀNG TP HÒ CHÍ MINH
KHOA NGÂN HÀNG
BÁO CÁO TIỂU LUẬN MÔN
TRÍ TUỆ NHÂN TẠO TRONG GIAO DỊCH ĐỊNH LƯỢNG
NGƯỜI HƯỚNG DẪN: ThS TRAN ANH TUAN NGUOI THUC HIEN : NGUYEN THI BICH LY
Trang 3LỜI CAM ĐOAN
Tôi cam đoan đây là bài làm nghiên cứu đo tôi thực hiện Những kết quả tính toán và lập luận do chính tôi thực hiện, không sao chép bất kỳ nguồn nào khác Tôi hoàn toàn chịu trách nhiệm trước nhà trường về sự cam đoan nảy
1P.HCM, ngày l3 tháng 1] năm 2023 Sinh viên thực hiện
Nguyễn Thị Bích Ly
Trang 4NHẬN XÉT CỦA GIÁO VIÊN
1P.HCM, ngày l3 tháng lÌ năm 2023
Trang 5ĐÈ BÀI TIỂU LUẬN
Sử dụng dữ liệu giao địch của các cô phiếu VCB trong giai đoạn từ ngày
03/01/2016 đến ngày 03/01/2023 tải từ VNSTOCK Dữ liệu bao gồm các biến:
"TradingDate": ngay giao dich, "Open": gia mo cwa, "High": gia cao nhat, "Low": giá thấp nhất, "Close" giá đóng cửa, "Volume": khối lượng giao dịch
Yêu câu:
I Vẽ đồ thị biểu diễn giá đóng cửa của cô phiếu VCB, đường SMA(20) và
đường SMA(50) trong giai đoạn trên
2 Xây dựng chiến thuật giao dịch dựa trên đường SMA(ngắn hạn) và đường
SMA(dài hạn) Cụ thể, khi đường SMA(ngắn hạn) cắt từ dưới lên đường SMA(dai hạn) là tín hiệu "Mua" Trong khi, đường SMA(ngắn hạn) cắt từ trên xuống đường SMA(dài hạn) là tín hiệu "Bán"
3 Với số tiền đầu tư là 100.000.000 đồng, mỗi lần thực hiện giao dịch sẽ mua
100 cổ phiếu/giao dịch Giả sử phí giao dịch là 0%, xác định đường SMA(ngắn hạn) và đường SMA(dài hạn) để nhà đầu tư có thê kiếm được số tiền nhiều nhất sau khi thực hiện chiến thuật giao dịch dựa trên dwong SMA Lưu ý, ngắn hạn chỉ được xác định từ 10 đến 20 ngày, dài hạn chỉ được xác định từ 30 đến 50 ngày
4 Sử dụng chiến thuật giao dịch theo các đường SMA đã xác định ở câu 3 để lựa chọn cô phiếu có tỷ suất sinh lợi cao nhất trong rô các cô phiếu ngành ngan hang sau ['CTG’, 'STB', 'HDB’, 'EIB', 'BID', 'VPB', 'ACB', 'TCB', 'MBB’,
'VIB', 'SHB', 'VCB', 'LPB', 'TPB] giai đoạn từ ngày 03/01/2016 đến ngày 03/01/2023 Biết số tiền đầu tư là 100.000.000 đồng, phí giao dịch là 0% và
lượng cô phiếu trong mỗi giao dich là 100 cô phiếu/giao dịch
Trang 6MỤC LỤC
LỜI MỞ ĐẦU 2-22 22122122212211121122212211021112122122121221121211121221 ra 1 NOI DUNG ooo cccccccccsssesesessssssseessnssstessessssersusssesasessrestinssseesiesssesiissssetiustaretasesssesseesend 2 COU Le ieee ccc cessseccssesssesssessssesssretereesesssesstitestsuestiseriseesaretireesssestssessuersseeraneesaresee 3 CBU Qe occ cccceessseessseessseerssessiserssseteresesessssestitsssuestsserareesasetareesssestisetieerssieraneesaresee 7 Câu Ồ: 22-2222222112221122111221102112222122112221212212212 re 13
Với số tiền đầu tư là 100,000,000 VNĐ, phí giao địch là 0% l6
So sánh SMA (20,50) và SMA (11,37) - 5522221222122 E2 re 17
Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 0.3% 22
Câu 4 -2222221222112221221112121121112112211212212122 21 ereerye 24
THI: Với số tiền đầu tư 1a 100,000,000 VND, phi giao dich la 0% 24 TH2: Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 0.2% 29
KẾT LUẬN 52 2122222221221122112211211221121122121212222122 re 31
Trang 7LỜI MỞ ĐẦU
Thị trường chứng khoán ngày càng trở nên phức tạp và biến động, đặt ra những thách thức lớn cho nhà đầu tư Đề thành công trên thị trường chứng khoán, nhà đầu tư cần có khả năng dự đoán chính xác xu hướng giá và tận dụng các cơ hội đầu tư Tuy nhiên, việc dự đoán xu hướng giá là một nhiệm vụ khó khăn, đòi hỏi nhà đầu tư phải có kiến thức, kinh nghiệm và kỹ năng phân tích thị trường Trí tuệ nhân tạo (AI) có thể là một giải pháp giúp nhà đầu tư nâng cao khả năng dự đoán và tận dụng cơ hội trong giao dịch chứng khoán AI là một lĩnh vực
nghiên cứu khoa học máy tính liên quan đến việc phát triển các hệ thống máy tính
có thể tự động thực hiện các nhiệm vụ mà trước đây chỉ có thể được thực hiện bởi con người AI đã có những tiến bộ đáng kinh ngạc trong những năm gần đây, và nó đang được sử dụng trong nhiều lĩnh vực khác nhau, bao gồm cả giao dịch chứng
khoán
Trong bài tiêu luận này, nhóm chúng em sẽ tập trung vào cô phiếu VCB - một trong những ngân hàng hàng đầu Việt Nam Sử dụng AI để xây dựng và kiểm thử một chiến thuật giao dịch có cơ sở khoa học, chủ động và linh hoạt Chiến thuật giao dịch này sẽ sử dụng các thuật toán học máy để phân tích đữ liệu lịch sử giá cô phiếu VCB và dự đoán xu hướng giá trong tương lai
Kết quả nghiên cứu cho thấy chiến thuật giao dịch AI có thể giúp nhà đầu tư cải thiện khả năng sinh lời trong môi trường thị trường chứng khoán đây thách thức Chiến thuật giao dịch này có thể dự đoán chính xác xu hướng giá với độ chính xác cao, giúp nhà đầu tư năm bắt được các cơ hội đâu tư tiêm năng
Trang 8NỘI DUNG
s* Cài đặt các thư viện can thiết:
1 lpip install vnstock backtesting ta
!pip install vnstock: tải gói thư viện Python cho phép tải dữ liệu chứng khoán với
cú pháp đơn giản sử dụng đữ liệu đáng tin cậy được cung cấp bởi public api từ Techcombank Security (TCBS) va SSI
import matplotlib.pyplot as plt: module của matplotlib, dùng để vẽ đỗ thị và trực quan hóa dữ liệu
import pandas as pd: cung cấp các cấu trúc dữ liệu và các công cụ phân tích đữ
liệu hiệu suất cao
from vnstock import *; Nhap tat cả các chức năng từ thư viện vnstock Thư viện này chủ yếu được sử dụng để lấy đữ liệu chứng khoán từ sàn giao dịch Việt Nam from backtesting import Backtest, Strategy: Nhap cac lop Backtest va Strategy
từ thư viện backtesting Thư viện này hỗ trợ thực hiện các quá trình backtesting cho chiến lược giao dịch
ta.trend Day la mét ham giúp tính toán chỉ số đơn giản của đường trung bình (Simple Moving Average - SMA)
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
Requirement already satisfied:
vnstock in /usr/local/1ib/python3.16/dist-packages (0.2.8.6) backtesting in /usr/local/lib/python3.10/dist-packages (8.3.3)
ta in /usr/local/lib/python3.10/dist-packages (@.11.0)
numpy>=1.17.@ in /usr/local/1lib/python3.10/dist-packages (from backtesting) (1.23.5) pandas!=@.25.0,>=0.25.@ in /usr/local/lib/python3.10/dist-packages (from backtesting) (1.5.3) bokeh>=1.4.0 in /usr/local/lib/python3.10/dist-packages (from backtesting) (3.3.0) Jinja2>=2.9 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (3.1.2) contourpy>=1 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (1.2.0) packaging>=16.8 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (23.2) pillow>=7.1.0 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.@->backtesting) (9.4.0) PyYAML>=3.10 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (6.0.1) xyzservices>=2021.89.1 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (2823.19.1) python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas!=0.25.0,>=0.25.0->backtesting) (2.8.2) pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas!=0.25.0,>=0.25.0->backtesting) (2023.3.post1) Markupsafe>=2.ð in /usr/local/1ib/python3.18/dist-packages (from 3inja2»=2.9->bokeh›=1.4.0->backtesting)} (2.1.3) six>=1.5 in /usr/local/lib/python3.16/dist-packages (from python-dateutil>=2.8.1->pandas!=0.25.0,>=8.25.0->backtesting) (1.16.6)
Trang 9Cau 1:
Đầu tiên, ta thực hiện lệnh đọc dữ liệu từ một file CSV Trong trường hợp này, file
CSV được đọc có đường dan '/content/VCB.csv'
2022/12/27 2022/12/28 2022/12/29 2022/12/30 2023/01/03
VCB VCB VCB VCB VCB
Lấy thông tin của mã cỗ phiếu VCB từ ngày 03/01/2013 đến 03/01/2023:
1 # Lấy dữ liệu lịch sử giao dịch của VCB từ ngày 03/01/2013 đến ngày 03/01/2023
2 df = stock historical_data(symbol='VCB', start_date="2013-01-03', end_date='2023-01-03')
3 df.columns = ['TradingDate’,'Open'’, ‘High’, Low’, ‘Close’, ‘Volume’, 'Ticker*]
4
5 # Chuyển cột TradingDate sang kiểu datetime
6 df['TradingDate'] = pd.to_datetime(df[ 'TradingDate ' ])
7
8 # Sử dụng cột TradingDate làm khóa chính
9 df = df.set_index('TradingDate' )
10 df
Trang 10TradingDate 2013-01-04 9960 10490 9890 10380 501540 VCB 2013-01-07 9960 10670 9960 10670 1312740 VCB 2013-01-08 10880 11200 10700 11200 1035220 VCB 2013-01-09 10700 11270 10670 11270 1583320 VCB 2013-01-10 11310 11560 10920 11560 645400 VCB 2022-12-27 67650 68160 66810 66980 1058000 VCB 2022-12-28 68080 69430 67320 67740 1173500 VCB
20221229 69690 69860 68160 68330 1237400 VCB 2022-12-30 70190 70360 67740 67740 1510900 VCB 2023-01-03 67910 69940 67910 69940 1089800 VCB
2495 rows x 6 columns
df = stock_historical_data (symbol = 'VCB', start_date = '2013 - 01 - 03),
end_date = '2023 - 01 - 03') : là một lệnh để gán biến df bằng kết quả của ham
stock historical data với các tham số “VCB', ‘2013-01-03’ va ‘2023-01-03’ Ham
nào đó Tham số “VCB' là mã cô phiếu của Ngân hàng TMCP Ngoại thương Việt
Nam Tham số “2013-01-03” và 2023-01-03” là khoảng thời gian muốn lấy dữ liệu,
từ ngày 03 tháng 01 năm 2013 đến ngày 03 tháng 01 năm 2023 Kết quả trả về của
ngày, giá mở cửa, giá cao nhất, giá thấp nhất, giá đóng cửa và khối lượng giao dịch của cô phiếu “VCB' trong khoảng thời gian đã cho
dƒ = dƒset index('TradingDafe'): là một lệnh đề gán biến df bằng kết quả của phương thức set _index của DataFrame với tham số “TradingDate° Phương thức set Index của DataFrame là một phương thức để đặt một cột hoặc nhiều cột làm chỉ
số (index) cia DataFrame Chỉ số là một nhãn duy nhất để xác định mỗi hàng của DataFrame Bạn có thể sử dụng chỉ số để truy cập, lọc hoặc sắp xếp đữ liệu theo hàng Tham số “TradingDate` là tên của cột muốn đặt làm chỉ số Lệnh nảy sẽ trả về một DataFrame mới với cột ‘TradingDate’ lam chi số và gán lại cho bién df
Trang 11Tạo 2 chỉ báo trung bình động đơn giản (SMA) cho khung dữ liệu về giá
cô phiếu:
1 # Vẽ đồ thị giá đóng cửa của VCB từ ngày 03/01/2013 đến ngày 03/01/2923
2 df['SMA 26" ] = sma_indicator(close=df[ 'Close'], window=29) #Đường SMA (20)
df[‘SMA 20°] = sma_indicator(close=df{‘Close’], window=20): tạo ra cột SMA 20 với bước là 20 điểm trung bình kết quả liên tục
df{‘SMA 50°] = sma_indicator(close=df{‘Close’], window=50): tao ra cột SMA 50 với bước là 50 điểm trung bình kết quả liên tục
plt.plot(dff'Close'], label='Close'): Day là lệnh đê vẽ đồ thị dữ liệu giá đóng
cửa của cô phiếu VCB Cột 'Close' trong DataFrame 'df' chứa thông tin về giá đóng cửa của cô phiêu Đô thị này được đánh dâu nhãn là 'Close'
plt.plot(df['SMA 20'], label='SMA 20'): Đây là lệnh đề vẽ đồ thị đữ liệu của
đường trung bình đơn giản (Simple Moving Average - SMA) với cửa số 20 Cột
'SMA 20' trong DataFrame 'df chứa thông tin về giá trung bình đơn giản SMA(20)
Đồ thị này được đánh dấu nhãn là '$SMA 20'
plt.plot(df['SMA 50'], label='SMA 50'): tương tự như trên nhưng vẽ đồ thi
biéu dién chi bao SMA 50
plt.title(D6 thi biéu dién gid dong cia cé phiéu VCB'): Lénh nay dat tiéu
dé cho dé thị, là "Đồ thị biểu diễn giá đóng của cô phiếu VCB"
pử.xIabel('Thời gian '): Lệnh này đặt nhãn cho trục x của đồ thị, là "Thời gian"
Trang 12pH.ylabel('Giá(VND)'): Lệnh này đặt nhãn cho trục y của đồ thị, là "Giá(VND)", pử.legend(): Lệnh này hiên thị chú thích trên đồ thị, hiến thị các nhãn của các dòng
dữ liệu tương ứng với các đường vẽ trên đồ thị
Từ đó, ra được kết quả như sau:
Đồ thị biểu diễn giá đóng của cổ phiếu VCB cùng với SMA 20 và SMA 50
Trong khi đó, SMA giá đóng cửa chỉ đơn giản là giá trung bình của tài sản trong một khoảng thời gian nhất định, không quan tâm đến số lượng phiên hay giá
Trang 13Ngoài ra, sự khác nhau giữa các biên độ giao động còn cho thấy mức độ độc lập của SMA đó với sự biến động ngắn hạn của tài sản SMA 50 có xu hướng chậm hơn trong việc đáp ứng với sự biến động ngắn hạn, trong khi SMA 20 và SMA giá đóng cửa có xu hướng nhanh hơn Điều này cho phép người đầu tư chọn phù hợp với nhu cầu đầu tư của mình và sử dụng các SMA khác nhau để đánh giá xu hướng của tải sản theo thời gian và mục đích đâu tư khác nhau
Mua: SMA (20) > SMA (50) va SMA (20) hic trréc <= SMA (50) hic trudéc
Bán: SMA (20) < SMA (50) và SMA (20) lúc trước >= SMA (50) lúc trước
- - Bước 1; Tao cét position cua DataFrame ‘df dé luu két qua quyét dinh mua bán của chiến lược giao dịch chiến thuật giao dịch dựa trên đường
SMA(ngăắn hạn) và đường SMA(dài hạn)
[9] # Tạo cột position để lưu kết quả quyết định mua bán của chiến lược giao dịch chiến thuật giao dịch dựa trên ¿
df.1oc[(df['SMA 20"] > df["SMA 50"]) & (df['SMA 26'].shift(1) ‹= df['SMA 58'].shift(1)), 'position'] = 1 df.1oc[(df['SMA 20'] < df['SMA 50"]) & (df['SMA 26'].shift(1) >= df['SMA 58'].shift(1)), 'position'] = -1
df[df['position" ].notnu11() ]
o df.loc[(df['SMA 201] > df['SMA 50]) & (df['SMA 20').shift(1) <= df['SMA 50'].shift(1)), 'position'] = 1 ; gan gia tri 1 vào cột 'position' nếu 'SMA 20! lén hon 'SMA 50' và 'SMA 20' của hàng trước đó nhỏ hơn hoặc
bằng 'SMA 50' của hàng trước đó
o df.loc[(df['SMA 201] < df['SMA 50°]) & (df['SMA 20').shift(1) >= df['SMA 50'].shift(1)), 'position'] = -1 ; gan gia tri -1 vao cột 'position' nếu 'SMA 20' nhỏ hơn 'SMA 50' và 'SMA 20' của hàng trước đó lớn hơn hoặc
bằng 'SMA 50' của hàng trước đó
Trang 14o_ đf[df['position'].notnullQ]: lọc ra các hàng trong DataFrame ‘df chi lay những hàng mà cột 'position' không null, nghĩa là chỉ lấy các hàng mà đã duoc gan gia tri | hoặc -l trong hai dòng lệnh trước
Kêt quả cuôi cùng của các câu lệnh này là việc gán giá trị l cho cét 'position' khi có tín hiệu “Mua” và gan giá trị -l khi có tín hiệu “Bán” dựa trên sự cắt của hai đường SMA Điêu này có thê được sử dụng đê xác định các thời diém mua va ban trong chiến thuật giao dịch dựa trên SMA
©o_ Bảng dữ liệu hiển thị c6t “position” cé gid tri la 1 va -1
Bước 2: Định nghĩa một lớp con của Stratesy (GeneralStrategy) cho chiến lược giao dịch và có hai phương thức chính
Trang 15+ Nếu self.data.position có giá tri la 1, điều này cho biết chiến lược quyết định mua Trong trường hợp này, nó sẽ mua 100 cô phiếu VCB (sử dụng lệnh self.buy(size=100)
+ Nếu `selfdata.position` có giá trị là -I, điều này cho biết chiến lược quyết định bán Trong trường hợp này, nó sẽ đóng tất cả vị trí giao dịch đang
mở (sử dụng lệnh self.position.close(), tức là bán tất cả cô phiếu VCB đã mua trước đó
— Tóm lại, GeneralStrategy là một lớp con của Strategy được sử dụng để xác định cách chiến lược quyết định mua và bán cô phiếu dựa trên giá trị của biến self.data.position Néu ‘position’ bang 1, thì nó mua cô phiéu, va néu ‘position’ bang -1, thì nó bán cô phiếu
số tiền ban đầu là 100.000.000 VND (100 triệu VND) và không tính phí giao
True) và không cho phép giao dịch cùng lúc (exclusive_orders = True)
Trang 16o bt = Backtest( ): Tao mét déi tong backtest (‘bt’) bằng cách cung cấp đữ liệu giao dịch (đf ), lớp chiến lược giao dịch (GeneralStrategy), số tiền ban đầu ( cash=100000000' - 100 triệu VND), phi giao dich (commission=0 -
(trade_on close=True - giao dịch sẽ xảy ra vào cuối ngày), và không cho phép giao dịch cùng lúc (exclusive_orders=True - không thực hiện các giao dịch cùng lúc)
Trang 17o tats = bt.run(): Chạy backtest bằng cách gọi phương thức 'runQ` trên đối tuong backtest (‘bt’) Két quả của cuộc thử nghiệm được lưu vào biến stats
o stafs.fo frame(): In ra kết quả của cuộc thử nghiệm giao dịch, biểu diễn dưới dạng DataFrame, để có cái nhìn tông quan về hiệu suất của chiến lược giao dịch đã được thử nghiệm
Trong khoảng thời gian từ ngày 03/01/2013 đến ngày 03/01/2023, tông cộng
27 giao dịch đã được thực hiện Tỉ lệ giao dịch thành công là 58.4% Điểm cao nhất trong quá trình giao dịch đạt dén 61.72%, trong khi điểm thấp nhất la -11.73%
Kết quả cuối cùng của tài sản đã đạt đến 103,697,900 đồng, với điểm cao
nhất là 105,281,900 đồng Tỷ số lợi nhuận chung trong giai đoạn này đạt 3.7% Tuy nhiên, tỷ suất lợi nhuận hàng năm chỉ 0.37%, cho thấy sự tăng trưởng chậm hơn so với tỷ suất lợi nhuận tông thé
Về tính ôn định, tỷ lệ Sharpe Ratio dat 0.39, ty 18 Sortino Ratio dat 0.57 va ty
lệ Calmar Ratio đạt 0.18 Điều này cho thấy mức độ rủi ro trong quá trình giao dịch không quá cao nhưng cũng không đạt được mức độ sinh lợi lớn
Trong suốt giai đoạn này, mức giảm lớn nhất đã xảy ra là -2.06% và kéo dài
trong suốt 856 ngày Mức giảm trung bình là -0.29% và kéo đài trong 80 ngày Điều
này cho thấy có những thời điểm mất giá nhưng không quá sâu và thời gian phục hồi sau đó cũng không quá dài.Trung bình, mỗi giao dịch đạt được mức lợi nhuận là 2.89% Thời gian trung bình là 78 ngày, trong khi giao dịch lâu nhất kéo dai trong
213 ngày
Tỷ suất loi nhudn ky vong (Expectancy) dat 5.36% va chi s6 SQN (System Quality Number) la 1.39 Diéu nay cho thay cod một mức độ lợi nhuận tích cực, nhưng không đạt duoc mirc dé dang kê
Chiến lược giao dịch đã đạt được kết quả tích cực trong giai đoạn từ 2013
đến 2023 Tuy nhiên việc tăng trưởng lợi nhuận không đạt đến mức đáng kế và tỷ lệ
rủi ro cũng không thấp Điều này cho thấy cần xem xét và cải tiến chiến lược giao dich dé đạt hiệu suất tốt hơn trong tương lai
Trang 18- _ Vẽ đồ thị lợi nhuận của chiến lược giao dịch:
Nhận xét: Trong giai đoạn từ ngày 03/1/2013 đến ngày 03/01/2023 đường Equity có xu hướng tăng dân, điều này cho thấy tông giá trị đầu tư ngày cảng tăng theo thời gian Đây là một tín hiệu tích cực và cho thay chiến lược giao dịch tong quát đã đạt được kết quả lợi nhuận tốt trong suốt khoảng thời gian từ năm 2013 đến năm 2023 Ngoài ra, nó còn cho thấy rằng các giao dịch được thực hiện đã mang lại lợi nhuận và tỷ suất lợi nhuận chung là dương Đây có thể được xem là một dấu hiệu tích cực về hiệu suât và khả năng sinh lợi của chiên lược giao dịch