MỤC LỤC Câu 1: Vẽ đồ thị biểu điễn giá đóng cửa của cô phiếu VCB, đường SMA20 và đường SMAS50 trong giat Goan tren.... 9 Câu 2: Xây dựng chiến thuật giao dịch dựa trên đường SMAngăắn hạ
Trang 1NGÂN HÀNG NHÀ NƯỚC VIỆT NAM BỘ GIÁO DỤC VÀ ĐÀO
TẠO TRƯỜNG ĐẠI HỌC NGÂN HÀNG TP HÒ CHÍ MINH
TIỂU LUẬN CÁ NHÂN MÔN: TRÍ TUỆ NHÂN TẠO TRONG GIAO DỊCH
ĐỊNH LƯỢNG
SVTH: NGUYEN THI UT TRINH LOP HOC PHAN: BAF709 232 1 DO1
GV HUGNG DAN: TRAN ANH TUAN
Trang 2TP Hồ Chí Minh, tháng 04, năm 2024
Trang 3MỤC LỤC Câu 1: Vẽ đồ thị biểu điễn giá đóng cửa của cô phiếu VCB, đường SMA(20) và đường SMA(S50) trong giat Goan tren a 4
1.1 Thue hién cài đặt và khai bảo các thur viéne occ ccccceeecceeeceesceeteeeteeveeveveess 4
1.2.Lấy đữ liệu giao dịch cỗ phiếu VCB: 2 2 1S E11 11 1x pH He 4
1.3.Đồ thị đường "CÏOS€””: Q2 Q1 0121112112 nh n HH TH 1115151111 e ngành key 7
1.5.Vẽ đỗ thị giá đóng cửa (Close), đường SMA 20 và đường SMA §0: 9 Câu 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(dai han) Cu thé, khi đường SMA(ngắn hạn) cắt từ dưới lên đường SMA((đài han) 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”: 2 22s221222112711127112211122121112211021112202 2e 10 2.1.Xây dựng chiến lược SMA: 2-1 1 2 1E E 121211 112182121 1x EH rung re 10
P0; na ll
2.3.Đồ thị giá trị EqUify: 5c St n1 E111 11222211 12H11 nh n re 13 Câu 3: Với số tiền đầu tư là 100.000.000 đồng, mỗi lần thực hiện giao địch sẽ mua 100
cô phiếu/giao dịch Giả sử phí giao địch là 0%, xác định đường SMA(ngắn hạn) và đường SMA(dai han) dé nha dau 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 đường SMA Lưu ý, ngắn hạn chỉ được xác định từ 10 đến 20 ngày, đài hạn chỉ được xác định từ 30 đến 50 ngày 0c SH He re 14
3.1.Xây dựng SMA ngắn hạn và SMA đài hạn tôi ưu: - c c nhe 14
3.1.1.Xây dựng CHIEN NWO Croc cccccccccccccscsesesessvsvecsvstevsssvevevsescevsvstsesvsessiesesssessseseseees 14
3.1.2.Chiến lược giao dịch (SMAStrategy): ch ngay 15
3.1.3.Backtest kết quả tìm đượỢC: 2 2.12112222211121 152212 11 tk ky 16
3.1.4.Mô tả kết quả kiém dinbe cece cccccceccccescsesecsvseesscevssessesvesvssesvsesecenseseeevsees 18
Trang 4PHAN MỞ RỘNG 0-2212 2122112211221122112211221121212122111212222 re 27 3.3.Sử dụng chỉ số ATR: c1 211121 1121211 ng ng He 27 3.3.1 Cơ sở lý thuyẾt: ch HH H1 HH 121 1 ngu 27
3.3.3 Mô tả kết quả kiểm định: - ST 1E 1121111211218 E1 tre 31
3.3.4 Kết hợp với chiến thuật SMA ngăn hạn, đài hạn: 22522222 32 Câu 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 ngân hàng 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 dịch là 100 cỗ
phiều/giao địch s11 H11 1 1 1 1 1n n1 n1 ghe 36
4.1 Xác định cô phiếu có tỷ suất sinh lời cao nhất bằng chiến lược đường SMA: 36 4.1.1 Lấy đữ liệu từ các mã chứng khoán ngân hang: - 5s sex 36
4.1.2 Chọn ra cô phiêu có lợi nhuận tốt nhất: 22 ST 11511511 Ea se 37
4.2 Xác định cô phiếu có tỷ suất sinh lời cao nhất bằng chiến lược đường SMA kết
hợp với chỉ số RSÌ: 22 + s2 2 E2221211211211211211211211 2121122212211 n re 40
“An nh a 40
4.2.2 Tính toán chỉ số RSl : -5:c: 22t EE tre 40 4.2.3 Tính toán chỉ số RSlL -25::c 222 tt 4]
4.2.4 Đánh dấu các tín hiệu mua bán: 55c 22 tri 42 4.2.5 Tính toán số lượng cô phiẾu: - 2s 121211 E1 HH Hee 42
Trang 5"cà vu ` 45 4.3.2 Tính toán chỉ số ATR: 225cc tt ren 46
4.3.3 Tính toán số lượng mua bán của mỗi giao dịch: các c c2 46
4.3.5.Tính tỷ suất sinh lợi với các cầu hình SMA và ATR khác nhau: 47 4.3.6 Tính tỷ suất sinh lợi với các cầu hình SMA và ATR khác nhau: 48
Trang 6Câu 1: 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
1.1.Thực hiện cài đặt và khai báo các thư viện:
š © 1! pip install backtesting ta
~ © 1 import matplotlib.pyplot as plt
import pandas as pd
4 from backtesting import Backtest, Strategy
from ta.trend import sma_indicator
1.2.Lấy dữ liệu giao dịch cỗ phiếu VCB:
Cài đặt gói vnstock và nhập tất cả các module từ gói vnstock —> Lấy đữ liệu cô phiếu
từ ngày 03/01/2013 đến ngày 03/01/2023 —› Lưu đữ liệu trong biến df:
Kết quả bảng đữ liệu df:
¥ © 1 !pip install vnstock #Cai dat goi vnstock
2 from vnstock inport* #Nhập tất cả các module ti gói vnstock
Y Lticker = ‘HHV’
3 df = stock_historical_data(symbol='VCB', start_date="2623-04-@3", end_date="2024-04-93")
4 #Dữ liệu được lưu trữ trong biến df để sử dụng cho các mục đích tiếp theo trong quá trình phân tích hoặc xử lý dữ 1i
5 df
Trang 70 2023-04-03 77650 78660 77220 78580 699600 VCB m=
= 2023-04-04 78580 78660 77560 77820 226500 VCB ⁄
2023-04-05 78150 78150 77140 77900 286700 VCB
2023-04-06 77480 77980 77220 77390 350000 VCB
2023-04-07 77050 77140 75780 76210 645000 VCB
247 2024-0328 96200 96400 95600 95700 1232800 VCB
248 2024-03-29 95900 95900 94900 94900 801200 VCB
249 2024-04-01 94900 96000 94700 95200 1221000 VCB
250 2024-04-02 95100 95200 93900 94500 969000 VCB
251 2024-04-03 94400 94800 93800 93800 1321100 VCB
252 rows x 7 columns
Xoá cột Ticker và thiết lập lại tên cột cho df thanh "TradingDatfe', 'Open', 'High',
‘Low’, 'Close', 'Volume':
X 1# cột ticken
sty 2 del df['ticker' ]
3 #Gán lại tên cột cho df
4 df.colunns = ['TradingDate','0pen', 'High', 'Low', 'Close', 'Volume' ]
sdf
Kết quả bang dit liéu df.
Trang 80 2023-04-03 77650 78660 77220 78580 699600 oO
252 rows x 6 columns
Chuyên đổi cột 'TradingDate' sang định dang datetime va thiết lập cột
"TIradingDate' thành chỉ mục:
3 #Đặt cột 'TradingDate' làm chỉ nục
4 df = df.set_index( 'TradingDate' )
5 df
Kết quả bảng đữ liệu sau chuyên đổi:
Trang 9TradingDate a
2023-04-03 77650 78660 77220 78580 699600 ⁄
2023-04-06 77480 77980 77220 77390 350000
2023-04-07 77050 77140 75780 76210 645000
2024-03-28 96200 96400 95600 95700 1232800
2024-03-29 95900 95900 94900 94900 801200
2024-04-03 94400 94800 93800 93800 1321100
252 rows x 5 columns
1.3.Đồ thị đường "Close":
Ý © 11#2 đ thị đường "Close"
Ta thu được đồ thị sau với trục x thê hiện thời gian và trục y thê hiện giá đóng cửa (Close) của mã chứng khoán "VCR':
Trang 10
95000 +
90000 +
85000 +
80000 +
2023-05 2023-07 2023-09 2023-11 2024-01 2024-03
1.4.Dwong SMA 20, SMA 50:
Tinh toan duong SMA 20 va SMA 50 và thêm cột SMA 20 và SMA 50 vào bản copy dfl cua df:
% © 1 #lay di lieu ti df
gy 2 df1 = df.copy()
4 © 1 & Tinh toán và thêm cột mới sHA 20 vào df1
2 df1 ['SMA 26']= sma indicaton(close=df1['Close"], window= 28)
3 # Tính toán và thêm cột mới SMA 58 vào df1
4 df1 ['5MA 56']= sma_indicator(close=df1['Close'], window= 58)
51 dong dau cua dfl:
~ © 1 afi.head(s1)
2023-04-03 77650 79660 77220 78580 699600 NaN NaN
2023-04-04 78580 78660 77560 77620 226500 NaN NaN
2023-04-10 76210 76210 75360 75440 583500 NaN NaN
2023-04-13 74770 74940 74340 74600 451400 NaN NaN
Trang 11Vẽ đồ thị đường SMA 20 và SMA 50:
1 #Vẽ biểu đồ đường SMA 20
2 plt.plot(df1['5MA 2@"], label='ĐƯỜNG 5MA 29")
3 #Vê biểu đồ đường SMA 58
4 pIt.p1ot(df1['SMA 5@"], label='ĐƯỜNG SMA se")
5 plt.legend()
Ta được biều đồ sau:
<matplotlib.legend.Legend at Øx7a79a7de64d@>
95000 —— DUONG SMA 20
— DUONG SMA 50
92500 3
90000 3
87500 3
85000 3
82500 3
80000 +
77500 +
75000 +
2023-05 2023-07 2023-09 2023-11 2024-01 2024-03
1.5.Vẽ đồ thị giá đóng cửa (Close), đường SMA 20 và đường SMA 50:
1 #Vẽ đương biểu diễn giả đóng cửa (Close price)
2 plt.plot(df1['Closa'], labelz'Đường Close’)
3 #Vẽ đường biểu diễn SMA 2@
5 #Vẽ đường biểu diễn SMA 59
6 plt.plot(df1[ SMA 5@°], label="fuong SMA 5@")
7 plt.legend()
Ta được đồ thị sau:
Trang 12[5 <matplotlib legend.Legend at @x7a79a5c961d@>
roe | md Đường SMA 20
—— Đường SMA 50
90000 +
85000 +
80000 +
2023-05 2023-07 2023-09 2023-11 2024-01 2024-03
Câu 2: Xây dựng chiến thuật giao dịch dựa trên đường SMA(ngắn bạ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(dài
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 (dai hạn) là tín hiệu "Bán":
2.1.Xây dựng chiến lược SMA:
Đoạn code dưới đây được sử dụng đề xác định vị thế "mua" hoặc "bán" đựa trên sự
cắt nhau của đường SMA (ngắn hạn) và đường SMA (dài hạn)
v Xây dựng chiến lược SMA
x © Lưri.loc[
& (df4['SMA 20'].shift(1)<- df1['SMA 50"].shift(1)), ‘position’ ]=1
4 df1.loc[
5 (df4[ ‘SMA 20']< df1[ "SMA 50'])
& (dfi['SMA 2@'].shift(1)>= df1["SMA 50°].shift(1)), ‘position’ ]=-1
® Khi đường SMA (ngắn hạn) cắt từ dưới lên đường SMA (dai han), giá trị của cột
‘position’ sé được gan la |, thé hién vi thé "mua"
® Ngược lại, khi đường SMA (ngăn hạn) cắt từ trên xuống đường SMA (dàihạn), giá
Trang 13Xuất bảng kết quả khi loại bỏ những cột giá trị rỗng: Đoạn code dưới đây kiêm tra các giá trị position bị rỗng và sau đó xuất bảng đã được xây dựng chiến lược:
Ý 16f1(df1['position' ].notnu11()]
[5 Open High Low Close Volume SMA 20 SMA 56 position RỂ
2023-09-07 90000 90800 89500 89500 1765300 888100 888706 -1.0
2023-11-20 85600 87000 85000 86100 1098400 869900 86980.0 1.0
2023-12-05 06000 66100 64600 85400 992800 662450 663240 -1.0
2024-01-18 90900 91200 90000 91100 1422900 858200 85408.0 1.0
2.2.Backtest:
Định nghĩa một lớp GeneralStrategy kế thừa từ lớp Strategy: Lớp này có hai phương
thức là init va next dung đề xác định hành động mua hoặc bán dựa trên giá trị của cột
'posiflon' trong đữ liệu
~ Backtest
pass
self.buy()
elif self.data.position -1: #tín hiệu bán/ đóng vị thế
self.position.close()
® Nếu giá trị của cột 'position' là 1, tức là tín hiệu mua, thì phương thức sẽ gọi thực hiện mua cô phiều
® Ngược lại, nều giá trị của cột 'posttlon' là -l, tức là tín hiệu bán, thi ban cô phiêu hiện có Trong trường hợp chưa có cô phiếu để bán thì chỉ đặt lệnh đóng vị thế,
không ra tín hiệu bán
Thực hiện Backtest với số tiền khởi đầu để giao dịch là 100 triệu đồng, phí giao
dich giả sử là 0.3%, giao dịch được thực hiện vào giá đóng cửa và các lệnh giao dịch được
thực hiện độc quyền ta thu được bảng số liệu sau:
GeneralStrategy,
se= True, #Giao dịch được thực hiện vào giá đóng cửa
ve_orders=True) #Giao dịch có được thực hiện độc quyền
stats=bt nun()
Hiển thị kết quả backtest đưới dạng fñrame:
Trang 14Ta thu được bảng kết quả backtest như sau:
0
Duration 366 days 00:00:00 Exposure Time [“%] 24.206349 Equity Final [$] 1020725.7 Equity Peak [$] 1049725.7
Buy & Hold Return [%] 19368796
Return (Ann.) [“%] 2.07257
Volatility (Ann.) [%] 9.39793 1
Sortino Ratio 0.433387
Max Drawdown [“%] -4.667886
Avg Drawdown [“%] -4.477536
Max Drawdown 98 days 00:00:00 Duration
Avg Drawdown Duration 67 days 00:00:00
Trang 15# Trades
Win Rate [3%]
Best Trade [%%]
Worst Trade [“%]
Avg Trade [“|
Max Trade Duration
Avg Trade Duration
Profit Factor
Expectancy [“%]
SQN
_Strategy
_equity_curve
_ trades
50.0 3.421897 -1.109679 1.13073
75 days 00:00:00
45 days 00:00:00 3.083681 1.156109 0.495732 GeneralStrategy Equity DrawdownPct DrawdownDu Size EntryBar ExitBar EntryPrice ExitPr
2.3.Đồ thi gia tri Equity:
v Đồ thị giá tri Equity
Trang 16[3 [«<matplotlib.1ines.Line2D at @x7a79a5bb3d96>]
1e6
1.04 4
1.02 4
1.00 5