Chiến thuậtgiao 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ử 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
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
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 TRẦN ANH TUẤNNGƯỜI THỰC HIỆN : NGUYỄN THỊ BÍCH LY
Thành Phố Hồ Chí Minh, ngày 13 tháng 11 năm 2023
Trang 3LỜI CAM ĐOAN
Tôi cam đoan đây là bài làm nghiên cứu do tôi thực hiện Những kết quả tínhtoá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ôihoàn toàn chịu trách nhiệm trước nhà trường về sự cam đoan này
TP.HCM,ngày13tháng11.năm2023
Sinh viên thực hiện
Nguyễn Thị Bích Ly
Trang 4NHẬN XÉT CỦA GIÁO VIÊN
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
TP.HCM,ngày13tháng11năm2023
Trang 5ĐỀ BÀI TIỂU LUẬN
Sử dụng dữ liệu giao dịch của các cổ phiếu VCB trong giai đoạn từ ngày03/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, "High": giá cao nhất, "Low":giá thấp nhất, "Close" giá đóng cửa, "Volume": khối lượng giao dịch
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 đườngSMA(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 đườ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 để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ànhngâ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ày03/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 6MỤC LỤC
LỜI MỞ ĐẦU 1
NỘI DUNG 2
Câu 1: 3
Câu 2: 7
Câu 3: 13
Xây dựng chiến lược SMA 13
Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 0% 16
So sánh SMA (20,50) và SMA (11,37) 17
Xây dựng chiến lược EMA: 18
Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 0.3% 22
So sánh ưu nhược điểm của SMA và EMA 23
Câu 4 24
TH1: Với số tiền đầu tư là 100,000,000 VNĐ, phí giao dịch là 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 31
Trang 7Kinh tế
lượng 100% (1)
9
Multiple choice ch.2 (+answers)
Trang 8LỜI MỞ ĐẦUThị trường chứng khoán ngày càng trở nên phức tạp và biến động, đặt ranhữ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ỏinhà đầ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ựcnghiê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ởicon 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ứngkhoá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ộttrong 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ậtgiao 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ử 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áccao, giúp nhà đầu tư nắm bắt được các cơ hội đầu tư tiềm năng
Business 2 0 wordlist upper intermediate
Kinh tếlượng 100% (1)
14
Trang 9NỘI DUNGCài đặt các thư viện cần thiết:
!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 dữ liệu đáng tin cậy được cung cấp bởi public api từTechcombank Security (TCBS) và SSI
import matplotlib.pyplot as plt: module của matplotlib, dùng để vẽ đồ thị và trựcquan 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 dữ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ệnnày chủ yếu được sử dụng để lấy dữ liệu chứng khoán từ sàn giao dịch Việt Nam.from backtesting import Backtest, Strategy: Nhập các lớp Backtest và Strategy
từ thư viện backtesting Thư viện này hỗ trợ thực hiện các quá trình backtesting chochiến lược giao dịch
from ta.trend import sma_indicator: Nhập chức năng sma_indicator từ thư việnta.trend Đâ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)
Trang 11df = 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 hàmstock_historical_data với các tham số ‘VCB’, ‘2013-01-03’ và ‘2023-01-03’ Hàmstock_historical_data là một hàm để lấy dữ liệu lịch sử của cổ phiếu từ một nguồnnào đó Tham số ‘VCB’ là mã cổ phiếu của Ngân hàng TMCP Ngoại thương ViệtNam 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ủahà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 dịchcủa cổ phiếu ‘VCB’ trong khoảng thời gian đã cho
df = df.set_index('TradingDate'): 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ứcset_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ủaDataFrame Bạn có thể sử dụng chỉ số để truy cập, lọc hoặc sắp xếp dữ liệu theohà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’ làm chỉ số và gán lại cho biến df
Trang 12Tạo 2 chỉ báo trung bình động đơn giản (SMA) cho khung dữ liệu về giá
plt.plot(df['SMA 20'], label='SMA 20'): Đây là lệnh để vẽ đồ thị dữ 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ẽ đồ thịbiểu diễn chỉ báo SMA 50
plt.title('Đồ thị 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"
plt.xlabel('Thời gian'): Lệnh này đặt nhãn cho trục x của đồ thị, là "Thời gian"
Trang 13plt.ylabel('Giá(VND)'): Lệnh này đặt nhãn cho trục y của đồ thị, là "Giá(VND)".
plt.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:
Nhận xét: SMA 50 và SMA 20 được tính bằng cách lấy tổng giá đóng cửacủa các nến trong 50 và 20 phiên liên tiếp, sau đó chia cho số lượng phiên đó đểtính ra giá trung bình Những con số này thường được sử dụng để định giá xu hướngdài hạn 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ảntrong một khoảng thời gian nhất định, không quan tâm đến số lượng phiên hay giá
Trang 14Ngoài ra, sự khác nhau giữa các biên độ giao động còn cho thấy mức độ độclậ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ậmhơ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ợpvới nhu cầu đầu tư của mình và sử dụng các SMA khác nhau để đánh giá xu hướngcủa tài sản theo thời gian và mục đích đầu tư khác nhau.
o df.loc[(df['SMA 20'] > df['SMA 50']) & (df['SMA 20'].shift(1) <=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 'SMA 50' và 'SMA 20' của hàng trước đó nhỏ hơn hoặcbằng 'SMA 50' của hàng trước đó
o df.loc[(df['SMA 20'] < df['SMA 50']) & (df['SMA 20'].shift(1) >=df['SMA 50'].shift(1)), 'position'] = -1 : gán giá trị -1 vào 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ặcbằng 'SMA 50' của hàng trước đó
Trang 15o df[df['position'].notnull()]: lọc ra các hàng trong DataFrame `df` chỉ lấynhững hàng mà cột 'position' không null, nghĩa là chỉ lấy các hàng mà đãđược gán giá trị 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 gán giá trị 1 cho cột 'position'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 này có thể được sử dụng để xác định các thời điểm mua và bántrong chiến thuật giao dịch dựa trên SMA
○ Bảng dữ liệu hiển thị cột “position” có giá trị là 1 và -1
- Bước 2: Định nghĩa một lớp con của Strategy (GeneralStrategy) cho chiếnlược giao dịch và có hai phương thức chính
Trang 16o init(self): Hàm khởi tạo không thực hiện bất kỳ công việc cụ thể nào (chỉ cólệnh `pass`) Hàm này không cần thiết phải làm gì trong trường hợp này.
o next(self): Đây là một phương thức quan trọng trong chiến lược giao dịch vàđược gọi mỗi khi có dữ liệu mới Trong phương thức này:
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ụnglệnhself.buy(size=100)
Nếu `self.data.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.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 địnhcách chiến lược quyết định mua và bán cổ phiếu dựa trên giá trị của biếnself.data.position Nếu `position` bằng 1, thì nó mua cổ phiếu, và nếu `position`bằng -1, thì 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í giaodịch (commission = 0) và giao dịch theo giá đóng cửa (trade_on_close =True) và không cho phép giao dịch cùng lúc (exclusive_orders = True)
Trang 17o bt = Backtest( ): Tạo một đối tượng backtest (`bt`) bằng cách cung cấp dữliệu giao dịch (df`), lớp chiến lược giao dịch (GeneralStrategy), số tiền banđầu (`cash=100000000` - 100 triệu VND), phí giao dịch (commission=0-không tính phí giao dịch), giao dịch theo giá đóng cửa(trade_on_close=True - giao dịch sẽ xảy ra vào cuối ngày), và không chophép giao dịch cùng lúc (exclusive_orders=True - không thực hiện các giaodịch cùng lúc).
Trang 18o tats = bt.run(): Chạy backtest bằng cách gọi phương thức `run()` trên đốitượng backtest (`bt`) Kết quả của cuộc thử nghiệm được lưu vào biếnstats.
o stats.to_frame(): In ra kết quả của cuộc thử nghiệm giao dịch, biểu diễndưới dạng DataFrame, để có cái nhìn tổng quan về hiệu suất của chiến lượcgiao 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ấttrong quá trình giao dịch đạt đế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 caonhấ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ậmhơ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, tỷ lệ Sortino Ratio đạt 0.57 và tỷ
lệ Calmar Ratio đạt 0.18 Điều này cho thấy mức độ rủi ro trong quá trình giao dịchkhô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àitrong suốt 856 ngày Mức giảm trung bình là -0.29% và kéo dài trong 80 ngày Điềunà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ụchồ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 dài trong
213 ngày
Tỷ suất lợi nhuận kỳ vọng (Expectancy) đạt 5.36% và chỉ số SQN (SystemQuality Number) là 1.39 Điều này 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 giaodịch để đạt hiệu suất tốt hơn trong tương lai
Trang 19- Vẽđồthịlợi nhuậncủachiếnlượcgiao dịch:
Nhận xét: Trong giai đoạn từ ngày 03/1/2013 đến ngày 03/01/2023 đườngEquity 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ăngtheo thời gian Đây là một tín hiệu tích cực và cho thấy chiến lược giao dịch tổngquát đã đạt được kết quả lợi nhuận tốt trong suốt khoảng thời gian từ năm 2013 đếnnă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ạilợi nhuận và tỷ suất lợi nhuận chung là dương Đây có thể được xem là một dấuhiệ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
Trang 20Câu 3:
Sử dụng chiến thuật giao dịch ở câu 2, tiến hành thực hiện vòng lặp với cáccặp giá trị đường SMA ngắn hạn và dài hạn tương ứng nhằm mục đích tìm ra cặpgiá trị đường SMA ngắn hạn và dài hạn để nhà đầu tư có thể kiếm được số tiềnnhiều nhất
Xây dựng chiến lược SMA
o best_short_SMA = 0: Biến này được sử dụng để lưu trữ giá trị của độ ngắnnhấ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 best_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 trongquá trình tối ưu hóa
o best_equity_final = 0: Biến này được sử dụng để lưu trữ giá trị tốt nhất củavốn (equity) cuối cùng sau khi thực hiện backtesting với các cặp giá trị tối ưuhó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 giao dịch dựa trên SMA trên dữ liệu chứngkhoán
Trang 21df.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ớnhơn SMA dài hạn và SMA ngắn hạn ở phiên trước nhỏ hơn hoặc bằng SMA dài hạn
ở phiên trước đó, thì gán giá trị 1 vào cột position
df.loc[(df['short_SMA'] < df ['long_SMA']) & (df['short_SMA'].shift(1) >=df['long_SMA'].shift(1)), 'position'] = -1: Điều kiện bán - Nếu SMA ngắn hạn nhỏhơn SMA dài hạn và SMA ngắn hạn ở phiên trước lớn hơn hoặc bằng SMA dài hạn
ở phiên trước đó, thì gán giá trị -1 vào cột position
Đoạn code này thực hiện hai công việc chính:
Kiểm tra và cập nhật giá trị tốt nhất: Đoạn mã trong block if so sánh vốncuối cùng sau khi backtesting (stats['Equity Final [$]']) với giá trị tốt nhất đã đượclưu trữ trước đó (best_equity_final) Nếu vốn cuối cùng mới lớn hơn vốn cuối cùngtốt nhất trước đó, các biến lưu giữ giá trị SMA ngắn hạn (best_short_SMA) vàSMA dài hạn (best_long_SMA) sẽ được cập nhật bằng giá trị vài j tương ứng.Đồng thời, (best_equity_final) cũng sẽ được cập nhật bằng vốn cuối cùng mới tìmđược
In ra thông tin kết quả: Block print sử dụng để in ra giá trị của SMA ngắnnhất, SMA dài nhất và vốn cuối cùng lớn nhất tương ứng sau khi đã tìm kiếm xong.Các giá trị này sẽ được in ra dưới dạng chuỗi, với thông tin về độ dài của SMAngắn nhất (best_short_SMA), độ dài của SMA dài nhất (best_long_SMA) và giátrị vốn cuối cùng lớn nhất (best_equity_final) Định dạng chuỗi này sẽ cung cấp