# 5.2.2. Beta

Mục đích: Dùng để tính **rolling beta** giữa một chuỗi giá (hoặc lợi suất) và một chỉ số tham chiếu (benchmark), thường dùng để đo **mức độ nhạy cảm (rủi ro hệ thống)** của một cổ phiếu so với thị trường chung.

Cấu trúc hàm: beta(x, b, w=, prices=True)

Tham số:

<table><thead><tr><th width="82">Tham số</th><th width="174">Kiểu dữ liệu</th><th>Ý nghĩa</th></tr></thead><tbody><tr><td>x</td><td>Series</td><td>Chuỗi giá hoặc lợi suất của tài sản cần phân tích (ví dụ: cổ phiếu)</td></tr><tr><td>b</td><td>Series</td><td>Chuỗi giá hoặc lợi suất của benchmark (ví dụ: VNINDEX)</td></tr><tr><td>w</td><td>Window, int hoặc str</td><td>Kích thước cửa sổ rolling, ví dụ <code>Window(22, 10)</code> hoặc <code>'1m'</code>, <code>'1d'</code></td></tr><tr><td>prices</td><td>bool</td><td>Nếu <code>True</code>, <code>x</code> và <code>b</code> là chuỗi <strong>giá</strong>, sẽ được nội suy thành <strong>lợi suất</strong>; nếu <code>False</code>, bạn đã đưa vào lợi suất sẵn</td></tr></tbody></table>

Kiểu dữ liệu trả về: Trả về `Series` với chỉ số thời gian chứa giá trị beta được tính theo từng rolling window.

Công thức:

* Giả sử:
  * $$X\_t$$ và $$b\_t$$ là giá tài sản và benchmark tại thời điểm t
  * Tính lợi suất đơn giản:

$$
R\_t = \frac{X\_t}{X\_t - 1} - 1
$$

$$
S\_t = \frac{b\_t}{b\_t - 1} - 1
$$

* Thì:

$$
\beta\_{t} = \frac{Cov(R\_t, S\_t)}{Var(S\_t)}
$$

* Với mỗi cửa sổ `w`, beta được tính bằng **covariance giữa R và S chia cho variance của S**.

Hàm này thường được dùng để:

* Phân tích độ nhạy của cổ phiếu so với chỉ số thị trường (ví dụ: HPG so với VNINDEX)
* Phục vụ mô hình hóa rủi ro, CAPM, Alpha/Beta analysis

Lưu ý:

* Nếu bạn truyền vào chuỗi giá thì nhớ để `prices=True` để FiinQuant tự tính return.
* Nếu bạn đã tự tính return trước, hãy để `prices=False` để tránh tính toán sai.
* Đảm bảo `x` và `b` phải khớp thời gian (`index` phải trùng).

Ví dụ mẫu tính rolling beta trong vòng 22 ngày gần nhất từ 03/06/2025 - 25/06/2025 của HPG so với VNINDEX trên tập dữ liệu 1 năm từ 25/05/2024 - 25/06/2025:

```python
import pandas as pd
from FiinQuantX import FiinSession
from FiinQuantX.timeseries.econometrics import beta
from FiinQuantX.timeseries.helper import Window
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 và VNINDEX
data = client.Fetch_Trading_Data(
    realtime=False,
    tickers=["HPG","VNINDEX"],
    fields=["close"],
    adjusted=True,
    by="1d",
    from_date=(datetime.now() - relativedelta(years=1)).strftime("%Y-%m-%d")
).get_data()

# Pivot theo ticker để tách riêng từng mã
data_pivot = data.pivot(index="timestamp", columns="ticker", values="close")

# Lấy Series
hpg_series = data_pivot["HPG"]
vnindex_series = data_pivot["VNINDEX"]

# Tính rolling beta 22 ngày
rolling_beta = beta(hpg_series, vnindex_series, w=Window(22), prices=True)

# Ghép 3 series vào thành 1 dataframe
df_hpg = hpg_series.rename("HPG").reset_index().rename(columns={"index": "timestamp"})
df_hsg = vnindex_series.rename("VNINDEX").reset_index().rename(columns={"index": "timestamp"})
df_corr = rolling_beta.rename("rolling_beta").reset_index().rename(columns={"index": "timestamp"})

df_merged = pd.merge(df_hpg, df_hsg, on="timestamp", how="outer")
df_merged = pd.merge(df_merged, df_corr, on="timestamp", how="outer")

df_merged = df_merged.sort_values("timestamp").reset_index(drop=True)
print(df_merged)
```

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

<pre><code><strong>     timestamp         HPG      VNINDEX  rolling_beta
</strong>0    2024-06-25 00:00  28700.0  1256.56           NaN
1    2024-06-26 00:00  28900.0  1261.24           NaN
2    2024-06-27 00:00  28850.0  1259.09           NaN
3    2024-06-28 00:00  28300.0  1245.32           NaN
4    2024-07-01 00:00  28350.0  1254.56           NaN
..                ...      ...      ...           ...
244  2025-06-18 00:00  27150.0  1346.83      0.189324
245  2025-06-19 00:00  26900.0  1352.04      0.220260
246  2025-06-20 00:00  27000.0  1349.35      0.211598
247  2025-06-23 00:00  26850.0  1358.18      0.136014
248  2025-06-24 00:00  27000.0  1366.77      0.142753
</code></pre>

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

```python
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Chuẩn hóa giá trị
df_merged['timestamp'] = pd.to_datetime(df_merged['timestamp'])
df_merged['HPG_norm'] = (df_merged['HPG'] - df_merged['HPG'].min()) / (df_merged['HPG'].max() - df_merged['HPG'].min())
df_merged['VNINDEX_norm'] = (df_merged['VNINDEX'] - df_merged['VNINDEX'].min()) / (df_merged['VNINDEX'].max() - df_merged['VNINDEX'].min())

fig, ax1 = plt.subplots(figsize=(14, 6))

# Trục y bên trái: giá HPG và VNINDEX
ax1.plot(df_merged['timestamp'], df_merged['HPG_norm'], label='HPG (normalized)', color='blue')
ax1.plot(df_merged['timestamp'], df_merged['VNINDEX_norm'], label='VNINDEX (normalized)', color='green', linestyle='--')
ax1.set_ylabel('Normalized Price', color='black')
ax1.legend(loc='upper left')
ax1.grid(True)

# Format x-axis
ax1.xaxis.set_major_locator(mdates.AutoDateLocator())
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
fig.autofmt_xdate(rotation=45)  # Rotate labels for readability

# Trục y bên phải: rolling beta
ax2 = ax1.twinx()
ax2.plot(df_merged['timestamp'], df_merged['rolling_beta'], label='Rolling Beta', color='red', alpha=0.6)
ax2.set_ylabel('Rolling Beta', color='red')
ax2.legend(loc='upper right')

plt.title('Diễn biến HPG, VNINDEX và Rolling Beta theo thời gian')
plt.tight_layout()
plt.show()
```

<figure><img src="https://3318188420-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fkme4XYjWbuM3iRJzUu9r%2Fuploads%2FQGtyK8UYzob9douOV9Yv%2Fimage.png?alt=media&#x26;token=7edc8c75-da68-454a-9fd5-cb327655bea7" alt=""><figcaption></figcaption></figure>
