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:
Trong đó:
là giá trị thường niên tại thời điểm 𝑡
là giá trị gốc tại thời điểm 𝑡
F là hệ số annualization (Annualization Factor)
Bảng hệ số annualization
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áctimestamp) — 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.088684Biể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