1. Rolling average là gì?
Rolling Average, hay trung bình động, là một phương pháp tính trung bình của một tập hợp giá trị trong một khoảng thời gian nhất định, sau đó di chuyển khoảng thời gian để lấy giá trị trung bình mới. Kỹ thuật này thường được sử dụng trong phân tích chuỗi thời gian, nhưng nó cũng phự hợp để đánh giá xu hướng trong các tình huống kinh doanh khác. Rolling Average sẽ sử dụng một phần nhỏ của dữ liệu trong một khoảng thời gian xác định (7 ngày, 10 ngày, 30 ngày, …) và tính giá trị trung bình của dữ liệu trong khoảng thời gian này. Sau đó, các mốc thời gian sẽ tiếp tục di chuyển, tạo ra khoảng thời gian mới và Rolling Average cũng sẽ được thay đổi dựa trên các mốc thời gian mới.
Ứng dụng thực tế:
- Phân tích xu hướng: Nhận biết xu hướng trong dữ liệu thời gian, như doanh số bán hàng hoặc giá cổ phiếu. Rolling Average cũng chính là một chỉ báo quan trọng trong phân tích kỹ thuật chứng khoán.
- Loại bỏ nhiễu và các biến động ngẫu nhiên để nhìn rõ xu hướng chính.
- Hỗ trợ dự báo: Cung cấp thông tin làm cơ sở cho dự báo kinh doanh trong tương lai.
2. Cách tính Rolling Average trong Power BI
Công thức chung:
Về công thức chung, chỉ số Rolling Average có thể được tính như sau:
Trong đó:
- Sum of data overtime: Tổng giá trị dữ liệu trong kỳ hạn yêu cầu
- Time period: Kỳ hạn yêu cầu
Hiện tại, Power BI chưa hỗ trợ tính Rolling Average bằng hàm có sẵn. Tuy nhiên, chúng ta có thể sử dụng hàm DAX kết hợp hàm Time Intelligence để thực hiện.
Công thức cơ bản có thể viết dưới dạng:
Rolling Average =
AVERAGEX(
DATESINPERIOD(
‘Table'[Date],
MAX(‘Table'[Date]),
-[Window Size], DAY –Window Size là kỳ hạn tính trung bình (theo ngày) (ví dụ: 10, 50, …)
),
‘Table'[Value]
)
Công thức trên là sự kết hợp giữa các hàm:
- DATESINPERIOD: Trả về danh sách ngày trong khoảng thời gian được xác định tính từ ngày gần nhất. Có 3 đối số cần lưu ý trong hàm này:
- Start date: Ngày bắt đầu
- Interval: Khoảng thời gian (có thể tịnh tiến lên (+) hoặc lùi xuống (-))
- Unit: Đơn vị thời gian (ngày/tháng/quý/năm)
- AVERAGEX: Tính trung bình giá trị trong danh sách ngày được trả về.
3. Ví dụ minh họa với dữ liệu giá cổ phiếu
Giới thiệu dữ liệu
Bộ dữ liệu về mã cổ phiếu MSN từ khi bắt đầu được niêm yết trên sàn chứng khoán đến tháng 6 năm 2024, tên bảng là “MSN_Price”, bao gồm các cột:
- Date: Ngày giao dịch
- Close: Giá đóng cửa của ngày giao dịch
- Open: Giá mở cửa của ngày giao dịch
- High: Giá cao nhất trong ngày giao dịch
- Low: Giá thấp nhất trong ngày giao dịch
- Volume: Khối lượng giao dịch
Các bước tính Rolling Average cụ thể
Trong ví dụ này, mình sẽ triển khai cách tính Rolling Average dưới dạng một Calculation Group (nhóm tính toán) trong Power BI.
- Bước 1: Tạo Calculation Group
- Vào phần Model View trong Power BI Desktop, chọn new Calculation Group, đặt tên là “Rolling Average”
- Bước 2: Tạo các Calculation Items để tính Rolling Average
- Trên thanh Data ở góc phải màn hình, mở rộng mục Calculation Group và click chuột phải vào mục Calculation Items, chọn “New calculation item” để tạo mới. Ở đây, mình sẽ ví dụ cho các trường hợp tính rolling average cho 50 ngày, 100 ngày và 200 ngày – những mốc thời gian phổ biến trong việc theo dõi giá cổ phiếu.
-
- Tính Rolling Average cho kỳ hạn 50 ngày:
Rolling Avg 50D =
VAR NumOfDays = 50
VAR LastCurrentDate =
MAX(‘MSN_Price'[Date])
VAR Period =
DATESINPERIOD(‘MSN_Price'[Date], LastCurrentDate, -NumOfDays, DAY)
VAR Result =
CALCULATE(
AVERAGEX(
VALUES(‘MSN_Price'[Date]),
[Close Price]
),
Period
)
VAR FirstDateInPeriod = MINX(Period, ‘MSN_Price'[Date])
VAR LastDateWithClose = MAX(‘MSN_Price'[Date])
RETURN
IF(FirstDateInPeriod <= LastDateWithClose, Result)
Trong công thức trên, mình đã tạo ra các biến tạm thời để phục vụ cho việc tính toán:
Biến NumOfDays: Đại diện cho kỳ hạn Rolling Average, trong trường hợp này là 50 ngày. Có thể thay đổi giá trị gán cho biến này để phục vụ cho các trường hợp kỳ hạn khác.
Biến LastCurrentDate: Sử dụng hàm MAX để lấy ngày giao dịch gần nhất trong bảng dữ liệu giao dịch cổ phiếu mà ta có.
Biến Period: Hàm DATESINPERIOD tạo ra danh sách các ngày trong khoảng thời gian 50 ngày trước [LastCurrentDate].
Biến Result: Kết hợp giữa CALCULATE và AVERAGEX để tính trung bình giá đóng cửa (Close) trong các khoảng thời gian (Period).
Biến FirstDateInPeriod: Lấy ngày đầu tiên trong danh sách các ngày.
Biến LastDateWithClose: Lấy ngày gần nhất có giá đóng cửa trong bộ dữ liệu. Ngoài ra, sử dụng thêm IF để đảm bảo chỉ trả về kết quả nếu toàn bộ khoảng thời gian nằm trong dữ liệu có giá trị.
-
- Làm tương tự cho các Calculation Items khác tương ứng với các kỳ hạn khác, chỉ cần thay tên Calculation Item và giá trị của biến NumOfDays.
- Ngoài ra, chúng ta cũng cần tạo thêm một Calculation Item mặc định để biểu diễn cho giá trị mặc định của trường dữ liệu Close price.
Close price = SELECTEDMEASURE()
Bước 3: Áp dụng vào báo cáo
- Ta sẽ cần tạo một measure cho Close Price để hiển thị được giá trị trong các biểu đồ trên báo cáo:
Close Price =
CALCULATE(SUM(MSN_Price[Close]))
- Ví dụ, ta sẽ tạo một bảng Matrix. Kéo cột “Date” từ bảng “MSN_Price” vào phần Rows, kéo measure “Close Price” vừa tạo ở trên vào phần Values và kéo Calculation group column vào phần Columns. Khi đó, ta sẽ được bảng thể hiện các giá trị Close Price, Rolling Average 50 ngày, Rolling Average 100 ngày và Rolling 200 ngày theo từng ngày giao dịch.
- Ta cũng có thể thử trực quan hóa bằng biểu đồ đường (line chart), kết hợp thêm với việc kéo Calculation Group Column vào Slicer, cho phép người dùng chọn các giá trị mà họ muốn hiển thị trên biểu đồ để dễ dàng quan sát hơn.
Chọn các giá trị Close Price, Rolling Average 200 ngày và Rolling Average 50 ngày
4. Ưu điểm và nhược điểm trong cách tính này
Ưu điểm
- Độ chính xác cao: Phương pháp tính Rolling Average bằng DAX trong Power BI sử dụng các hàm mạnh mẽ như DATESINPERIOD và AVERAGEX, đảm bảo kết quả chính xác cho các phân tích dữ liệu thời gian.
- Linh hoạt: Dễ dàng tùy chỉnh khoảng thời gian mà bạn mong muốn như 7 ngày, 30 ngày, 12 tháng, …, đáp ứng nhiều yêu cầu phân tích và không cần viết lại công thức nhiều lần.
- Khả năng trực quan hóa: Khi tích hợp với các biểu đồ Power BI, Rolling Average giúp người dùng dễ dàng nhận biết xu hướng và đưa ra các quyết định dựa trên dữ liệu.
- Tối ưu hoá hiệu suất báo cáo: Các Calculation Groups trong Power BI cho phép sử dụng lại công thức tính toán, giúp giảm thiểu thời gian xử lý và cải thiện hiệu suất.
Nhược điểm
- Phức tạp với dữ liệu không đồng đều: Nếu dữ liệu có khoảng thời gian trống hoặc giá trị bị thiếu, Rolling Average có thể không phản ánh chính xác xu hướng.
- Khó mở rộng với logic phức tạp: Nếu cần thêm các điều kiện bổ sung (ví dụ: chỉ tính trung bình cho ngày làm việc), công thức sẽ trở nên phức tạp và khó bảo trì.
- Hiệu suất giảm với dữ liệu lớn: Khi làm việc với dữ liệu có hàng triệu dòng hoặc nhiều Calculation Items, thời gian xử lý sẽ tăng đáng kể.
5. Mở rộng
Tuy nhiên, DATESINPERIOD hoạt động mặc định ở cấp độ ngày, vì vậy nó phù hợp nhất với các kỳ hạn được định nghĩa rõ ràng trong đơn vị mà Power BI hỗ trợ (ngày, tháng, quý, năm). Khi cần tính toán Rolling Average dựa trên các tuần hoặc khoảng thời gian không chuẩn khác, DATESINPERIOD không đáp ứng được và đòi hỏi một phương pháp phức tạp hơn.
Để tính Rolling Average theo số tuần cụ thể, bạn cần sử dụng các cột bổ sung trong bảng thời gian (Date) và áp dụng phương pháp dựa trên các mẫu tính toán tuần.
- Thêm cột tuần trong bảng Date: Đầu tiên, bảng thời gian cần một cột đại diện cho số tuần hoặc định danh tuần (Week Number, Week Start Date). Điều này giúp bạn nhóm và lọc dữ liệu theo các tuần cụ thể.
- Áp dụng phương pháp lọc theo tuần: Thay vì dùng DATESINPERIOD, bạn có thể sử dụng các cột bổ sung này để xác định khoảng thời gian mong muốn.
Khi tính Rolling Average theo tháng, bạn có thể tìm hiểu các phương pháp tối ưu hơn thay vì sử dụng DATESINPERIOD. Các phương pháp này tận dụng hàm CALCULATE và các bộ lọc theo tháng trong bảng thời gian.
Ngoài ra, nếu kỳ hạn không cố định theo ngày, tháng, hoặc tuần mà phụ thuộc vào các yếu tố kinh doanh cụ thể, bạn cần thêm logic lọc dữ liệu vào công thức DAX hoặc sử dụng script Python/R để xử lý trước dữ liệu.
6. Kết luận
Rolling Average là một công cụ quan trọng trong phân tích dữ liệu chuỗi thời gian, giúp loại bỏ biến động ngắn hạn và nhấn mạnh các xu hướng dài hạn, từ đó hỗ trợ các quyết định chiến lược dựa trên dữ liệu. Trong Power BI, việc tính Rolling Average trở nên linh hoạt và hiệu quả nhờ vào các hàm DAX mạnh mẽ như DATESINPERIOD và AVERAGEX, kết hợp với khả năng trực quan hóa và tùy chỉnh đa dạng.
Phương pháp này không chỉ phù hợp cho các kỳ hạn tiêu chuẩn như ngày, tháng, quý hay năm, mà còn có thể được mở rộng cho các tình huống đặc biệt như tính theo ngày làm việc, áp dụng trọng số, hoặc xử lý dữ liệu không đồng đều. Tuy nhiên, để tận dụng tối đa sức mạnh của Rolling Average, bạn cần hiểu rõ dữ liệu nguồn, thiết kế bảng thời gian phù hợp, và áp dụng các công thức DAX một cách chính xác.
Power BI không chỉ dừng lại ở các tính toán cơ bản mà còn mở ra khả năng tích hợp với Python, R, hay các công cụ bổ trợ khác để xử lý các kịch bản phức tạp hơn. Điều này giúp bạn không chỉ tạo ra các báo cáo chính xác mà còn cung cấp cái nhìn sâu sắc về xu hướng và hiệu suất, từ đó nâng cao giá trị dữ liệu và tối ưu hóa hiệu quả kinh doanh.