8.4. Volume Indicators (Chỉ báo khối lượng)

8.4.1. MFI (Money Flow Index)

MFI là chỉ số phản ánh sức mạnh dòng tiền của một cổ phiếu trong một khoản thời gian nhất định, được phân tích dựa vào khối lượng giao dịch. Khoảng thời gian được xem xét theo ngày, tuần tháng, và thường tính toán theo giá trị 14 giai đoạn.

def mfi(high: pandas.core.series.Series, low: pandas.core.series.Series, close: pandas.core.series.Series, volume: pandas.core.series.Series, window: int = 14)

Tham số

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

high

Cột dữ liệu chứa các giá trị cột giá cao nhất để tính toán MFI.

pandas.Series

low

Cột dữ liệu chứa các giá trị cột giá thấp nhất để tính toán MFI.

pandas.Series

close

Cột dữ liệu chứa các giá trị cột giá đóng cửa để tính toán MFI.

pandas.Series

volume

Cột dữ liệu chứa các giá trị cột khối lượng giao dịch để tính toán MFI.

pandas.Series

window

Số lượng điểm dữ liệu sử dụng trong phép tính MFI.

int

14

Ví dụ:

fi = client.FiinIndicator()
df['mfi'] = fi.mfi(df['high'], df['low'], df['close'], df['volume'], window=14)
print(df)

8.4.2. OBV (On Balance Volume)

OBV là chỉ báo khối lượng có chức năng đo lường khối lượng giao dịch tích lũy qua các phiên, từ đó cho thấy cổ phiếu đang có xu hướng được mua hay bán. Nếu phiên hôm nay là một phiên tăng giá thì khối lượng sẽ được cộng thêm vào chỉ số OBV. Ngược lại, khối lượng sẽ được trừ ra khi hôm nay là một phiên giao dịch giảm điểm.

def obv(column: pandas.core.series.Series, volume: pandas.core.series.Series)

Tham số

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

column

Cột dữ liệu (series) chứa các giá trị về giá để tính toán OBV.

pandas.Series

volume

Cột dữ liệu chứa các giá trị cột khối lượng giao dịch để tính toán OBV.

pandas.Series

Ví dụ:

fi = client.FiinIndicator()
df['obv'] = fi.obv(df['close'], df['volume'])
print(df)

8.4.3. VWAP (Volume Weighted Adjusted Price)

VWAP là giá trung bình theo trọng số khối lượng, giá trung bình của một cổ phiếu tính theo tổng khối lượng giao dịch. VWAP được sử dụng để tính giá trung bình của một cổ phiếu trong một khoảng thời gian.

Giá bình quân gia quyền theo khối lượng giúp so sánh giá hiện tại của cổ phiếu với giá chuẩn, giúp nhà đầu tư dễ dàng quyết định thời điểm tham gia và thoát khỏi thị trường. Ngoài ra, VWAP có thể hỗ trợ các nhà đầu tư xác định cách đầu tư của họ đối với một cổ phiếu và thực hiện chiến lược giao dịch phù hợp vào đúng thời điểm.

def vwap(high: pandas.core.series.Series, low: pandas.core.series.Series, close: pandas.core.series.Series, volume: pandas.core.series.Series, window: int = 14)

Tham số:

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

high

Cột dữ liệu chứa các giá trị cột giá cao nhất để tính toán VWAP.

pandas.Series

low

Cột dữ liệu chứa các giá trị cột giá thấp nhất để tính toán VWAP.

pandas.Series

close

Cột dữ liệu chứa các giá trị cột giá đóng cửa để tính toán VWAP.

pandas.Series

volume

Cột dữ liệu chứa các giá trị cột khối lượng giao dịch để tính toán VWAP.

pandas.Series

window

Số lượng điểm dữ liệu sử dụng trong phép tính VWAP.

int

14

Ví dụ:

fi = client.FiinIndicator()
df['vwap'] = fi.vwap(df['high'], df['low'], df['close'], df['volume'], window=14)
print(df)

8.4.4. Volume Profile

Volume Profile là công cụ phân tích kỹ thuật hiển thị phân bố khối lượng giao dịch tại các mức giá khác nhau trong một giai đoạn cụ thể.

Chỉ báo giúp nhà đầu tư nhận biết các vùng giá có khối lượng giao dịch lớn (vùng giá quan trọng, hỗ trợ/kháng cự) và vùng giá ít quan tâm trên biểu đồ.

def VolumeProfile(close: pandas.Series, volume: pandas.Series, high: pandas.Series = None, low: pandas.Series = None, bins: int = 20, use_typical: bool = False)

Tham số:

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

close

Cột giá đóng cửa dùng để xác định mức giá giao dịch.

pandas.Series

volume

Cột khối lượng giao dịch tương ứng với từng mức giá.

pandas.Series

high

Cột giá cao nhất (sử dụng khi dùng Typical Price).

pandas.Series

low

Cột giá thấp nhất (sử dụng khi dùng Typical Price).

pandas.Series

bins

Số lượng khoảng giá để chia biểu đồ Volume Profile.

int

20

use_typical

Nếu True, dùng giá Typical = (High + Low + Close)/3 thay cho Close.

bool

False

Ví dụ:

fi = client.FiinIndicator()
vp = VolumeProfile(close=data["close"], volume=data["volume"], high=data["high"], low=data["low"], bins=20, use_typical=True)
print(vp.sort_values("volume", ascending=False))

8.4.5. Accumulation Distribution Line (Chaikin)

Accumulation/Distribution Line (A/D Line), hay còn gọi là Đường Tích lũy/Phân phối, là một chỉ báo kỹ thuật dựa trên khối lượng được phát triển bởi Marc Chaikin.

Chỉ báo này đo lường dòng chảy tiền tệ (Money Flow) vào hay ra khỏi một tài sản bằng cách so sánh giá đóng cửa của một kỳ so với phạm vi giá của kỳ đó, sau đó nhân với khối lượng giao dịch. Nó dựa trên nguyên tắc: khối lượng đi trước giá.

def adl(high: pandas.Series, low: pandas.Series, close: pandas.Series, volume: pandas.Series)

Tham số:

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

high

Cột giá cao nhất của mỗi phiên.

pandas.Series

low

Cột giá thấp nhất của mỗi phiên.

pandas.Series

close

Cột giá đóng cửa, dùng để xác định vị trí giá trong phiên.

pandas.Series

volume

Cột khối lượng giao dịch trong mỗi phiên.

pandas.Series

Ví dụ:

fi = client.FiinIndicator()
df['adl'] = fi.adl(df["high"], df["low"], df["close"], df["volume"])
print(df)

8.4.6. Price Volume Trend

Price Volume Trend (PVT), hay còn gọi là Xu hướng Giá Khối lượng, là một chỉ báo phân tích kỹ thuật dựa trên khối lượng. Nó được thiết kế để đo lường áp lực mua và bán bằng cách kết hợp cả sự thay đổi giákhối lượng giao dịch.

PVT là một chỉ báo tích lũy (cumulative), tương tự như On-Balance Volume (OBV), nhưng nó được xem là chính xác hơn OBV vì nó điều chỉnh khối lượng được cộng hoặc trừ vào tổng tích lũy dựa trên phần trăm thay đổi của giá.

def pvt(close: pandas.Series, volume: pandas.Series)

Tham số:

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

close

Cột giá đóng cửa của mỗi phiên.

pandas.Series

volume

Cột khối lượng giao dịch tương ứng.

pandas.Series

Ví dụ:

fi = client.FiinIndicator()
df['pvt'] = fi.pvt(df["close"], df["volume"])
print(vp.sort_values("volume", ascending=False))

8.4.7. Point of Control (POC)

Point of Control (PoC), hay còn gọi là Điểm Kiểm soát không phải là một chỉ báo độc lập mà là một thành phần quan trọng trong chỉ báo Hồ sơ Khối lượng (Volume Profile). Chỉ báo này đề cập đến mức giá phổ biến nhất, nơi khối lượng giao dịch cao nhất diễn ra trong một khung thời gian cụ thể. Chỉ báo này được phát triển lần đầu tiên bởi Peter Steidlmayer, cựu nhà giao dịch hàng hóa và thành viên của Sàn Giao dịch Chicago (CBOT).

def poc(close: pd.Series, volume: pd.Series, high: pd.Series = None, low: pd.Series = None, bins: int = 20, use_typical: bool = False) -> pd.DataFrame: ...

Tham số:

Tên tham số
Mô tả
Kiểu dữ liệu
Giá trị mặc định

close

Cột giá đóng cửa dùng để xác định mức giá giao dịch.

pandas.Series

volume

Cột khối lượng giao dịch tương ứng với từng mức giá.

pandas.Series

high

Cột giá cao nhất (sử dụng khi dùng Typical Price).

pandas.Series

low

Cột giá thấp nhất (sử dụng khi dùng Typical Price).

pandas.Series

bins

Số lượng khoảng giá để chia biểu đồ Volume Profile.

int

20

use_typical

Nếu True, dùng giá Typical = (High + Low + Close)/3 thay cho Close.

bool

False

Ví dụ:

fi = client.FiinIndicator()
data[["poc_lower_price", "poc_upper_price", "poc_volume"]] = fi.poc(data["close"], data["volume"], data["high"], data["low"], bins=20, use_typical=True)
print(data)

Dữ liệu trả ra gồm 3 cột:

  • poc_lower_price và poc_upper_price mang ý nghĩa là 2 đầu của khoảng giá được giao dịch nhiều nhất (VD: Tính từ ngày 2025-07-01 đến 2025-11-19, khoảng giá có khối lượng giao dịch nhiều nhất của mã MWG là từ 69113.075 đến 70218.87, tương tứng poc_lower_price = 69113.075 và poc_upper_price = 70218.87)

  • poc_volume: Khối lượng giao dịch của khoảng giá được giao dịch nhiều nhất tương ứng

Lưu ý:

  • Các tham số close, volume, high, low là những pandas.Series phải đảm bảo có độ dài bằng nhau, tính tuần tự về thời gian là như nhau.

  • Các tham số close, volume, high, low là những pandas.Series cũng cần đẩm bảo có tính tuần tự tăng dần theo chiều từ trên xuống dưới để đảm bảo số liệu trả ra được đúng đắn và có ý nghĩa.

  • Các trường "poc_lower_price", "poc_upper_price", "poc_volume" được trả ra cho mỗi dòng tương ứng với số liệu được tính rolling cho khoảng thời gian từ dòng đầu đến dòng được tính, vì vậy mặc định với tham số bins truyền vào là bao nhiêu thì bấy nhiêu dòng đầu của các pandas.Series truyền vào sẽ không có dữ liệu vì phải đảm bảo có đủ số bins dữ liệu mới chia ra được từng đấy khoảng giá. Do vậy nếu bạn muốn tính được đầy đủ số liệu kể trong khoảng thời gian mong muốn cần truyền vào thừa ra để đảm bảo có đầy đủ số liệu.

Last updated