1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tập cá nhân môn trí tuệ nhân tạo trong giao dịch Định lượng

53 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Trí Tuệ Nhân Tạo Trong Giao Dịch Định Lượng
Tác giả Cao Thị Kiều Oanh
Người hướng dẫn Trần Anh Tuấn
Trường học Trường Đại Học Ngân Hàng TP. Hồ Chí Minh
Chuyên ngành Trí Tuệ Nhân Tạo
Thể loại bài tập cá nhân
Năm xuất bản 2023
Thành phố TP. HỒ CHÍ MINH
Định dạng
Số trang 53
Dung lượng 7,98 MB

Nội dung

CÂU 2: Xây dựng chiến thuật giao dịch dựa trên đường SMAngắn hạn và đường SMA dải hạn.. Giả sử phi giao dich la 0%, xac dinh đường SMAngắn hạn và đường SMAdài hạn để nhà đầu tư có thể ki

Trang 1

NGAN HANG NHA NUGC VIỆT NAM BỘ GIÁO DUC VA DAO TẠO

TRUONG DAI HQC NGAN HANG TP HO CHÍ MINH

` +

1976

BAI TAP CA NHAN

MON: TRI TUE NHAN TAO TRONG GIAO DICH DINH

LUONG Giảng viên: Trân Anh Tuân

Trang 2

PHU LUC

CÂU I1: Vẽ đồ thị biểu diễn giá đóng cửa của cỗ phiếu VCB, đường SMA(0) và

1.1 Thực hiện cài đặt và khai báo các thư viện:

1.2 Lấy dữ liệu giao dịch cô phiếu VCB: `

1.3 Đồ thị đường ''ClOS€*”": oscscsscsvseE2sYAeEEsEEAEEEsETseEvseTkeErserseorserseors sa se

1.4, Durong SMA 20, SMA S0: cscscssssssssssssssseessssssesssssssesssesssesssesssesssssssesaseansessenceneens

1.5 Vẽ đồ thị giá đóng cửa (Close), đường SMA 20 và đường SMA 50: 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 (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 han) là tín hiệu ''Bán”: eoscsecsvseErxeEEseEExeEEseeTkerxeerkserrserkrrssrke 2.1 Xây dựng chiến lược SÌMA: - se s- se seSrse+xeSrsevaeerserkeerserkerkerserserscee

CÂU 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ử phi giao dich la 0%, xac dinh đườ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 đườ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: 3.1 Xác định đường SMA ngắn hạn và đường SMA dài hạn tối ưu: 3.1.1 Xây dựng chiến lược:

3.1.2 Mô tả kết quả kiểm định: 2- 5° s2 s£ se se +seExsevseExserseessersersessre 3.2 Sử dụng chỉ số RSÌ: - se se ExeEExExeEEkEEsEEkrkerkrserkrerkrserkrsererree 3.2.1 Co Ì, 7z 6 6

3.2.2 Xây dựng chiến lược:

3.2.3 Mô tả kết quả kiểm định: -2- 5-2 se se Ss+seEvsevseExserseessersersessre

3.2.4 Kết hợp với chiến thuật SMA tìm ngắn hạn, dài hạn tối ưu: 3.2.4.1 Mô tả kết quả kiểm định: 5-5 secseesseeserssersersesseree

3.2.4.3 Backtest chiến thuật khi mua số lượng cô phiếu tối đa có thể mua với

3.3 Sử dụng chỉ số A'TIR: -s-s° 5£ sex SrxExExeEEsEEEEkEEsEEekerkrerkreserserkrsee

Trang 3

3.3.1 Co sO ly , 77 6 6 6 6 26

3.3.3 Mô tả kết quả kiểm định se ++<e£Ex£ExseSExeExeeeexseerxersrxee 32 3.3.4 Kết hợp với chiến thuật SMA ngắn hạn, dài hạn 55c 552 33 3.3.4.1 Mô tả kết quả kiểm định: 5c s-scsecseesseeseresersersesseree 37

3.4.1 Cơ sở lý thuyete.cccccscsscsssssssssssscsssssessssssssesscsssssessessssssssssssssssssssssssssssesssscsees 39

3.4.3 Mô tả kết quả kiểm định: -2- 5° s2 se se cse+seEvsevseExserseersersersessre 43 3.4.4 Xác định TEMA ngắn hạn, dài hạn tối ưu - 5° s25 sesecsesz 44 3.4.4.1 Mô tả kết quả kiểm định: s s-scsecseesseeserssersersesseree 46 3.4.4.2 Kiểm định khi áp dụng phí, thuế hiện hành: . - 46

3.2.4.3 Backtest chiến thuật khi mua số lượng cô phiếu tối đa có thể mua với

số tiền 100.000.000 VNĐ, khi có thêm phí hiện hành - 48

Trang 4

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 đoạn trên:

1.1 Thực hiện cài đặt và khai báo các thư viện:

v © import matplotlib.pyplot as plt

s import numpy as np

import pandas as pd

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 va nhập tât cả các module từ gói vnstock — Lay dữ liệu cô phiêu từ ngày 01/03/2013 đên ngày 01/03/2023 — Lưu đữ liệu trong biên dẼ:

v oe !pip install vnstock #Cai dat gdi vnstock

from vnstock inport* #Nhập tất cả các module từ gói vnstock

¥ © ticker = ‘vce’

#Léy dữ liệu giao dịch tir "2613-@1-@3" dén "2023-e1-e3"

df = stock_historical_data(symbol='VCB', start_date="2@13-@1-@3", end_date="2023-01-@3")

#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ữ liệu

df

Ket qua bảng dữ liệu d£

Trang 5

del df['ticker' ]

#Gán lại tên cột cho df

df.columns = ['TradingDate’,'Open’, 'High', 'Low', 'Close', ‘Volume’ ]

df['TradingDate' ]=pd.to_datetime(df[ 'TradingDate' ])

Trang 6

TradingDate oO

2013-01-04 9960 10490 9890 10380 501540 2013-01-07 9960 10670 9960 10670 1312740 2013-01-08 10880 11200 10700 11200 1035220 2013-01-09 10700 11270 10670 11270 1583320 2013-01-10 11310 11560 10920 11560 645400

2022-12-27 67650 68160 66810 66980 1058000 2022-12-28 68080 69430 67320 67740 1173500 2022-12-29 69690 69860 68160 68330 1237400 2022-12-30 70190 70360 67740 67740 1510900 2023-01-03 67910 69940 67910 69940 1089800

1.4 Đường SMA 20, SMA 50:

copy dfl cua df:

Trang 7

X [8] #Lấy dữ liệu từ df

df1 = df.copy()

~ © £tím toán và thên cột mới SA 20 vào df1

df1 ['SMA 298']= sma_indicator(close=df1[ 'Close'], window= 28)

# Tính toán và thêm cột mới SMA 5Ø vào df1

df1 ['SMA 5@8']= sma indicator(close=df1[ 'Close'], window= 59)

#Vẽ biểu đồ đường SMA 50

plt.plot(df1['SMA 58" ], l1abel=' ĐƯỜNG

SMA 28") SMA 5@")

NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

Trang 8

1.5 Vẽ đồ thị giá đóng cửa (Close), đường SMA 20 va duong SMA 50:

pit.plot(df1[ 'Close'], label='Đường Close')

#Vẽ đường biểu diễn SMA 28

#Vẽ đường biểu diễn SMA 5Ø

plt.legend()

Ta thu được đồ thị sau:

Trang 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(dài bạn) Cụ thể, khi đường SMA(ngắn hạn) cắt từ dưới lên đường SMA(dà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 "Ban":

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 (dai han)

x Xây dựng chiến lược SMA

6 & (df1i[ "SMA 20'].shift(1)>= dfi[ "SMA 50'].shift(1)), 'position' ]=-1

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 (đài hạn), giá trị của cột 'position' sẽ được gán là -1, thê hiện vị thé "ban"

tra các giá trị position bị rỗng và sau đó xuất bảng đã được xây dựng chiến lược:

Trang 10

phương thức là mit và next dùng đề 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

if self.data.position ==1:

self.buy() elif self.data.position==-1:

self.position.close()

10

SMA 58

11827.40 10831.80 10729.80 9578.80 10691.80 10284.40 11141.60 10499.60 11946.80 11970.00 16140.24 16180.72 21701.60 19869.80 20797.60

position

-1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0

Trang 11

o Néu giá trị của cột 'position' là 1, tức là tín hiệu mua

o Ngược lại, néu giá trị của cột 'posttlon' là -[, tức là tín hiệu bán, thì bán cô phiếu hiện có

« _ Thực hiện Backtest với số tiền khởi đầu đề giao dịch là 100 triệu đồng, phí giao dịch 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,

cash=1999999, #Số tiền khởi đầu ban đầu để giao dịch

commission=0.003, #Phi giao dịch

trade_on_close= True, #Giao dich được thực hiện vào giá đóng cửa exclusive_orders=True) #Giao dịch có được thực hiện độc quyền stats=bt.run()

v Q stats.to_frame()

Ta thu duoc bang két qua backtest nhu sau:

ll

Trang 12

Max Drawdown Duration

Avg Drawdown Duration

Max Trade Duration

Avg Trade Duration

Profit Factor

Expectancy [%]

SQN 2.3 Đồ thi gia tri Equity:

Trang 13

~ D6 thi gia tri Equity

CÂU 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 đườ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:

3.1 Xác định đường SMA ngăn hạn và đường SMA dài hạn tối ưu:

3.1.1 Xây dựng chiến lược:

- _ Lấy bản sao bảng đữ liệu giá cô phiêu VCB từ d£

¥ © #ay dỡ 1iệu từ dể

df2 = df.copy()

thử tất cả các giá trị của short_sma trong khoáng từ 10 đến 20 và long_sma trong

13

Trang 14

đề xác định vị trí giao dịch tương ứng với mỗi cặp giá trị short sma và long sma:

a import pandas as pd

from ta.trend import sma_indicator

fron backtesting import Backtest, Strategy

#Tao cac biên, dữ liệu

best_return = 8

best_short_sma - @

best_long sna - @

#Vvòng lặp để thử các giá trị SHA

for short_sma in range(19, 21):

for long sma in nange(49, 51):

#Tính SHA ngẩn hạn và SMA dai han, thêm cột position

df2[ 'SMA_Short'] = sma_indicator(close= df2['Close"], windou = short_sma)

đf2['SMA_Long'] = sa _indicator(close= đf2['Close"], window = long_sma

đf2.1oc[ (df2[ SHA_Short"] > df2['5MA_Long']) & (df2[ '5MA_Short'].shift(1) ‹= df2[ '5MA_Long'] shift(1)), 'p

đf2.1oc[ (df2[ " SHA_Shont"] « df2["SMA_Long']) & (df2[ 'SMA_Short' ].shift(1) »= df2['SMA_Long'].shift(1)), 'position"] =

+ Thiết lập giá tri cua cét 'position' trong DataFrame df2 bang | cho cac hàng có giá trị SMA ngăn hạn lớn hơn SMA đài hạn

+ Thiet lap gia tri cua cét 'position' trong DataFrame df2 bang -1 cho các hang co gia tri SMA ngan han nho hon SMA dai han

- _ Đmh nghĩa chiên thuật giao dịch và thực hiện backtest:

#ÐĐịnh nghĩa chiến thuật giao dich

cash=199990099, #Số tiền khởi đâu là 190000009

trade_on_close=True, #Giao dịch vào giá đóng cửa

exclusive_orders=True #Lệnh giao dịch độc quyền

+ Nếu tín hiệu giao địch là mua (position = 1), thì mua 100 cô phiếu Nếu tín hiệu giao dich la ban (position = -1), thi ban cô phiếu hiện có

Thực hiện backtest chiến thuật SMA trên dữ liệu được lưu trữ trong df2 với số tiền khởi đầu là 100.000.000VND, 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:

result = bt.run()

Equity Final = flost(result.to_frame().iloc[4])

print(f’SMA({short_sma},{long sma}): {Equity Final}

Tiền hành kiểm tra và lưu giá tri SMA tot nhất, in kết quả ra màn hình:

14

Trang 15

+ Nếu giá trị cudi cùng của vốn (equity) trong qua trinh backtest lớn hơn giả trị lợi nhuận tốt nhật hiện tại, thì cập nhật giá trị lợi nhuận tốt nhất, short sma tốt nhat va long | sma tot nhat

+ In ra màn hinh gia tri ti wu cua SMA ngan han va SMA đài hạn, cùng với giá tri dau tur cudi củng tương ứng

Ta thu được kết quả như sau: Đường SMA ngắn hạn và đường SMA dài hạn tôi ưu là

SMA(20.43) va voi giá trị đầu tư cuối cùng là 105675000.0

triên khai một chiến thuật giao dịch:

+ Nếu giá trị của cột 'position' là 1, tức là có tín hiệu mua, thì sẽ thực hiện mua 100 cô phiếu băng lệnh self.buy(size=100)

+Nếu giá trị của cột 'posttlon' là -[, tức là có tín hiệu bán, thì sẽ bán số cô phiếu hiện có

# Thực hiện chiến thuật

bt = Backtest(đf2, SmaCross_strategy, cash-1@@000@@9, trade_on_close = True, exclusive_orders = True

# Thực hiện kiếm định

15

Trang 16

Sau khi dinh nghia chién thuat, doan code tiếp theo thực hiện chiến thuật và kiêm định kết quả với số tiền khởi đầu là 100000000, 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:

Max Drawdown Duration 549 days 00:00:00

Avg Drawdown Duration 69 days 00:00:00

Max Trade Duration 209 days 00:00:00

_equity_curve Equity DravdownPct Drawdowm

3.1.2 Mô tả kết quả kiểm định:

Tỷ trọng đầu tư và Tiền mặt: Tý trọng đầu tư trong đanh mục thấp (<10%) va ty trọng tiền mặt cao cho thấy chiến thuật thường xuyên giữ vị thế tiền mặt Điều này

l6

Trang 17

nhuận của cô phiêu

Lợi nhuận tổng cộng và Tỷ suất lợi nhuận hàng năm: Lợi nhuận tông cộng trong kỳ đầu tư là 5.675%, đây là mức lợi nhuận tích luỹ tương đối thấp trong khoảng thời gian kiểm tra Tỷ suất lợi nhuận hàng năm cũng thấp với 0.559294%, Sharpe Ratio: Hé sé Sharpe la 0.606, cho thay răng tỷ lệ lợi nhuận so với mức rủi

ro trong khoảng thời gian 12 thang khéng đủ hấp dẫn Sự biến động của giá cỗ phiếu không được đền bù bằng lợi nhuận hàng năm, và điều này cho thấy mức độ rủi ro trong danh mục đầu tư

Mức giảm lớn nhất: Tôi đa giảm tỷ lệ là -1.650054%, vấn thấp và tương tự với thông số trước đó Mức giảm lớn nhất này có thê được xem xét là ồn định, nhưng cũng cho thay danh muc dau tu không đạt được lợi nhuận cao trong khoảng thời gian kiểm tra

Nhận xét: Chiến thuật SMA trên cỗ phiêu VCB trong khoang thời gian này có sự kết hợp của lợi nhuận thấp, biến động giá cô phiếu cao, và tỷ suất lợi nhuận hàng năm không đủ cao đề đền bù cho rủi ro

Trong đó: RS: sức mạnh tương đối sẽ được tính với công thức sau:

RS = Trung binh gia tăng trong một chu kỳ/ Trung bình giá giảm trong một chu kỳ -_ Chỉ số RSI có thê được sử dụng đề xác định điểm vào hoặc ra khỏi thị trường, đồng thời cũng có thê kết hợp với các chỉ báo khác đề tăng tính chính xác của chiến lược giao dịch

+ Khi giá của một tài sản tăng quá nhanh và RSI vượt qua mức 70, thì tài sản đó có thể bị mua quá mức và có thể xảy ra một sự điều chỉnh giá, có thê xem là tín hiệu bán

+ Khi giá của một tài sản giảm quá nhanh và RSI xuống đưới mức 30, thì tài sản đó có thê bị bán quá mức và có thê xảy ra một sự tăng giá, có thê xem là tín hiệu mua

3.2.2 Xây dựng chiến lược:

Xây dựng chiến luge RSI:

Cai dat va thém những thư viện cần thiết:

17

Trang 18

!pip install pandas ta

x oO import pandas as pd

import matplotlib.pyplot as plt import numpy as np

import pandas as pd from backtesting import Backtest, Strategy

- _ Lấy dữ liệu giá cô phiêu VCB từ đẼ

¥ © kuãy dữ 1i‡u từ dr df3 = df.copy()

cửa:

x oO #Tính toán chỉ số RSI (Relative Strength Index) cho cổ phiếu VCB dựa trên giá đóng cửa df3[ 'RSI'] = ta.momentum.RS1Indicator(df3[ 'Close" ]).rsi()

Sử dụng phương thức rsi() của đối tượng RSIIndicator dé tính toán giá trị RSI cho

mới có tên là 'RSIT' trong DataFrame df3

+ Khi gia tri RSI vượt qua ngưỡng 30 từ dưới lên, ta có tín hiệu mua + Ngược lại, khi giá trị RSI vượt qua ngưỡng 70 từ trên xuống, ta có tín hiệu bán

+ Các dòng đữ liệu không thoả mãn các điều kiện trên sẽ giữ nguyên giá trị rồng (None) trong cột 'position'

- - Sau khi thực hiện xây dựng chiến lược, hiển thị các hàng có tín hiệu mua hoặc bán, ta được bảng đữ liệu sau:

18

Trang 19

[3 Open High Low Close Volume RSI position m

cột 'RST' của DataFrame df3, ta thu được đô thị đường RST như sau:

Trang 20

-_ Đị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 dùng đề xác định hành động mua hoặc bán dựa trên giá trị của cột 'posifion' trong đữ liệu

def init(self):

pass

def next (self):

if self.data.position ==1: #position =1 => mua

self buy(size=100) elif self.data.position==-1: #position = 1 => ban self.position.close()

Néu giá trị cla cot ‘position’ la 1, tirc 1a tin hiéu mua, thi phuong thitc sé goi thyc hiện mua 100 cô phiếu Ngược lại, nêu giá trị của cột 'positlon' là -l, tức là tín hiệu bán, thi bán cỗ phiếu hiện có

vào giá đóng cửa và các lệnh giao dịch được thực hiện độc quyên

df3, GeneralStrategy, cash=100000000, trade_on_close= True, exclusive_orders=True) stats=bt.run()

- _ Truyền kết quả của quá trinh backtest (stats) thành một DataFrame:

Ta thu được bảng kết quả sau:

20

Trang 21

Max Drawdown Duration

Avg Drawdown Duration

Max Trade Duration

Avg Trade Duration

3651 days 00:00:00 40.04008 102723000.0 102808000.0 2.723 573.795761 0.271828 0.724529 0.375179 0.545096 0.135907 -2.000099 -0.256335

619 days 00:00:00

107 days 00:00:00

30 50.0 35.441498 -20.911889 2.142935

136 days 00:00:00

48 days 00:00:00 1.785616 2.914532

1.02619

Trang 22

3.2.3 M6 ta két qua kiém dinh:

Ty trong đầu tư và Tiền mặt: Ty trong đầu tư trong đanh mục thấp (<10%) và tỷ trọng tiền mặt cao cho thấy chiến thuật thường xuyên giữ vị thế tiền mặt Điều này

có thê làm giảm lợi nhuận của chiến thuật và làm giảm sự tương xứng với lợi nhuận của cô phiếu

Lợi nhuận tông cộng và Tỷ suất lợi nhuận hàng năm: Lợi nhuận tổng cộng trong kỳ đầu tư là 2.723%, đây là mức lợi nhuận tích luỹ tương đối thấp trong khoáng thời gian kiểm tra Tỷ suất lợi nhuận hàng năm cũng thấp với 0.272%, và

nó thấp hơn độ biến động hàng năm của cô phiếu VCB (0 725%) Điều này chỉ ra rằng lợi nhuận hàng năm không tương xứng với mức biến động của cô phiếu, cho thay rủi ro đầu tư khá cao

Sharpe Ratio: Hé số Sharpe là 0.375, cho thay rang tỷ lệ lợi nhuận so với mức rủi

ro trong khoảng thời gian 12 tháng không đủ hấp dẫn Sự biến động của giá cổ phiêu không được đền bù bằng lợi nhuận hàng năm, và điều này cho thấy mức độ rủi ro trong danh mục đầu tư

Mức giảm lớn nhất: Tối đa giám tỷ lệ là -2%, vẫn thấp và tương tự với thông số trước đó Mức giảm lớn nhất này có thể được xem xét là ôn định, nhưng cũng cho thấy danh mục đầu tư không đạt được lợi nhuận cao trong khoảng thời gian kiêm tra

Nhận xét: Chiến thuật RS[ trên cỗ phiếu VCB trong khoang thời gian này có sự kết hợp của lợi nhuận thấp, biến động giá cô phiếu cao, và tỷ suất lợi nhuận hàng năm không đủ cao đề đền bù cho rủi ro

3.2.4 Kết hợp với chiến thuật SMA tìm ngắn hạn, dài hạn tối ưu:

Xây dựng chiên lược:

Lây đữ liệu từ đ£

x o df4 = df.copy

Khởi tao ba bién best return, best short sma, va best long sma véi gia trị ban đầu

là 0 và thực hiện vòng lặp đề thử lân lượt các cặp SMA ngăn hạn va dai han:

X thở: tạo các biến

best_return = 0

best_short_sma = 2

best_long sma = 2

#Vòng lặp để thử các cặp SMA ngắn hạn và SMA dài hạn

for short_sma in rang

df4.loc[(dfa["sMa_Short"] > df4["sMa_Lon ( Short'].shift(L) <= dfa["sw@_Long"].shift(1)) & (dfa["RSI"]>=20) , ‘position’] = 1

Hai vòng lặp trên sẽ thử nghiệm các cặp giá trị SMA ngăn hạn và dài hạn Với mỗi cặp giá trị SMA, đoạn code sẽ tính toán giá trị SMA ngắn hạn, SMA dài hạn và chỉ

số RS[I (Relative Strength Index) dựa trên dir liéu trong df4 Sau đó, đoạn code thêm một cột 'position' vào DataFrame df4 dựa trên các điều kiện sau:

+ Nếu giá trị SMA ngắn hạn lớn hơn giá trị SMA dài hạn và giá trị SMA ngăn hạn của phiên trước nhỏ hơn hoặc bằng giá trị SMA đài hạn của phiên

22

Trang 23

đặt la 1 (mua)

+ Nêu giá trị SMA ngăn hạn nhỏ hơn giá trị SMA dài hạn và giá trị SMA ngăn hạn của phiên trước lớn hơn hoặc băng giá trị SMA dài hạn của phiên trước và giá trị RSI nhỏ hơn hoặc băng 80, thì giá trị của cột 'position' được dat la -1 (ban)

Kiểm định và tìm kiếm các giá trị tối ưu cho các tham số SMA và RSI trong một

# Nội dung chiến thuật

class SmaCr RSI_Strategy (Strategy):

def init(self):

pass

def next(self):

if self.data.position == 1: #Position = 1 ==> Tin hiéu mua

self buy(size=100) #mua 109 cổ phiếu

if self.data.position ==-1: #Position = -1 ==> Tín hiệu bán

self.position.close()

# Thực hiện chiến thuật

bt = Backtest(df4, SmaCross_RSI_Strategy, cash=100000000, trade_on_close = True, exclusive_orders = True)

# Thực hiện kiểm định

result = bt.run()

Equity Final = float(result.to_frame().iloc[4])

print(f'SMA({short_sma},{long_sma}) và RSI(14): {Equity Final}")

Đối tượng Backtest được tạo sử dung dataframe df4, lớp chién thuat

SmaCross RŠI_ Strategy, với sô tiên khởi đầu là 100000000, 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 Kết quả Equity_ Final duoc in ra man hinh dé hién thị lợi nhuận cuối cùng của chién thuat voi cac gia tri SMA

va RSI tuong ung

Ta thu được kết quả kiểm định như sau:

23

Trang 24

x oe # Tính SMA ngắn hạn va SMA dai han va RSI, thém cét position

đf4['SMA 11'] = sma_indicator(close- df4['Close'], window - 11)

df4[°SMA 37°] = sma_indicator(close= df4["Close’], window = 37

dfa['RST'] = ta.momentum.RSTIndicator(df4[ ‘Close’ ]).rsi()

đf4.1oc[ (df4['5MA 11'] > dfa['sMa 37°]) & (df4[ 'SHA 11'].shift(1) <= đf4['5MA 37'].shift(1)) & (df4['RSI']>=20) , ‘position’

# Nội dung chiến thuật

class SmaCross_RSI_Strategy(Strategy):

def init(self):

pass

def next(self):

if self.data.position == 1: #Position = 1 ==> Tin hiéu mua

self buy(size=100) #muc 100 cé u

if self.data.position ==-1: #Position = -1 ==> Tin hiéu ban

self position.close()

# Thực hiện chiến thuật

bt = Backtest(df4, SmaCross_RSI_Strategy, cash=19@000002, trade_on_close = True, exclusive_orders = True)

result = bt.run()

result.to_frame()

- _ Xác định giá trị của cột 'posttion' dựa trên một số điều kiện:

+ Nếu SMA II lớn hơn SMA 37, SMA I1 của kỳ trước nhỏ hơn hoặc bang SMA 37 của kỳ trước và RSI lớn hơn hoặc bằng 20, thì 'position' được gán giá trị | (tín hiệu mua)

+ Nếu SMA II nhỏ hơn SMA 37, SMA ngăn hạn của kỳ trước lớn hơn hoặc

bằng SMA dài hạn của kỳ trước và RSI nhỏ hơn hoặc bằng 80, thì 'position'

được gan gia trị -L (tín hiệu bán)

- _ Nếu position' là I, chiến thuật sẽ mua 100 cô phiếu Nếu 'position' là -1, chiến thuật

sẽ bán số cô phiêu hiện có

- _ Backtest với số tiền khởi đầu là 100000000, 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

Kết quả được chuyển đôi thành DataFrame và in ra màn hình như sau:

24

Trang 25

Max Drawdown Duration

Avg Drawdown Duration

Max Trade Duration 217 days 00:00:00

Avg Trade Duration

Profit Factor

Expectancy [%]

58 days 00:00:00 5.920422 5.939601

3.2.4.1 Mô tả kết quả kiểm định:

- Chiến thuật sử dụng chỉ báo SMA(I11,37) kết hợp RSI(14) hiệu quả cao hơn so với chiến thuật RSI(14) vì:

Tỷ suất sinh lời (Retum), giá trị đầu tư cuối cùng(Equity Final), tỷ lệ thắng (Win rate), Sharpe ratio cao hơn

Mức lỗ trung bình (Avg Drawdown) và thời gian lỗ trung bình (Avg Drawdown Duration) thap hon

3.2.4.2 Kiểm định khi áp dụng phí giao dịch:

# Thực hiện chiến thuật khi có áp dụng mức phí giao dịch hiện nay là 0.2%

bt = Backtest(df4, SmaCross_RSI_Strategy, cash=100000000, commission =0.002, trade_on_close = True, exclusive orders = True)

# Thực hiện kiểm định

result = bt.run()

25

Trang 26

Thực hiện chiến thuật như trên thêm mức phí giao dịch phô biến hiện nay là 0.2%, ta được kết quả kiếm định như sau:

Start End Duration Exposure Time [%]

Avg Drawdown [%]

Max Drawdown Duration Avg Drawdown Duration

# Trades Win Rate [%]

Best Trade [%]

Worst Trade [%]

9 2013-01-04 00:00:00 2023-01-03 00:00:00

3651 days 00:00:00 58.396794

105530344 2 105953344.2

5530344 573.795761 0.545377 0.901104 0.605232 0.909089 0.320533 -1.701467 -0.204654

500 days 00:00:00

58 days 00:00:00

36 61.111111 79.522861 -11.532822

Nhận xét: Chiến thuật SMA(11,37) kết hợp RSI(14) khi đã áp dụng mức phí giao địch hiện nay 0.2% so với 0% phí sẽ làm giảm tỷ suất sinh lời của danh mục khi chúng ta giao địch có lời và sẽ làm cho danh mục lễ nặng hơn khi chúng ta cắt lỗ

3.2.4.3 Backtest chiến thuật khi mua số lượng cô phiếu tối đa có thể mua với

số tiền 100.000.000 VND:

- Xóa điều kiện 'size=100° để đầu tư 100.000.000 VNĐ mua hết cô phiêu VCB

self position.close(

# Thực hiện chién thugt với mức phi giao dịch hiện nay lã 9.2%

bt = Backtest(df4, SmaCross RSI Strategy full, cash=120098890, commission =8.02, trade on close = True, exclusive orders = True)

Ngày đăng: 05/12/2024, 15:57

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w