| Vẽ Biểu Đồ Giá Bằng Matplotlib — Nến Nhật Candlestick + Chỉ Báo Trong Python

Được viết bởi vào ngày 19/08/2026 lúc 14:33 | 9 lượt xem

📺 Video: https://www.youtube.com/shorts/60MXUJQSfAQ

Mục lục

  1. Vì sao vẽ biểu đồ giá là kỹ năng không thể thiếu
  2. Chuẩn bị môi trường — cài matplotlib & mplfinance
  3. Nến Nhật (candlestick) là gì? Đọc một cây nến
  4. Lấy dữ liệu giá từ Binance public API
  5. Vẽ biểu đồ nến đầu tiên bằng mplfinance
  6. Thêm chỉ báo — đường SMA 7 và SMA 25
  7. Tùy chỉnh màu sắc, kích thước, style
  8. Xuất file ảnh sạch cho báo cáo bằng savefig
  9. Vẽ nến bằng matplotlib thuần — không cần mplfinance
  10. FAQ
  11. Kết luận

1. Vì sao vẽ biểu đồ giá là kỹ năng không thể thiếu

Trong thế giới tài chính, một con số đơn lẻ gần như vô nghĩa — nhưng một biểu đồ giá lại kể lại toàn bộ câu chuyện: giá đang tăng hay giảm, biến động mạnh hay nhẹ, khối lượng giao dịch ra sao, xu hướng đang đổi chiều hay tiếp diễn.

Khi bạn học Python để làm việc với dữ liệu tài chính, việc vẽ biểu đồ không phải là “phần trang trí” — nó là công cụ phân tích chính:

  • Nhìn nhanh xu hướng — một biểu đồ 5 giây cho bạn biết điều mà cả bảng số dài 100 dòng khó thể hiện.
  • Kiểm tra chiến lược — sau khi backtest, bạn cần vẽ equity curve, vẽ các điểm vào lệnh để xem chiến lược “ăn” ở đâu.
  • Báo cáo cho người khác — sếp, học viên, khách hàng không đọc code, nhưng ai cũng đọc được biểu đồ.
  • Xây bot giao dịch — bot cần hiểu trực quan trạng thái thị trường, và chart là cách phổ biến nhất.

Trong chuỗi Python 365, hôm nay (Ngày 63) bạn sẽ học kỹ năng cốt lõi nhất của phân tích kỹ thuật bằng Python: vẽ biểu đồ nến Nhật — loại biểu đồ mà mọi trader chuyên nghiệp đều dùng.

💡 Nguyên tắc chuỗi Python 365: 1 ngày = 1 kỹ năng dùng được ngay. Hôm nay chỉ với ~30 dòng code, bạn sẽ có một biểu đồ nến đẹp chuẩn trader, sẵn sàng xuất ra file cho báo cáo.

Ba loại biểu đồ giá phổ biến

Trước khi đi sâu vào nến Nhật, hãy điểm qua ba loại biểu đồ giá mà mọi trader gặp hàng ngày:

  1. Biểu đồ đường (Line chart) — chỉ nối các giá đóng lại với nhau. Đơn giản, gọn, phù hợp để nhìn xu hướng tổng thể nhưng mất hết chi tiết biến động trong phiên.
  2. Biểu đồ cột OHLC (Bar chart) — mỗi phiên là một thanh dọc có hai dấu gạch ngang (trái = giá mở, phải = giá đóng). Chi tiết hơn đường nhưng kém trực quan.
  3. Biểu đồ nến Nhật (Candlestick) — mỗi phiên là một cây nến với thân và râu, tô màu xanh/đỏ. Đây là loại biểu đồ được trader chuyên nghiệp dùng nhiều nhất vì nó gói toàn bộ thông tin vào một hình ảnh dễ đọc.

Trong bài hôm nay, chúng ta tập trung vào loại thứ ba — biểu đồ nến Nhật — bởi nó là chuẩn mực của phân tích kỹ thuật hiện đại.

Chúng ta sẽ làm gì hôm nay?

  1. Cài hai thư viện matplotlibmplfinance.
  2. Lấy 120 nến 1 giờ của Bitcoin (BTC/USDT) từ Binance public API — không cần API key.
  3. Vẽ biểu đồ nến Nhật với hai đường SMA 7 và SMA 25.
  4. Kèm theo khối lượng giao dịch phía dưới.
  5. Xuất file PNG sạch đẹp, dùng được ngay trong báo cáo.

Toàn bộ kết quả là file bieudo_btc.png — chỉ vài dòng Python.


2. Chuẩn bị môi trường — cài matplotlib & mplfinance

matplotlib là gì?

matplotlib là thư viện vẽ biểu đồ nổi tiếng nhất của Python — giống như “Excel chart” nhưng mạnh hơn gấp nhiều lần và hoàn toàn miễn phí. Nó vẽ được hầu hết mọi loại biểu đồ: đường, cột, tròn, phân tán, heatmap…

mplfinance là gì?

mplfinance (Matplotlib Finance) là thư viện chuyên cho tài chính — được xây dựng trên matplotlib để vẽ biểu đồ nến Nhật (candlestick) một cách nhanh chóng. Thay vì tự tay vẽ từng hình chữ nhật cho thân nến, bạn chỉ cần gọi một hàm duy nhất: mpf.plot().

Cài đặt

Mở terminal (PowerShell / CMD) và chạy:

pip install matplotlib mplfinance

Nếu dùng Google Colab, thêm dấu chấm than ở đầu:

!pip install matplotlib mplfinance

Kiểm tra đã cài thành công:

import matplotlib
import mplfinance
print(matplotlib.__version__)   # ví dụ 3.11.1
print(mplfinance.__version__)   # ví dụ 0.12.10b0

💡 Nếu bạn đã học Ngày 62 (Top API miễn phí), bạn đã biết cách gọi API bằng urllib. Hôm nay chúng ta tái sử dụng chính kỹ năng đó để lấy dữ liệu giá — các bài học trong chuỗi Python 365 liên kết với nhau như vậy.


3. Nến Nhật (candlestick) là gì? Đọc một cây nến

Biểu đồ nến Nhật (Japanese candlestick) ra đời từ thế kỷ 18, do các thương nhân gạo ở Nhật Bản phát minh để theo dõi giá. Đến nay nó là tiêu chuẩn toàn cầu của phân tích kỹ thuật.

Một cây nến gồm 4 giá

Mỗi cây nến đại diện cho một khoảng thời gian (1 phút, 1 giờ, 1 ngày…) và chứa đúng 4 giá:

Ký hiệu Tên Ý nghĩa
Open Giá mở Giá đầu phiên (đầu cây nến)
High Giá cao nhất Đỉnh cao nhất trong phiên
Low Giá thấp nhất Đáy thấp nhất trong phiên
Close Giá đóng Giá cuối phiên (cuối cây nến)

Ví dụ đọc chuỗi nến trong thực tế

Giả sử bạn thấy 3 cây nến 1 giờ liên tiếp của BTC như sau:

  • Nến 1: thân xanh dài, râu trên ngắn → giá tăng mạnh từ đầu đến cuối phiên, người mua áp đảo.
  • Nến 2: thân xanh nhỏ, râu dưới dài → giá có lúc giảm sâu nhưng bị kéo lên lại, người mua vẫn giữ thế chủ động.
  • Nến 3: thân đỏ dài, râu ngắn → giá giảm mạnh, người bán chiếm ưu thế.

Chuỗi này kể lại câu chuyện: “đà tăng đang suy yếu và có thể sắp đảo chiều”. Nếu chỉ nhìn con số cuối (Close) bạn sẽ bỏ lỡ toàn bộ diễn biến này — đó là lý do biểu đồ nến quan trọng đến vậy.

💡 Trader gọi những vùng giá mà thị trường đã chạm nhiều lần là vùng hỗ trợ/kháng cự. Râu nến dài thường đánh dấu những vùng này trên biểu đồ.

Thân nến và râu nến

  • Thân nến (body): là hình chữ nhật giữa Open và Close.
  • Nến xanh (bullish): Close > Open → giá tăng trong phiên.
  • Nến đỏ (bearish): Close < Open → giá giảm trong phiên.
  • Râu nến (wicks / shadows): là hai đường mảnh từ thân nến đến High và Low — thể hiện phạm vi giá đã chạm tới.

Công thức đọc nhanh

$$ text{Nến tăng (bullish)}: text{Close} > text{Open} $$

$$ text{Nến giảm (bearish)}: text{Close} < text{Open} $$

$$ text{Thân nến} = |text{Close} – text{Open}| $$

Một cây nến dài thân (thân lớn, râu nhỏ) nghĩa là giá di chuyển mạnh theo một hướng. Một cây nến “doji” (thân gần như bằng 0) nghĩa là thị trường do dự, không ai thắng — thường báo hiệu sắp đảo chiều.

💡 Để phân tích chuẩn, trader nhìn vào chuỗi nến chứ không phải một nến đơn. Hôm nay bạn vẽ cả 120 nến để thấy bức tranh tổng thể.


4. Lấy dữ liệu giá từ Binance public API

Binance cung cấp API công khai miễn phí, không cần đăng ký cho dữ liệu thị trường. Endpoint lấy nến (klines) có dạng:

https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1h&limit=120
  • symbol=BTCUSDT — cặp tiền Bitcoin/USDT.
  • interval=1h — nến 1 giờ (có thể đổi 1m, 15m, 4h, 1d…).
  • limit=120 — lấy 120 nến gần nhất.

Code lấy dữ liệu

import json
import urllib.request

url = "https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1h&limit=120"
with urllib.request.urlopen(url) as r:
    raw = json.loads(r.read().decode())

print(type(raw))       # list
print(len(raw))        # 120
print(raw[0])          # một nến dạng list 12 phần tử

Mỗi nến Binance trả về một list 12 phần tử, trong đó 6 cái đầu là thứ ta cần:

Vị trí Ý nghĩa
0 Mở phiên (Open time) — dạng millisecond
1 Giá mở (Open)
2 Giá cao nhất (High)
3 Giá thấp nhất (Low)
4 Giá đóng (Close)
5 Khối lượng (Volume)
6-11 Các trường phụ (thời gian đóng, số lệnh…) — hôm nay không dùng

Đổ vào DataFrame

Để vẽ biểu đồ, ta cần dữ liệu dạng bảng. Dùng pandas — thư viện quen thuộc trong chuỗi Python 365:

import pandas as pd

df = pd.DataFrame(raw, columns=[
    "time", "open", "high", "low", "close", "volume",
    "close_time", "qav", "trades", "tb", "tq", "ig"])

# Đổi cột thời gian (millisecond) sang kiểu ngày giờ
df["time"] = pd.to_datetime(df["time"], unit="ms")

# Đổi các cột giá sang kiểu số thực
for col in ["open", "high", "low", "close", "volume"]:
    df[col] = df[col].astype(float)

# Đặt cột thời gian làm chỉ mục (mplfinance yêu cầu index là datetime)
df = df.set_index("time")

Sau bước này, df có 120 dòng, cột time là index kiểu datetime, các cột giá là float — sẵn sàng để vẽ.

⚠️ Lưu ý: Nếu API Binance không truy cập được từ mạng của bạn (lỗi HTTP), bạn có thể thay bằng dữ liệu tự sinh bằng numpy.random để luyện tập. Nhưng với mạng thông thường, Binance public API hoạt động rất ổn định.

Tự sinh dữ liệu để luyện tập (khi không có mạng)

Nếu đang ở môi trường không truy cập được Binance, bạn vẫn có thể luyện tập vẽ nến bằng dữ liệu tự sinh. Cách đơn giản: tạo một chuỗi giá đi lên kèm nhiễu ngẫu nhiên.

import numpy as np
import pandas as pd

np.random.seed(63)
n = 120
close = 60000 + np.cumsum(np.random.randn(n) * 200)
open_ = close + np.random.randn(n) * 50
high = np.maximum(open_, close) + np.random.rand(n) * 80
low = np.minimum(open_, close) - np.random.rand(n) * 80
volume = np.random.rand(n) * 1000

df = pd.DataFrame({
    "open": open_, "high": high, "low": low,
    "close": close, "volume": volume
}, index=pd.date_range("2026-01-01", periods=n, freq="h"))

Chuỗi close được tạo bằng np.cumsum(np.random.randn(n)*200) — cộng dồn các bước ngẫu nhiên, mô phỏng giá di chuyển giống thị trường thật (random walk). Sau đó bạn có df đúng định dạng để vẽ nến mà không cần mạng.


5. Vẽ biểu đồ nến đầu tiên bằng mplfinance

Giờ là phần thú vị nhất — chỉ một dòng vẽ nến:

import mplfinance as mpf

mpf.plot(df[["open", "high", "low", "close", "volume"]],
         type="candle",
         style="yahoo",
         volume=True)
  • type="candle" — vẽ kiểu nến Nhật.
  • style="yahoo" — dùng bảng màu kiểu Yahoo Finance (nến xanh/đỏ quen thuộc).
  • volume=True — thêm biểu đồ khối lượng phía dưới.

Kết quả là một cửa sổ biểu đồ hiện ra với 120 cây nến BTC/USDT — nến xanh là phiên tăng, nến đỏ là phiên giảm, phía dưới là các cột khối lượng.

Giải thích cấu trúc biểu đồ

  • Trục ngang (x): thời gian — mỗi cây nến là 1 giờ.
  • Trục dọc (y): giá USDT.
  • Biểu đồ nhỏ phía dưới: khối lượng giao dịch — cột cao nghĩa là phiên giao dịch sôi động.

Trader thường nhìn kết hợp: giá tăng kèm khối lượng lớn = xu hướng mạnh; giá tăng nhưng khối lượng yếu = xu hướng dễ gãy.


6. Thêm chỉ báo — đường SMA 7 và SMA 25

Biểu đồ nến cho biết giá đã đi như thế nào, nhưng để biết xu hướng bạn cần đường trung bình động (SMA).

SMA là gì?

SMA (Simple Moving Average) là trung bình cộng của n giá đóng gần nhất:

$$ text{SMA}_n(t) = frac{text{Close}(t) + text{Close}(t-1) + dots + text{Close}(t-n+1)}{n} $$

  • SMA 7 — trung bình 7 phiên gần nhất, phản ứng nhanh, thể hiện xu hướng ngắn hạn.
  • SMA 25 — trung bình 25 phiên, mượt hơn, thể hiện xu hướng trung hạn.

Tính SMA bằng pandas

pandas có sẵn hàm rolling().mean() — không cần tự viết vòng lặp:

df["SMA7"] = df["close"].rolling(7).mean()
df["SMA25"] = df["close"].rolling(25).mean()

💡 Mẹo hiểu rolling: rolling(7).mean() nghĩa là “với mỗi dòng, lấy 7 giá đóng gần nhất (gồm chính nó) tính trung bình”. 6 dòng đầu sẽ là NaN vì chưa đủ 7 phiên — matplotlib tự bỏ qua các điểm rỗng này.

Vẽ nến kèm SMA

Dùng mpf.make_addplot() để thêm các đường chỉ báo lên biểu đồ nến:

ap = [mpf.make_addplot(df["SMA7"],  color="#f7b731", width=1.4),
      mpf.make_addplot(df["SMA25"], color="#4a9eff", width=1.4)]

mpf.plot(df[["open", "high", "low", "close", "volume"]],
         type="candle", style="yahoo",
         addplot=ap,
         volume=True,
         title="BTC/USDT 1H — Nến Nhật + SMA 7/25",
         ylabel="Giá (USDT)",
         figsize=(12, 6))
  • addplot=ap — chèn hai đường SMA lên biểu đồ.
  • figsize=(12, 6) — kích thước tính bằng inch (12 ngang, 6 dọc), giúp biểu đồ rộng dễ nhìn.

Cách đọc khi có SMA

Quy tắc đơn giản để bắt đầu:

  • Giá trên SMA 25 → xu hướng trung hạn đang tăng.
  • SMA 7 cắt lên trên SMA 25 (golden cross) → tín hiệu tăng.
  • SMA 7 cắt xuống dưới SMA 25 (death cross) → tín hiệu giảm.

Đây chính là nền tảng của các bot giao dịch đơn giản mà bạn sẽ xây trong các ngày tiếp theo của chuỗi Python 365.


7. Tùy chỉnh màu sắc, kích thước, style

mplfinance cho phép tùy chỉnh gần như mọi thứ. Dưới đây là các tùy chỉnh hay dùng:

Đổi màu nến tăng/giảm

mc = mpf.make_marketcolors(up="#26a69a", down="#ef5350",
                           edge="inherit", wick="inherit", volume="in")
style = mpf.make_mpf_style(marketcolors=mc,
                           facecolor="#0f1420",
                           figcolor="#0f1420",
                           gridcolor="#223")
mpf.plot(df[["open", "high", "low", "close", "volume"]],
         type="candle", style=style, volume=True)
  • up — màu nến tăng (xanh ngọc).
  • down — màu nến giảm (đỏ).
  • facecolor — màu nền biểu đồ (tối, kiểu dark mode).
  • gridcolor — màu lưới.

Đổi loại biểu đồ

mpf.plot(..., type="line")     # đường gấp khúc
mpf.plot(..., type="ohlc")     # thanh OHLC
mpf.plot(..., type="candle")   # nến Nhật

Tùy chỉnh trục, tiêu đề

mpf.plot(df[...],
         type="candle", style="yahoo",
         title="nBTC/USDT 1H",
         ylabel="Giá (USDT)",
         ylabel_lower="Khối lượng",
         xrotation=30)          # xoay nhãn trục x 30 độ

💡 Khi làm báo cáo, hãy giữ style nhất quán cho mọi biểu đồ — định nghĩa một style ở đầu script rồi dùng lại cho tất cả các lần vẽ. Đây là thói quen tốt của người làm báo cáo chuyên nghiệp.

Các style có sẵn của mplfinance

mplfinance đi kèm một số bảng màu (style) dùng ngay:

  • style="yahoo" — nền trắng, nến xanh/đỏ quen thuộc kiểu Yahoo Finance.
  • style="binance" — nền tối, nến xanh lá/đỏ kiểu sàn Binance.
  • style="charles" — bảng màu tối giản của một sàn giao dịch nổi tiếng.
  • style="nightclouds" — nền tối xanh, hợp để trình chiếu tối.
  • style="sas", style="starsandstripes" — các phong cách khác.

Thử nhanh bằng cách đổi chuỗi trong style= rồi so sánh. Việc chọn style phù hợp giúp biểu đồ của bạn chuyên nghiệp hơn hẳn khi đưa vào báo cáo hoặc bài thuyết trình.

Định nghĩa style riêng của bạn

Nếu làm báo cáo thường xuyên, hãy định nghĩa một style riêng ở đầu script:

mc = mpf.make_marketcolors(up="#26a69a", down="#ef5350",
                           edge="inherit", wick="inherit", volume="in")
STYLE = mpf.make_mpf_style(marketcolors=mc, facecolor="#0f1420",
                           gridcolor="#223", gridstyle="--")

# Dùng lại cho mọi biểu đồ
mpf.plot(df[...,], type="candle", style=STYLE, volume=True)

Định nghĩa một lần, dùng mãi mãi — vừa nhất quán vừa tiết kiệm thời gian mỗi khi tạo báo cáo mới.


8. Xuất file ảnh sạch cho báo cáo bằng savefig

Mục tiêu cuối cùng của bài hôm nay: xuất biểu đồ thành file PNG sạch đẹp để chèn vào báo cáo, bài viết, hoặc gửi cho đồng đội.

Trong mpf.plot, chỉ cần thêm savefig:

mpf.plot(df[["open", "high", "low", "close", "volume"]],
         type="candle", style="yahoo",
         addplot=ap,
         volume=True,
         title="BTC/USDT 1H — Nến Nhật + SMA 7/25",
         ylabel="Giá (USDT)",
         figsize=(12, 6),
         savefig="bieudo_btc.png")

Sau khi chạy, bạn sẽ thấy file bieudo_btc.png trong cùng thư mục với script — đúng kích thước figsize, đúng màu sắc, sẵn sàng dùng.

Với matplotlib thuần (không phải mplfinance)

Nếu bạn vẽ bằng matplotlib.pyplot thông thường, dùng plt.savefig():

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(df["close"])
plt.title("BTC/USDT — Giá đóng")
plt.xlabel("Thời gian")
plt.ylabel("Giá (USDT)")
plt.grid(True)
plt.savefig("gia_dong.png", dpi=150, bbox_inches="tight")
print("Đã lưu gia_dong.png")
  • dpi=150 — độ phân giải 150 điểm/inch (đủ sắc nét cho web và in).
  • bbox_inches="tight" — cắt bỏ viền trắng thừa quanh biểu đồ.

⚠️ Lưu ý: Gọi plt.show()plt.savefig() cùng lúc có thể tạo file trắng trên một số hệ điều hành. Nếu gặp, hãy gọi savefig trước rồi mới show.

Tổng hợp: script hoàn chỉnh Ngày 63

Toàn bộ code của bài học gộp lại:

import json
import urllib.request
import pandas as pd
import mplfinance as mpf

# 1) Lấy 120 nến 1h BTC/USDT từ Binance public API
url = "https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1h&limit=120"
with urllib.request.urlopen(url) as r:
    raw = json.loads(r.read().decode())

# 2) Đổ vào DataFrame
df = pd.DataFrame(raw, columns=[
    "time", "open", "high", "low", "close", "volume",
    "close_time", "qav", "trades", "tb", "tq", "ig"])
df["time"] = pd.to_datetime(df["time"], unit="ms")
for col in ["open", "high", "low", "close", "volume"]:
    df[col] = df[col].astype(float)
df = df.set_index("time")

# 3) Tính SMA 7 và SMA 25
df["SMA7"] = df["close"].rolling(7).mean()
df["SMA25"] = df["close"].rolling(25).mean()

# 4) Vẽ nến + 2 SMA + volume, xuất PNG
ap = [mpf.make_addplot(df["SMA7"], color="#f7b731", width=1.4),
      mpf.make_addplot(df["SMA25"], color="#4a9eff", width=1.4)]
mpf.plot(df[["open", "high", "low", "close", "volume"]],
         type="candle", style="yahoo", addplot=ap,
         volume=True,
         title="BTC/USDT 1H — Nến Nhật + SMA 7/25",
         ylabel="Giá (USDT)", figsize=(12, 6),
         savefig="bieudo_btc.png")

print("Đã lưu bieudo_btc.png")

9. Vẽ nến bằng matplotlib thuần — không cần mplfinance

Nếu bạn muốn hiểu bản chất và không phụ thuộc thư viện chuyên dụng, có thể tự vẽ nến bằng matplotlib thuần. Ý tưởng:

  • Râu nến (High→Low): vẽ bằng ax.vlines.
  • Thân nến (Open→Close): vẽ bằng ax.add_patch(Rectangle).
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle

fig, ax = plt.subplots(figsize=(12, 6))

for i, row in df.iterrows():
    color = "#26a69a" if row["close"] >= row["open"] else "#ef5350"
    # Râu nến
    ax.vlines(i, row["low"], row["high"], color=color, linewidth=1)
    # Thân nến
    h = max(abs(row["close"] - row["open"]), 1e-9)
    ax.add_patch(Rectangle((i - 0.3, min(row["open"], row["close"])),
                           0.6, h, facecolor=color, edgecolor=color))

ax.set_title("BTC/USDT 1H — Tự vẽ nến bằng matplotlib")
plt.tight_layout()
plt.savefig("nến_tu_ve.png", dpi=150)

Vòng lặp này mô tả chính xác những gì mplfinance làm bên trong — hữu ích khi bạn muốn tùy biến cực sâu hoặc hiểu cách hoạt động.

💡 Lời khuyên: Khi mới học, dùng mplfinance cho nhanh. Khi muốn kiểm soát từng pixel hoặc học nội tại, tự vẽ bằng matplotlib thuần. Cả hai đều là kỹ năng có giá trị.


10. FAQ

1. mplfinance và matplotlib khác nhau thế nào?

mplfinancegiao diện chuyên tài chính xây trên matplotlib. matplotlib là nền tảng vẽ mọi loại biểu đồ; mplfinance gói gọn logic vẽ nến/OHLC để bạn gọi 1 hàm thay vì tự vẽ từng hình.

2. Làm sao đổi khung thời gian (timeframe)?

Đổi tham số interval trong URL Binance: 1m, 5m, 15m, 1h, 4h, 1d, 1w. Ví dụ nến ngày: interval=1d.

3. Dữ liệu Binance bị chặn mạng thì làm sao?

Thay nguồn khác cùng format klines: Bybit, OKX, hoặc dùng yfinance lấy dữ liệu Yahoo. Hoặc tự sinh dữ liệu bằng numpy.random để luyện tập vẽ.

4. Làm sao vẽ nhiều cặp tiền trên cùng một biểu đồ?

Gọi mpf.plot nhiều lần với figscale, hoặc dùng plt.subplots với matplotlib thuần để chia nhiều khung (subplot) — mỗi khung một cặp.

5. File PNG bị trắng khi xuất?

Hầu hết do gọi plt.show() trước plt.savefig(). Hãy đảm bảo savefig được gọi trước, hoặc dùng mplfinance với savefig trong chính mpf.plot.

6. SMA tính bằng rolling có phần NaN ở đầu?

Đúng — 6 giá trị đầu (với SMA7) và 24 giá trị đầu (với SMA25) là NaN vì chưa đủ số phiên. matplotlib bỏ qua chúng tự động, nên biểu đồ vẫn đẹp.

7. Muốn xuất file chất lượng cao để in?

Dùng dpi=300 trong savefig (matplotlib thuần) hoặc savefig=dict(fname="...", dpi=300) trong mplfinance.

8. Biểu đồ nến và biểu đồ đường khác nhau gì?

Nến hiển thị đầy đủ Open/High/Low/Close + màu tăng/giảm → giàu thông tin hơn. Đường (line) chỉ nối các giá đóng → gọn nhưng mất chi tiết.

9. Tôi có cần biết matplotlib trước không?

Không bắt buộc — mplfinance gói gọn hầu hết công việc. Nhưng nắm cơ bản matplotlib (figure, axes, savefig) giúp bạn tùy biến tốt hơn nhiều.

10. Học tiếp theo từ đây?

Sau khi vẽ được biểu đồ nến + SMA, hãy thử: thêm chỉ báo RSI (đã học khái niệm), tự vẽ đường equity sau backtest, hoặc xây bot đọc tín hiệu SMA cắt nhau. Tất cả đều có trong chuỗi Python 365.


11. Kết luận

Hôm nay (Ngày 63) bạn đã học kỹ năng nền tảng của phân tích kỹ thuật bằng Python:

  • Cài đặt và phân biệt matplotlib với mplfinance.
  • Hiểu cấu trúc một cây nến Nhật: Open, High, Low, Close.
  • Lấy dữ liệu giá từ Binance public API không cần API key.
  • Vẽ biểu đồ nến + đường SMA 7/25 + khối lượng.
  • Tùy chỉnh màu sắc, kích thước, style.
  • Xuất file PNG sạch đẹp cho báo cáo.
  • Vẽ nến bằng matplotlib thuần để hiểu bản chất.

Chỉ với ~30 dòng Python, bạn đã có một biểu đồ nến chuẩn trader — từ dữ liệu thô đến hình ảnh trực quan sẵn sàng trình bày. Toàn bộ quy trình gồm 4 bước rõ ràng: lấy dữ liệu → làm sạch → tính chỉ báo → vẽ và xuất file. Bạn có thể áp dụng đúng quy trình này cho bất kỳ tài sản nào chỉ bằng cách đổi symbolinterval trong URL.

Từ hôm nay, mỗi khi phân tích bất kỳ tài sản nào (coin, vàng, chứng khoán), bạn có thể vẽ biểu đồ nến trong 5 giây. Đây chính là nền tảng để bước sang các bài tiếp theo: phát hiện tín hiệu giao dịch tự động, backtest chiến lược, và xây bot cảnh báo giá — tất cả đều cần kỹ năng vẽ và đọc biểu đồ hôm nay.

🚀 Hãy tự luyện tập: đổi interval sang 15m, đổi màu nến, thêm SMA 50, rồi xuất ra file và gửi cho bạn bè xem. Comment từ khóa CHART dưới video để nhận template code của bài học này nhé!

Ngày mai — Ngày 64: Chúng ta sẽ tiếp tục với chủ đề liên quan trực tiếp: phát hiện tín hiệu giao dịch bằng Python — cách đọc biểu đồ nến + SMA để tự động nhận biết xu hướng tăng/giảm. Đừng bỏ lỡ!

?s=120&d=mm&r=g

Hướng Nghiệp Dữ Liệu
8 Bài viết
15.4k Người theo dõi
120k+ Lượt đọc