5.1.1. Annualize

Mục đích: chuyển đổi chuỗi thời gian các giá trị (ví dụ: lợi suất) thành giá trị thường niên (annualized), dựa trên tần suất quan sát trong chuỗi thời gian đó.

Cấu trúc hàm: annualize(x)

Trong đó:

  • x: Series — chuỗi thời gian (TimeSeries - Series có index là dạng datetime) các giá trị như lợi suất, biến động (volatility), hoặc bất kỳ số liệu nào cần annualize.

  • Return: Series — chuỗi thời gian đã được annualize.

Cơ chế:

  • Tự động ước lượng tần suất mẫu (sample frequency) của chuỗi x, ví dụ: hàng ngày, hàng tuần, hàng tháng,...

  • Sau đó tính hệ số annualization phù hợp và áp dụng công thức:

Yt=Xt.FY_t = X_t . \sqrt{F}
  • Trong đó:

    • YtY_t là giá trị thường niên tại thời điểm 𝑡

    • XtX_t là giá trị gốc tại thời điểm 𝑡

    • F là hệ số annualization (Annualization Factor)

Bảng hệ số annualization

Kỳ quan sát
Hệ số annualization (F)

Daily (hàng ngày)

252

Weekly (hàng tuần)

52

Bi-Weekly

26

Monthly (hàng tháng)

12

Quarterly (quý)

4

Annually (năm)

1

Hàm này thường được dùng khi bạn có chuỗi thời gian là returns hoặc volatility, và bạn muốn:

  • So sánh lợi suất thường niên giữa các cổ phiếu

  • Tính độ biến động thường niên (annualized volatility)

  • Chuẩn hóa dữ liệu để đưa vào mô hình tài chính

Nếu returns(prices) là chuỗi lợi suất hàng ngày, thì annualized_returns sẽ là lợi suất thường niên.

Lưu ý:

  • Hàm annualize() sử dụng phương pháp nhận diện tự động tần suất dữ liệu (bằng cách đo khoảng cách giữa các timestamp) — bạn không cần cung cấp thông tin này.

  • Trong thực tế, công thức annualization được dùng phổ biến nhất để annualize volatility (vì bản chất biến động cần được chuẩn hóa theo thời gian).

Ví dụ mẫu tính annualize return và annualize volatility của mã cổ phiếu HPG trong vòng 1 năm từ 24/06/2024 - 24/06/2025:

import pandas as pd

from FiinQuantX import FiinSession
from FiinQuantX.timeseries.econometrics import annualize
from datetime import datetime
from dateutil.relativedelta import relativedelta

username = "REPLACE_WITH_YOUR_USERNAME"
password = "REPLACE_WITH_YOUR_PASSWORD"

client = FiinSession(
    username=username,
    password=password
).login()

# Lấy dữ liệu giá đóng cửa 1 năm EOD của HPG
data = client.Fetch_Trading_Data(
    realtime=False,
    tickers="HPG",
    fields=["close"],
    adjusted=True,
    by="1d",
    from_date=(datetime.now() - relativedelta(years=1)).strftime("%Y-%m-%d")
).get_data()

# tính daily return
data["daily_return"] = data["close"] / data["close"].shift(1) - 1

# Đưa timestamp về dạng index để dùng trong hàm annyalize
data["timestamp"] = pd.to_datetime(data["timestamp"])
data.set_index("timestamp", inplace=True)

# Tính annualize returns
data["annualized_return"] = annualize(data["daily_return"])
print(data)

Kết quả trả ra (code chạy tại ngày 25/06/2025)

 timestamp  ticker    close  daily_return  annualized_return
 2024-06-25 HPG       28700.0         NaN                NaN
 2024-06-26 HPG       28900.0    0.006969           0.110624
 2024-06-27 HPG       28850.0   -0.001730          -0.027465
 2024-06-28 HPG       28300.0   -0.019064          -0.302634
 2024-07-01 HPG       28350.0    0.001767           0.028047
 ...        ...           ...         ...                ...
 2025-06-18 HPG       27150.0    0.011173           0.177369
 2025-06-19 HPG       26900.0   -0.009208          -0.146174
 2025-06-20 HPG       27000.0    0.003717           0.059013
 2025-06-23 HPG       26850.0   -0.005556          -0.088192
 2025-06-24 HPG       27000.0    0.005587           0.088684

Biểu đồ minh họa (tuỳ chọn)

import matplotlib.pyplot as plt

data = data.reset_index()
fig, ax1 = plt.subplots(figsize=(12, 6))

ax2 = ax1.twinx()
ax1.plot(data['timestamp'], data['close'], 'b-', label='Close Price')
ax2.plot(data['timestamp'], data['annualized_return'], 'g-', label='Annualized Return')

ax1.set_xlabel('Ngày')
ax1.set_ylabel('Giá đóng cửa (VND)', color='b')
ax2.set_ylabel('Lợi suất năm hoá (%)', color='g')
plt.title('Giá đóng cửa (VND) & Lợi suất năm hoá (%) của HPG của HPG')
plt.grid(True)
plt.show()

Last updated