Ụ VỤ ĐÈ BÀI Câu 1: Vẽ đồ thị biểu diễn giá đóng cửa của cô phiếu VCB, đường SMA20 và đường Đường trung bình động giản đơn Simple Moving Average _ SMA TraderForex, 2022 Câu 2: Xây dựn
Trang 1BAI TAP CA NHAN
MON: TRI TUE NHAN TAO TRONG
Trang 2Ụ VỤ
ĐÈ BÀI
Câu 1: Vẽ đồ thị biểu diễn giá đóng cửa của cô phiếu VCB, đường SMA(20) và đường
Đường trung bình động giản đơn (Simple Moving Average _ SMA) (TraderForex,
2022)
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(dài
Đường EMA (Exponential Moving Average — đường trung bình động giản
Chi sé RSI (Relative Strength Index) - Chí số sức mạnh tương đối (Finhay,2023) 2I
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 dich Gia sir phi giao dịch là 0%, xác định đường SMA(ngắn hạn) và đường SMA(dai hạn) dé nhà đầu tư có thê kiếm được số tiền nhiều nhất sau khi thực hiện chiến
Trang 3ĐÈ
Sử dụng dữ 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”: ngay giao dich
"Open": giá mở cửa
"High": gid cao nhất
"Low": giá thấp nhất
"Close” giá đóng cửa
"Volume": khéi lượng giao dịch
Trang 4đồ ¡ ngiáđóngcử & 6 ếuVCB, đườ
đường SMA(50) trong giai doa
Đầu tiên, ta cần cài đặt môi trường mà chủ yếu đây là Backtesting và nhập vào các
thuật toán cần thiết (Phong, 2022)
Backtesting là một quá trình kiêm nghiệm lại các quy tắc giao dịch của nhà đầu tư dựa trên dữ liệu quá khứ, tạo ra các mô phỏng giao dịch trong quá khứ
Bằng cách này, nhà đầu tư có thê đánh giá và kiêm tra xem liệu chiến lược đầu tư cua minh có thật sự hiệu quả hay không, dựa vào các kêt quả thông kê
Lợi ích của Backtesting:
> Hiéu chi tiét tat cả về chiến lược — Lợi ích phô biến nhất của việc hỗ trợ hệ
thông giao dịch là ban có thê xác định được những tiêm năng có được lợi nhuận
kỳ vọng của các chiên lược giao dịch mà các bạn đã lựa chọn trước đó
> Thur té — Bằng cách xem xét các biến động giá thị trường trong quá khứ và các
mô hình lặp lại, việc phản hôi ngược giúp các nhà dau tư phát hiện ra các cơ hội giao dịch tiêm năng và thúc đây kỹ năng phân tích kỹ thuật của nhà giao dịch
> Sự tựtin— Phản đối hệ thống giao dịch là một cách để xây dựng lòng tin, đặc
biệt là vì các nhà giao dịch đã tích lũy kinh nghiệm băng cách xem xét thông tin giá trước đó Bạn có được sự tự tin thực sự khi thực hiện bât kỳ hoạt động nào
> Sự kết hợp hoàn hảo của tất cả các yêu tô này cho phép các nhà đầu tư giảm thiêu được tôi đa những rủi ro có thê xảy ra và tôi đa hóa lợi nhuận.
Trang 5Collecting backte: sting
Downloading packtesting 3.3.tar.gz (175 kB)
eparing metadata
collecting ta
Dow
175.5/175.5 kB 5.4 MB/s eta 6:00:00 (setup.py) «+ done
tisfied: numpy>=1.17.0 in fea ieee ieee 10/dist-packages (from backtesting) (1.23.5)
satisfied: pandas!=0.25.0,>=0.25.0 in /usr/local/lib/python3.10/dist-packages (from backtesting) (1.5.3)
satisfied: bokeh>=1.4.0 in ius ocal/ASb/pyten e/a packages (from backtesting) (3.2.2)
satisfied: 1inja2»«2.9 in /usr/local/1ib/python3.19/dist-packages (from bokeh»: ->backtesting) (3.1.2)
satisfied: contourpy>=1 in Tost /ocal/1ib/python3 10/dist-packages (from bokeh>=1.4.0->backtesting) (1.1.1)
satisfied: PyYAML»=3.10 in /usr/1ocal/1ib/python3.19/dist-packages (from bebelb~ 1,4.6->backtesting) (6.9.1)
satisfied: tornado>=5.1 in /usr/local/lib/python3.10/dist-packages (from Boteshond4.6- backtersing) (6.3 2)
patisfled: pythow dateutil>=2.8-1 In Jusr/local/1ib/python3.10/dist-packages (from pandas! ~ 23 6,2~0,25.0 hacktesting) (2.8.2)
satisfied: pytz>-2020.1 in fuer / lock) fistahens 10/dist-packages (from pandas!-0.25.0,>=0.25.0->backtesting) (2023.3 -postt)
satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from Jinja2 -3)
satisfied: sbo~l.s in /usr/1oca1/1ib/python3.16/đist-packages (fron python-dateutil>-2.8.1-»pandas!~0.25.0,>-0.25.0 18ecktesting) (2.16.9)
ollected packages: backtesti ông,
Building wheel for becktesting (setup.py) « don
ee fits nane=t a-0.10 -3-py2-none-any whl siz8=29261
successfully bullt tocitetirg tạ
Installing collected packages: ta, backtesting
Successfully installed backtesting-0.3.3 ta-0.10.3
[2] import matplotlib.pyplot as plt
p
import nunpy 25-9
import pd
from backtesting import == strategy
from ta.trend import sma_indic
/use/local/1ib/python3 10/dist
xa ackages/backtesting/ plotting.py:50: Userwarning: Jupyter Notebook detected Setting Bokeh output to notebook This may not work in Jupyter clients wit
rnings.warn("Jupyter Notebook detec
Tiếp theo, chúng ta nhập dữ liệu VCR Dữ liệu này được lấy từ ngày 03/01/2016
[ ] 4f['Trađingpate"] = pđ.to_đatetine(đf[ ' TradingDate'})
Tại cột “IradingDate” chưa được chuân hoá, nên ta chuyên đổi dữ liệu cột nay thanh kiéu ‘datetime’
Sau đó, ta sử dụng cột “IradingDate” làm khóa chính.
Trang 6G index Open High Low Close Volume
Ngay giao dich
Figure 1 Đồ thị biểu điễn giá đóng cửa của cô phiếu VCB
Chiến thuật giao dịch theo chỉ báo Các chỉ báo (indicators) là công cụ phân tích
kỹ thuật được phát triên gần đây, nhờ vào sự phát triên của khoa học máy tính Bản chât của các chỉ báo là các hàm số toán học tích hợp vào phân mêm phân tích kỹ thuật đê vẽ
Trang 7nên các biểu đồ kỹ thuật và được kiêm định hiệu quả đầu tư tốt Các chỉ báo này chia làm
hai nhóm: nhóm chỉ báo xu hướng và nhóm chỉ báo dao động
Nhóm chỉ báo xu hướng (trailing indicators) bao gồm các chỉ báo có tính chất nhận biết được xu hướng và sự thay đôi xu hướng của thị trường, nhưng phản ứng chậm với các biến động ngắn hạn của giá, ví du như đường MA, MACD, Bolinger Band, Nhóm chỉ báo dao động (momentum indicators) bao gồm các chỉ báo có tính chât nhận biệt ngay biên động của giá cá nhưng xác suật dự báo chính xác xu hướng của thị trường thâp, ví dụ như đường RSL, RỌC,
Đường trung bình động giản đơn (Simple Moving Average _ SMA)
Công dụng:
> Xu hướng của thị trường: Biểu đồ giá nằm trên đường trung bình di động cho thấy thị trường đang trong chiều hướng tăng giá Biểu đồ giá nằm dưới đường trung bình di động cho thấy thị trường đang trong xu hướng giảm
> xác định tín hiệu mua/bán: Mua khi đường giá cắt đường trung bình từ dưới lên Bán khi đường giá cắt đường trung bình từ trên xuống
> Kháng cự và hỗ trợ: Trong xu hướng tăng, đường trung bình đóng vai trò là một đường hỗ trợ Trong xu hướng giảm, đường trung bình đóng vai trò là một đường kháng cự
Kỳ hạn (n) của đường trung bình: Kỳ hạn của đường trung bình được nhà đầu tư chọn tùy thuộc vào kỳ hạn của xu hướng cân phân tích Nếu cân phân tích xu hướng rất ngắn thì chọn 5 13 ngày, ngắn chọn l4 25 ngày, trung hạn yếu chọn 26
trung hạn chọn 50 100 ngày, dài hạn chọ 200 ngày Các nhà đầu tư nên xu dụng
kết hợp nhiều đường trung bình với các kỳ hạn khác nhau đề xác định xu hướng chính
xác hơn: (¡) thị trường tăng, khi các đường trung bình ngắn lần lượt nằm lên trên đường
Trang 8trung bình đài; (ii) thị trường giảm, khi các đường trung bình ngắn lần lượt nằm dưới đường trung bình dải
[ ] df['SMA 29'] = sma indicator(close = df['Close'], window = 20)
© # Vé dd thi duong sma 20
df['SMA 20'] = sma_indicator(close=df['Close'], window=2@)
Trang 9df['SMA 59°] = sma_indicator(close=df[ 'Close' ], window=59)
Trang 10#Vẽ biểu đồ giữa giá Close, SMA 20, SMA 5Ø
© plt.plot(df[‘Close'], label = ‘Close')
plt.plot(df[ "SMA 20'], label = ‘SMA 20°)
plt.plot(df['SMA 50°], label = ‘SMA 50')
plt.title('Đồ thị biểu diễn giá đóng của cổ phiếu VCB')
plt.xlabel (‘Nam’)
plt.ylabel('Gia(VND)")
plt.legend()
[3 <matplotlib legend.Legend at 0x7a24395ab850>
Đồ thị biểu diễn giá đóng của cổ phiếu VCB
SMA 50 va SMA 20 được tính bang cach lay tong gia đóng cửa của các phiên (rong
30 và 20 phiên liên tiếp, sau đó chia cho sô lượng phiên đó đê tính ra giá trung bình
Do đó, các SMA này có biên độ giao động khác nhau SMA 50 sẽ có biên độ độ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 thấy xu hướng của tài sản đang ôn định hơn, 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 độ giao động lớn, có thé cho thay sự biến động của tài sản dang tăng cao, làm tăng mức độ rủi ro và khó khăn trong việc đánh giá xu hướng của tài sản
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 han của tài sản SMA 50 có xu hướng chậm hơn
Trang 11trong 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
Đường SMA có tính chất là tín hiệu trễ Tức là đường giá tạo đỉnh rồi, đường SMAO0) sau đó mới tạo đỉnh Đường SMA(50) tạo đỉnh trễ hơn nữa Tương tự đường giá bật lên rồi, đường SMA(20) bật lên sau, và đường SMA(50) bật lên muộn hơn nữa Đường SMA càng dài hạn hơn thì tín hiệu cảng trễ hơn và càng ít bám đường giá hơn.
Trang 12ự ề a i wa trên đườ šä ạn) và đườ
ạ ụ , khi đườ 4 a a wduwoilén dud
a éu "Mua" Trong khi, duo šă ạ ä ửừ ông đườ
# Tạo cột Position đế ưu kết quả quyết định mua bán của chiến lược q, lịch chiến thuật giao dịch dya trên đường S44(ngắn hạn) và đường SMA(dài hạn) (qua: 1, bán: -1)
['SMA 50'].shift(1)), 'position'] = 1
ng khoán đang tăng
ry using loc[row_indexer,col indexer] = value instead
Trang 13index Open High Low Close volume SMA 20 SMA 5@ position TradingDate
2016-03-18 49 19260 19350 19080 19220 3546350 18865.0 18641.60 NaN 2016-03-21 50 19580 19850 19350 19400 1862820 ‘18921.5 18639.00 NaN 2016-03-22 51 19440 19580 19350 19580 592130 18973.5 18646.20 NaN
2016-03-23 52 19580 19580 19350 19400 645700 18987.0 18645.40 NaN
2016-03-24 53 19400 19440 18990 19040 825250 18994.0 18641.80 NaN
2021-04-05 1311 65580 67420 64660 66890 3592400 62992.0 63881.98 NaN
2021-04-06 1312 66890 67220 65910 66830 2243200 63218.5 63919.98 NaN 2021-04-07 1313 66240 66890 65840 66830 1182700 63428.5 63956.80 NaN 2021-04-08 1314 66830 66830 65250 65580 1575400 63549.5 63917.40 NaN 2021-04-09 1315 65250 65250 63940 63940 2101700 63605.0 63845.20 NaN
1267 rows x 9 columns
Chúng ta mô tả chiến thuật dựa trên đường SMA ngắn hạn và dài hạn
—_ Nếu quyết đỉnh mua (self.data.position = L) thì mua 100 cô phiếu
—_ Nếu quyết định bán (self data.position = -1) thi bán tất cả cô phiếu đang có Sau đó, chúng ta sẽ thử kiểm tra chiến lược trên với một số thông tin sau:
— Số tiên đầu tư: 100.000.000 vnd
— Phí giao dịch: 0%.
Trang 14#Nếu quyết đỉnh mua (self.data.position == 1) thì mua 199 cổ phiếu
#Nếu quyết định bán (self.data.position == -1) thì bán tất cả cổ phiếu đang có
Trang 15#Max Drawdown [%]: giúp ta ước tính khoản lỗ tối đa
#Max Drawdown Duration
stats.to_frame ()
Trang 16Max Drawdown Duration 8
‘Avg Drawdown Duration 67
Max Trade Duration
‘Avg Trade Duration
Profit Factor
- Return [%]: Tỷ suất lợi nhuận, đây là con số quan trọng để đánh giá hiệu suất đầu tư
- Volatility (Amn.) [%]: Độ biến động hàng năm, đây là một chỉ số đo lường mức độ rủi ro của một khoản đầu tư
- Sharpe Ratio: Tý lệ Sharpe, đây là một chỉ số đo lường hiệu suất tương đôi của một khoản đầu tư so với rủi ro
- Max Drawdown [%]: Khoan lỗ tối đa, đây là con số giúp ước tính mức lỗ tối đa mà một khoản đầu tư có thê chịu đựng
- Max Drawdown Duration: Thời gian kéo dài của khoản lỗ tối đa, đây là thông tin quan trọng để hiệu về khả năng phục hồi của một khoản đầu tư sau khi gặp phải mức lỗ tối đa.
Trang 17Xây dựng chiến thuật giao dịch với ví dụ: đường EMA ngắn hạn 20 ngày, đường EMA dai han 50 ngày
Đường EMA (Exponential Moving Average — duéng trung binh dong gian don)(TraderForex, TraderForex, 2022)
EMA = Price, x K+ SMA, x (1 —k)
where:
( Foday
2
Number of days in period + 1
SM = Simple Moving Average of closing price
for the number of days in the period
: Yesterday
Khái niệm: tên goi day du 1a Exponential Moving Average — céng cy chi bao phan ánh sự biến động của giá được tính toán theo cấp số nhân, hay còn gọi là đường trung bình động hàm mũ
Đặc điểm:
> Cung câp dữ liệu mới nhât và nhanh nhât về sự biên động giả so với các chỉ
> Không bị thay đối dù cho loại bỏ hoặc thay đổi các số liệu cũ, tin tức lại cập nhật nhanh hơn Nhưng vì cập nhật giá quá nhanh EMA lại không thể kiêm soát được mức giá biến dong a ảo nên dễ xảy ra các trường hợp sai số Thông thường sự sai số này bắt nguồn từ việc đảo chiều nhanh chóng của các tín hiệu giao dich
> Nếu lựa chọn khung thời gian dài hơn thì EMA có khả năng quan sát kỹ hon sẽ it bị sai sô nhưng không thể kiểm soát được các điểm đối chiều
> Nếu lựa chọn khung thời gian ngắn thì EMA có thê sớm bắt theo xu hướng nhưng lại dễ mắc bẩy bởi các tín hiệu sai lệch
Công dụng:
> Hỗ trợ các nhà đầu tư xác định được xu hướng thị trường
> Giúp các nhà đầu tư xác định điểm vào lệnh cho chính xác
> Giúp xác định hỗ trợ kháng cự
Trang 18Tao 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 đường EMA(ngăn hạn) và đường EMA(dài hạn) (mua: I, ban: -1)
[56] from ta.trend import ema indicator
© éfl'2% 20°] - ema_indicator(close-df[ 'close’], window -20)
df["EMA 50°] = ema_indicator(close=df[ 'Close'], window =50)
(58) đf[*position"] = Mone
[59] df.head(201)
index Open High Low Close Volune SMA S@ SMA 20 position EMA 20 ease ER
2016-01-04 © 19720 19900 19260 19590 761750 NaN NaN None NaN NaN
2016-01-05 1 18400 19620 19170 19220 1133200 NaN NaN Nom NaN NaN
GeneralStrategy,#chiến lược giao địch
cash = 100090,#số tiên ban đầu
Trang 19Max Drawdown Duration
‘Avg Drawdown Duration 5
Max Trade Duration
Avg Trade Duration
loại bỏ những tín hiệu giả không liên quan | xác các biên động thay đôi
Cập nhật các biến động giá chậm nên
Nhược điêm | khiên các nhà dau tư bỏ lỡ cơ hội cập nhật Kẻ TK „
C ĐIA CA TA Dé mac bay va cho tin tin hiéu vao lénh » tan
hiéu sai léch
Đường EMA và đường SMA đều có những ưu điểm và nhược điểm riêng, do đó
không thê khăng định đâu là công cụ hiệu quả hơn Hiệu quả nhất chính là cách mà các nhà đầu tư kết hợp loại chỉ báo phù hợp với chiến lược giao dịch của mình Nếu đầu tư
ngắn hạn EMA là công cụ phù hợp, nêu xác định đầu tư dài hạn hay chon SMA.
Trang 20Xây dựng chiến thuật dựa trên thuật toán của môn học Machine Learning (Học ,
may)
[65] df["target’] = df[ ‘position’ }.shift(-1)
[66] đf[(đf['position'].notnu11()) |(đf{ 'target` ].notnu11())}
index open High Low Close volume SMA SO SMA 20 position ea 20 EPA 50 target
[69] from sklearn.ensemble import RandowforestClassifier
© <if = RandomForestclassifier(max_depth = 2, random_state = 6)
clf.fit(x train, y_train)
Generalstrategy,®chiến lược giao dịch
ca số tiền ban đầu
commission = 6.002,#phi giao dich
trade_on_close = True,
exclusive orders = True)
stats = bt.run()
© stats.to_frane() + wc<H@QIU §
Trang 21Max Trade Duration 2411 ce
Avg Trade Duration 1227 days 0O 00 04
Profit Factor NaN
Chỉ số RSI (Relative Strength Index) - Chỉ số sức mạnh tương đối (Finhay, 2023)
RSI = 100 - [ 1 — bìn! ]
Khái niệm: là chỉ báo giúp đo lường mức độ thay đối giá gần Từ đó đánh giá các điều kiện mua vượt mức hoặc bán vượt mức của giá cô phiêu hoặc tài sản khác
Chí số này dùng trong phân tích kỹ thuật, được biểu diễn dưới dạng đồ thị mà trong
đó có một đường đi chuyên giữa hai điệm cực trị (còn được gọi là bộ giao động), giá trị của nó từ 0 đên 100
Nội dung của RSI cụ thê:
> Wilder gia định ngưỡng quá mua xuất hiện khi thị trường tăng điểm trong một thời gian quá dài và ngưỡng quá bán xảy ra khi thị trường giảm điểm trong thời gian dải
> RSI la cac giá trị từ 70 trở lên cho thấy mã chứng khoán đó đang trở nên mua quá mức hoặc định giá quá cao, điều này ưu tiên cho xu hướng đảo ngược, điều chính giảm giá ngay sau đó
> RSI la cac giá trị từ 30 trở xuống cho thấy tình trạng mã chứng khoán đang
bị tình trạng bán quá mức hoặc bị định giá quá thấp
> RSI & mức từ 30 đến 70 là vùng trung bình, đạt mức 50 là dấu hiệu không có
xu hướng.
Trang 22> Chỉ số RSI đo lường sức mạnh tương đối của giá chứng khoán với các mức giá trong lịch sử của chính mã chứng khoán đó Bạn không thể sử dụng chỉ
số RSI đề so sánh các mã chứng khoán với nhau
> RSI cung cấp cho các nhà giao dịch kỹ thuật trên thị trường những tín hiệu
về động lượng giá tăng và động lượng giá giảm Chỉ số này được trình bày ở
bên dưới biểu đồ giá của một mã chứng khoán cụ thể
Ý nghĩa của đường RSI
> Dựa vào chỉ số RSI, nhà đầu tư dễ dàng phát hiện tình trạng mua quá nhiều hoặc bán quá nhiều trên thị trường Nếu RSI nằm dưới mức 30, giá tài sản đang gần chạm đáy, RSI nằm trên mức 70, giá tài sản đang gần mức đinh, nguy co sẽ giảm
> Thông qua RSI, nhà đầu tư tập trung vào các tín hiệu và kỹ thuật giao dịch phủ hợp với xu hướng chứng khoán Trong xu hướng giảm, RSI hiểm khi vượt qua mức 70, chỉ số này thường xuyên chạm mức 30 hoặc thấp hơn Với
xu hướng tăng, RST duy trì trên 30 và thường xuyên chạm ngưỡng 70.
Trang 23©) “nhập các thuật toán cần thiết
imgort nưngy as np
import matplotlib.pyplot as plt
import yFinance as yf
from scipy.signal import argrelextrena
from collections import deque
4Hhập dữ liệu và về biểu đồ giá đồng cửa
Nhập dữ liệu và vẽ biêu đồ giá đóng cửa
Price Chart for VCB
Trang 24Biểu đồ thể hiện điểm đính và đáy theo giá đóng cửa
#0iểu đồ thế hiện điềm đỉnh và đấy theo giá đóng cửa
đata[ 'local_ max'] = đata[ 'Closé ][
(data[ "Close" ].shift(1) < đata["Closé]}) &
(data[ ‘Close’ ].shift(-1) < data[ ‘Close’ ))]
data[ ‘local_nin’] - data['close’
(data["Closé].shäft(1) > data["Closé]) &
(data[ ‘Close ].shift(-1) > data[ ‘close’ ])]
colors = plt.rcParans[' axes.prop_cycle" ].by_key()[ color" ]
plt.Figure(figsizeă1s, 8))
plt.plot(đata["Close"], zorder=)
plt.scatter(datạindex, datắlocal_wax'], s=199,
ker="^', c=colors[1])
plt.scatter(datạinđex, data{ 'local min"], s«100,
labeì~*Hinima"„ arker='v', c=colors[2])
Figure 6 Biéu dé thé hién điểm đỉnh và đáy theo giá đóng cửa
© Ha he: chỉ báo nội tụ/phan kỹ
B 120000 +
#Biểu đồ thể hiện gia cực tiểu và cực đại dựa trên giả đồng cửa
max 1dx = argrelextremădata[ 'Closé ].values, np.greater, order=5)[@]
min idx = argrelextremădata[ 'Closé].values, np.less, order=5)[9]
plt.figure(figsize=(15, 8))
plt.p1ot(data[ 'Close"], zorder=8)
plt.scatter(datại1oc[max_idx].index, datạiloc[max_idx][ "Close" ],
label='Maximá, s=19Ø, color=colors[1], marker='^")
plt.scatter(datạiloc{min_idx].index, datạiloc[min_1dx][ 'Closé ]„
label='Minimá, s=19@, color=colors{2], marker='v')
plt.legend()
plt show()