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 dữ liệu lịch sử g14 cô phiếu VCB và dự đoán xu hướng giá trong tương lai.. Chiến thuật giao dịch này có thể dự đo
Trang 1
TRUONG DAI HOC NGAN HANG TP.HCM
KHOA NGAN HANG
BAO CAO TIEU LUAN MON
NEN KINH TE CHIA SE VA UNG DUNG
TRONG LINH VUC X
NGƯỜI HƯỚNG DẪN: ThS TRAN KIM LONG NGƯỜI THỰC HIỆN :
MSSV
Thành Phố Hồ Chí Minh, ngày tháng năm 2021
Trang 2
NGAN HANG NHA NUGC VIET NAM BO GIAO DUC VA DAO TAO
TRUONG DAI HOC NGAN HANG TP HO CHi MINH
NHOM 7
TIEU LUAN CUOI KY
Môn học: Trí tuệ nhân tạo trong giao dịch định lượng
Thiéu Mai Ly - 030137210280 Phạm Thị Yến Nhi - 030137210371
Trang 3MUC LUC
LOI MO DAU Looe ceccccecesscsssesssessseesecseessresresererssessesssetaetiesssetiietietsressiesansasesseerasesetsen 3
DE BAI TIEU LUAN Looe cecccccscccsscsseesessseseesecsecssesseessesseseesssesiesesseesssessiseesesenseeseseetesees 4 NỘI DUNG 2 22122122212 1112212112111211221212222221212222121 21tr errog 5 Câu Ì: 2222 212221211211221121121112112122221 2112121121212 6 Câu 2L - 212212212121 1121101112212211112122111211121221212122 1221121 rre 10 Câu 3: - 212212212221 1121101112212 222111 rree 16
Xây dựng chiến lược SMA 5c n n1 110 1212121111115 1115151018112 1 1n se 16
Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 0% sec: 19
So sánh SMA (20,50) và SMA ((11,37) 5s 222 2122212212212 eeee 20
Xây dựng chiến lược EMA 5 2n 1211111135111 1512151 1111512121551 ece 21
Với số tiền đầu tư là 100,000,000 VND, phi giao dich là 0.3% se 25
So sánh ưu nhược điểm của SMA và EMA - Sa 2n 2211111111151 12155 115121 ng 26
Câu 4 - 2122122212211 1122112112112 1e 27 Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 0% sec: 27 Với số tiền đầu tư là 100,000,000 VND, phi giao dich là 0.2% - se 32 LỜI KẾT, 52 S2 122112711 21121112111 1112112211212 21 re 34
Trang 4LOI MO DAU
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 AT 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 gan day, va no đ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 dữ liệu lịch sử g14 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, p1úp nhà đâu tư năm bắt được các cơ hội đâu tư tiêm năng
Trang 5Dữ liệu giao dịch cỗ phiếu VCB: Link tệp dữ liệu VCB
Link Google Colab: [NHÓM 7_D01] BÀI CUÓI KỲ
ĐÈ BÀI TIỂU LUẬN
Sử dụng đữ liệu giao dị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": ngày giao dịch, "Open": giá mở cửa, "Hiph": giá cao nhất, "Low": giá thấp nhất, "Close" gia dong ctra, "Volume": khối lượng giao dịch
Yéu cau:
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 doan 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(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(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(ngan han) va đườ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 s1ao 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, 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 dé lựa chọn cô phiếu có tý suất sinh loi cao nhat trong ré cac c6 phiéu nganh ngan hang sau ['CTG', 'STB', 'HDB', 'EJB', 'BID', 'VPB', 'ACB', 'TCB',
'MBB', 'VIB', 'SHB', 'VCB’, 'LPB', 'TPB'] giai doan tir ngay 03/01/2016 dén
ngay 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 dịch
Trang 6NOI DUNG
s% Cài đặt các thư viện cần thiết:
1 lpip install vnstock backtesting ta
3 import matplotlib.pyplot as plt
4 import pandas as pd
5 from vnstock import *
6 from backtesting import Backtest, Strategy
7 from ta.trend import sma_indicator
!pip install vnstock: tai 961 thu vién Python cho phép tai dit ligu 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 cua matplotlib, ding dé vé d6 thi và trực quan hóa dữ liệu
import pandas as pd: cung cấp các cấu trúc đữ liệu và các công cụ phân tích đữ liệu hiệu suất cao
from vnstock import *: Nhập tất 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 và Strategy
từ thư viện backtesting Thu vién nay hỗ trợ thực hiện các quá trinh backtestine cho chiến lược giao dich
from ta.trend import sma_indicator: Nhap chirc nang sma_ indicator tr thu vién
tatrend Đây là một hảm giúp tính toán chỉ số đơn giản của đường trung bình
(Simple Moving Average - SMA)
Requirement already satisfied: vnstock in /usr/local/lib/python3.10/dist-packages (0.2.8.6)
Requirement already satisfied: backtesting in /usr/local/1lib/python3.10/dist-packages (0.3.3)
Requirement already satisfied: ta in fusr/local/lib/python3.10/dist-packages (8.11.0)
Requirement already satisfied: numpy>=1.17.0 in /usr/local/1ib/python3.16/dist-packages (from backtesting) (1.23.5)
Requirement already satisfied: pandas!=0.25.0,>=0.25.0 in /usr/local/lib/python3.10/dist-packages (from backtesting) (1.5.3)
Requirement already satisfied: bokeh>=1.4.0 in /usr/local/lib/python3.10/dist-packages (from backtesting) (3.3.0)
Requirement already satisfied: Jinja2>=2.9 in /usr/local/lib/python3.16/dist-packages (from bokeh>=1.4.@->backtesting) (3.1.2)
Requirement already satisfied: contourpy>=1 in /usr/local/1ib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (1.2.0)
Requirement already satisfied: packaging>=16.8 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (23.2)
Requirement already satisfied: pillow>=7.1.0 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (9.4.0)
Requirement already satisfied: PyYAML>=3.10 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (6.0.1)
Requirement already satisfied: tornado>=5.1 in /usr/local/lib/python3.10/dist-packages (from bokeh>=1.4.0->backtesting) (6.3.2)
Requirement already satisfied: xyzservices>=2021.09.1 in /usr/local/lib/python3.1@/dist-packages (from bokeh>=1.4.0->backtesting) (2623.10.1) Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.16/dist-packages (from pandas!=0.25.0,>=0.25.0->backtesting) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas!=0.25.0,>=0.25.0->backtesting) (2023.3.post1) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from Jinja2>=2.9->bokeh>=1.4.0->backtesting) (2.1.3) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas!=0.25.6,>=@.25.@->backtesting) (1.16.@)
Trang 7
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')
4
5 # Chuyển cột TradingDate sang kiểu datetime
7
8 # Sử dụng cột TradingDate làm khóa chính
10 df
Trang 8Open High Low Close Volume Ticker
03',end_date='2023-01-03') : là một lệnh để gán biến df bằng kết quả của hàm
stock historical data voi cdc tham sé ‘VCB’, ‘2013-01-03’ va ‘2023-01-03’ Ham stock historical data la mét ham dé lay dữ liệu lịch sử của cỗ phiếu từ một nguồn
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 s6 ‘2013-01-03’ va ‘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
hàm stock_historical_ data là một DataFrame của thư viện Pandas, chứa các cột như 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 dich
của cỗ phiếu “VCB' trong khoảng thời gian đã cho
dƒ=dƒ set index('TradingDafe): là một lệnh dé gan biến df bằng kết quả của
phương thức set index của DataFrame voi tham s6 ‘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) của 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 dữ liệu theo hàng Tham số “Trading Date’ la tén cua 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 “ TradineDate” làm chỉ số và gan lai cho bién df
Trang 9Tạ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 20"] = sma_indicator(close=df[ 'Close'], window=20) #Đường SMA (20) df['SMA 59'] = sma_indicator(close=df[ 'Close'], window=59) #Đường SMA (59)
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 ct SMA 50 với bước là 50 điểm trung bình kết quả liên tục
# Vẽ đồ thị biểu diễn giá đóng cửa của cổ phiếu VCB cùng với SMA 2Ø và SMA 59
pitplot(df]'Close'J, label='Close'): Đây là lệnh đề vẽ đồ thị đữ 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'
pitplot(df]°SMA 20'], label='SMA 20'): Day la lénh dé vé dé 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'
pltplot(dff'SMA 50'], label='SMA 50'): tương tự như trên nhưng vẽ đồ thị biểu diễn chỉ báo SMA 50
plttitle('Dé thi biểu diễn giá đóng của cỗ phiếu VCB'): Lệnh này đặt tiêu đề cho
đồ thị, là "Đồ thị biểu diễn giá đóng của cô phiếu VCB"
pltxlabel('Thoi gian'): Lénh nay đặt nhãn cho trục x của đồ thị, là "Thời gian”
Trang 10pltylabel('Gid(VND)'): Lénh nay dat nhan 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
và trung hạn của một tài sản
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á
mở và giá cao nhất thấp nhất
Do đó, các SMA này có biên độ p1ao động khác nhau SMA 50 sẽ có biên độ
giao động nhỏ hơn so với SMA 20 và SMA giá đóng của
Các biên độ giao động này thế hiện mức độ dao động giá của tài sản trong một khoảng thời gian nhất định Khi biên độ giao động nhỏ, có thé cho thay xu hướng của tài san dang 6n dinh hon, giúp người đầu tư đánh giá được mức độ rủi ro khi đầu tư vào tài sản đó Ngược lại, khi biên độ p1ao động lớn, có thé cho thay sự biến động của tài sản đang tăng cao, làm tăng mức độ rủi ro và khó khăn trong việc đánh p1á xu hướng của tải sản
Trang 11Ngoà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 cua tai san theo thoi gian va muc đích đâu tư khác nhau
Mua: SMA (20) > SMA (50) và SMA (20) lúc trước <= SMA (50) lúc trước
Bán: SMA (20) < SMA (59) và SMA (20) lúc trước >= SMA (50) lúc trước
- _ Bước l; Tạo cột position của DataFrame `df để 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 đường
SMA(ngan han) va đườ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 :
đf.1loc[(đf['SMA 20] › df['SMA 58']) & (df['SMA 28'].shift(1) <= df['SMA 58'].shift(1)), 'position'] = 1
df.loc[(df['SMA 20'] ‹ df['SMA 59°]) & (df['SMA 20'].shift(1) >= df['SMA 5@'].shift(1)), 'position'] = -1
© d£loc|(df[SMA 201] > df['SMA 501) & (df['SMA 201].shift() <=
df['SMA 50'].shift(1)), 'position’] = 1 : gán giá trị 1 vảo cột 'position' nếu 'SMA 20' lớn hơn 'SŠMA 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 đó
© d£loc|(df[SMA 20'] < df['SMA 501) & (df['SMA 201].shift(l) >=
df['SMA 50'].shift(1)), 'position'] =-1 : gan giá trị -1 vào cột 'position' nếu 'SMA 20' nhỏ hơn 'SMA 50' va 'SMA 20' cua hàng trước đó lớn hơn hoặc
bằng 'SMA 50' của hàng trước đó.
Trang 12© df]df]'position’|.notnullQ]: loc 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 914 tri 1 hoặc -1 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 gan 914 tri 1 cho cột 'posttion' khi có tín hiệu “Mua” và gán giá trị -1 khi có tín hiệu “Bán” dựa trên sự cắt của hai đường SMA Điều nay co thé được sử dụng đề xác định các thời điểm mua và bán trong chiến thuật giao dich dywa trén SMA
© Bang dit ligu hién thi c6t “position” cé gid tri la 1 và -1
Trang 13+ Nếu self.data.position có giá trị là 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à -1, đ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.posifion.elose(), 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 Stratesy đượ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, thi nd mua co phiéu, va néu ‘position’ băng -1, thi nó bán cô phiều
Bước 3: Chạy backtest với chiến lược giao dịch đã định nghĩa ở trên và với
số tiền ban đầu là 100.000.000 VND (100 triệu VND) và không tính phí giao
dich (commission = 0) va giao dich theo 914 dong cua (trade_on_close = True) va khéng cho phép giao dich cung luc (exclusive_orders = True)
Trang 142 # và không tinh phi giao dich (commission = 9) và giao dich theo giá đóng cửa (trade_on close = True)
3# ka khong cho phép giao dịch cũng lúc (exclusive orders = True)
Avg Drawdown [%]
Max Drawdown Duration
Avg Drawdown Duration
@ Trades Win Rate [%]
Best Trade [%]
Worst Trade [%]
Avg Trade [%]
Max Trade Duration
Avg Trade Duration
Profit Factor
Expectancy [%]
SQN _Strategy _equity_curve _trades
2013-01-04 00:00:00 2023-01-03 00:00:00
3651 days 00:00:00
58 398794
103887900 0 105281900.0 3.6879 573.795761 0.367576 0.936517 0.392493 0.573125 0.177764 -2.067782 0.286215
856 days 00:00:00
80 days 00:00:00
48 148148
61.72208 -13.728814 4.326711
213 days 00:00:00
78 days 00:00:00 2.872482 5.365584 1.394747 GeneralStrategy
Equity Drawdown ct Drawdown
Size EntryBar ExwBar ErtryPrice Exit
bt = Backtest( ): Tạo một đối tượng backtest (`b£`) bằng cách cung cấp dữ liệu giao dịch (đf`), lớp chiến lược giao địch (GeneralStrategy), số tiền ban đầu ( cash=100000000' - 100 triệu VND), phí giao dịch (commission=0 -
dịch theo gia (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 (exelusive_orders=True - không thực hiện các giao
dịch cùng lúc)
Trang 15o tats = bt.run(): Chay backtest bang cach goi phwong thire `run()` 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 stats.to_frame(): In ra két qua cua 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 dich da duoc 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 Ti 1é giao dich thành công là 58.4% Điểm cao nhất
trong quá trình giao dich dat dén 61.72%, trong khi điểm thấp nhất là -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 đạt 0.39, ty lệ Sortino Ratio đạt 0.57 và 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 dai 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à 7§ ngảy, trong khi giao dịch lâu nhất kéo dài trong
213 ngày
Tý suất lợi nhuận kỳ vọng (Expectancy) đạt 5.36% và chỉ số SQN (System Quality Number) la 1.39 Diéu nay cho thấy có một mức độ lợi nhuận tích cực, nhưng không đạt được mức độ đáng, 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 dịch đề đạt hiệu suất tốt hơn trong tương lai.
Trang 16- Vé dé thi lợi nhuận của chiến lược giao dịch:
plt.plot(stats._values[-2]['Equity'])
pìt.title('Đồ thị lợi nhuận của chiến lược giao địch")
plt.xlabel('Thdi gian')
le8 Đồ thị lợi nhuận của chiến lược giao dịch
Câu 3:
Sử dụng chiến thuật giao dich 6 cau 2, tiến hành thực hiện vòng lặp với các cặp giá trị đường SMA ngắn hạn và đài hạn tương ứng nhằm mục đích tìm ra cặp
Trang 17gia ta duong SMA ngan han va dai han dé nhà đầu tư có thê kiếm được số tiền
nhiêu nhất
Xây dựng chiến lược SMA
1# Khởi tạo các biến lưu giữ giá trị SMA ngắn hạn, SMA dai han va tổng vốn cuối cùng lớn nhất tương ứng
2 best_short SMA = @
3 best_long SMA = @
4 best_equity_final = 0
o bes( short SMA =0: Biến này được sử dụng để lưu trữ giá trị của độ ngắn
nhất của đường trung bình đơn giản (Simple Moving Average - SMA) mà
chiến lược giao dịch đã kiểm tra trong quá trình tối ưu hóa
o bes( long SMA =0: Tương tự như best_short SMA, biến này lưu trữ giá trị
của độ dài nhất của đường SMA mà chiến lược giao dịch đã kiểm tra trong
quá trình tối ưu hóa
o bes(_equity_final = 0: Biến này được sử dụng để lưu trữ giá trị tốt nhất của
vốn (equity) cuối cùng sau khi thực hiện backtesting với các cặp giá trị tối ưu
hóa của độ ngắn và độ dài SMA Mục tiêu là tìm cặp giá trị best short SMA
và best long _SMA sao cho vốn cuối cùng là lớn nhất, tức là chiến lược có
hiệu suất tốt nhất trong việc øIao dịch dựa trên SMA trên dữ liệu chứng
khoán
# Vòng lặp để tìm ra cặp giá trị SMA ngắn hạn (¡ từ 19 đến 26) và SMA dài hạn (j từ 30 đến 59) tốt nhất để đạt được tổng vốn cuối cùng lớn nhất for i in range(1@, 21):
for j in range(30, 51):
# Tạo cột short_SMA để lưu giá trị SMA ngắn hạn
df["short_sm4"] = sma_indicator(close=df['close'], window=i)
# Tạo cột long SMA để lưu giá trị SMA dài hạn
đf['long _SMA'"] = sma_indicator(close=df[ "Close"], window=j)
# 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 (mua: 1, bấn: -1)
đf[”position'] = float( nan")
# Gán giá trị cho cột position theo chiến lược giao dịch Lưu ý: cột position sẽ có giá trị NaN nếu không thỏa điều kiện mua hoặc bán
# Điều kiện mua: SMA ngắn hạn › SA dài hạn và SA ngân hạn lúc trước ‹= SMA dài hạn lúc trước (tức là đường sMA(ngắn hạn) cát từ đưới lên đường %(dài đf.lc[(đf[ short_sHA'] › đf[ long swA']) & (đf{ 'short_sWA'].shiff(1) ‹= đf[ long swA'].shiff(1)), 'positien'] = 1
# Điều kiện bán: SMA ngắn hạn ‹ SMA đài hạn và SHA ngán hạn lúc trước ›= $MA dài hạn lúc trước (tức là đường s⁄A(ngấn hạn) cất từ trên xuống đường SHA(tà đf.loc[(đf[ short _sHA'] ‹ đf[ long swA']) & (đf[ short sHA'].shift(1) ›= df[ long s#A'].shift(1)), ‘position’] = -1
df.loc|(df['short SMA'| > df[long SMA']) & (df['short SMA'].shift(1) <=
df['long_SMA'].shift(1)), 'position"] = 1: Điều kiện mua - Nếu SMA ngắn hạn lớn