DHDataHọc
Lý thuyếtBài 7/86 phút đọc+10 XP

Dự báo dòng tiền

Bạn sẽ học được

  • Vì sao dự báo dòng tiền phải theo tuần, không theo tháng.
  • Dựng bảng dự báo 13 tuần từ các khoản đã biết.
  • Mô hình hoá thời điểm thu tiền từ phải thu.
  • Đặt ngưỡng tiền mặt an toàn và phát hiện thiếu hụt sớm.
  • Chạy kịch bản cơ sở và kịch bản xấu.

Khái niệm cốt lõi

Báo cáo tháng cho biết đã xảy ra gì. Dự báo tuần cho biết tuần nào sắp hết tiền.

Vì sao theo tuần:

  • Lương trả một ngày cố định, thường chiếm phần lớn chi phí.
  • Nhà cung cấp có điều khoản 30/45/60 ngày, dồn vào vài tuần.
  • Thuế và bảo hiểm có hạn cố định.
  • Một tháng có lãi vẫn có thể âm tiền ở tuần thứ hai.

Mười ba tuần là một quý — đủ xa để hành động, đủ gần để số liệu còn đáng tin.

Cấu trúc bảng dự báo

code
Số dư đầu kỳ
+ Tiền thu từ phải thu cũ
+ Tiền thu từ doanh thu mới
− Lương và bảo hiểm
− Nhà cung cấp
− Thuê và tiện ích
− Thuế
− Trả nợ và lãi
= Số dư cuối kỳ

Chỉ tính dòng tiền thực. Không đưa doanh thu ghi nhận, khấu hao hay các khoản chưa chắc chắn vào.

Ví dụ bốn tuần đầu

Đơn vị: triệu đồng. Số dư đầu kỳ 500. Ngưỡng an toàn 100.

TuầnThuLươngNhà cung cấpThuêThuếTrả nợRòngSố dư
11802001203000−170330
215001400600−50280
3220210100000−90190
4160013000100−70120
5210220110000−1200

Tuần 5 chạm 0 — công ty không trả được lương nếu không làm gì. Nhưng nếu chỉ nhìn báo cáo tháng, tháng đó có thể vẫn có lãi.

Hành động có thể làm từ tuần 1, khi số dư còn 330: đẩy nhanh thu hồi, dời lịch nhà cung cấp, hoặc chuẩn bị hạn mức tín dụng.

Ước tính thời điểm thu tiền

Không phải hóa đơn nào cũng thu đúng hạn. Dùng đường cong thu tiền từ dữ liệu lịch sử:

Thời điểmTỷ lệ thu được
Đúng hạn60%
Chậm 30 ngày25%
Chậm 60 ngày10%
Không thu được5%

Với 1.000 triệu phải thu trong tháng:

  • 600 triệu vào tuần đến hạn.
  • 250 triệu vào khoảng 30 ngày sau.
  • 100 triệu vào khoảng 60 ngày sau.
  • 50 triệu dự phòng mất.

Dùng tỷ lệ của chính công ty. Nếu tỷ lệ thu đúng hạn đang giảm, dự báo phải phản ánh điều đó, không dùng con số cũ.

Truy vấn dựng bảng 13 tuần

code
WITH tuan AS (
  SELECT generate_series(
    date_trunc('week', CURRENT_DATE),
    date_trunc('week', CURRENT_DATE) + INTERVAL '12 weeks',
    INTERVAL '1 week'
  )::date AS tuan
),
vao AS (
  SELECT date_trunc('week', expected_date)::date AS tuan,
         SUM(amount) AS tien_vao
  FROM expected_collections
  GROUP BY 1
),
ra AS (
  SELECT date_trunc('week', due_date)::date AS tuan,
         SUM(amount) AS tien_ra
  FROM expected_payments
  GROUP BY 1
)
SELECT
  t.tuan,
  COALESCE(v.tien_vao, 0) AS tien_vao,
  COALESCE(r.tien_ra, 0) AS tien_ra,
  COALESCE(v.tien_vao, 0) - COALESCE(r.tien_ra, 0) AS rong,
  SUM(COALESCE(v.tien_vao, 0) - COALESCE(r.tien_ra, 0))
    OVER (ORDER BY t.tuan) + 500000000 AS so_du_cuoi_tuan
FROM tuan t
LEFT JOIN vao v USING (tuan)
LEFT JOIN ra r USING (tuan)
ORDER BY t.tuan;

Điểm quan trọng: generate_series tạo đủ 13 tuần kể cả tuần không có giao dịch. Nếu chỉ lấy từ bảng dự báo, các tuần trống sẽ biến mất và số dư cuối kỳ bị tính sai.

SUM(...) OVER (ORDER BY tuan) là tổng luỹ kế — chính là số dư cuối tuần khi cộng số dư đầu kỳ.

Ngưỡng an toàn và cờ thiếu hụt

code
WITH du_bao AS ( /* truy vấn trên */ )
SELECT
  tuan,
  so_du_cuoi_tuan,
  CASE
    WHEN so_du_cuoi_tuan < 0 THEN 'thieu_tien'
    WHEN so_du_cuoi_tuan < 100000000 THEN 'duoi_nguong'
    ELSE 'ok'
  END AS trang_thai
FROM du_bao
ORDER BY tuan;

Ngưỡng an toàn không phải 0. Đó là mức tiền tối thiểu để trả lương và các khoản bắt buộc trong hai tuần, cộng biên an toàn. Với công ty nhỏ, ngưỡng thường bằng một đến hai tháng chi phí cố định.

Kịch bản

Chạy ít nhất hai kịch bản:

Cơ sở: doanh thu theo kế hoạch, thu tiền theo đường cong lịch sử.

Xấu: doanh thu giảm 20%, thu tiền chậm thêm 15 ngày, không cắt chi phí.

code
Kịch bản xấu thường cho thấy thiếu tiền sớm hơn 3–5 tuần so với cơ sở.

Nếu kịch bản xấu cho thấy thiếu tiền trong 8 tuần tới, cần hành động ngay: cắt chi phí không bắt buộc, đàm phán giãn nợ, đẩy nhanh thu hồi, hoặc chuẩn bị vay.

Cập nhật hằng tuần

Dự báo chỉ có giá trị khi được cập nhật:

  • Thay số dư đầu kỳ bằng số thực.
  • Điều chỉnh các khoản thu đã trễ.
  • Thêm hợp đồng mới đã ký.
  • Xem lại tuần gần nhất có đúng dự báo không.

Sai số dự báo tuần gần nhất là tín hiệu tốt nhất cho biết mô hình có đáng tin hay không.

Lỗi thường gặp

  • Dự báo theo tháng: bỏ qua đỉnh chi theo tuần.
  • Dùng doanh thu thay tiền thu: số dư bị thổi phồng.
  • Giả định thu đúng hạn 100%: kịch bản đẹp không tưởng.
  • Bỏ tuần không giao dịch: số dư luỹ kế sai.
  • Không có ngưỡng an toàn: chỉ phát hiện khi đã âm.
  • Chỉ chạy một kịch bản: không chuẩn bị cho biến động.
  • Không cập nhật: dự báo tháng trước dùng cho tháng này.
  • Trộn dồn tích và tiền mặt: hai cơ sở khác nhau.

Thực hành

  1. Dựng bảng bốn tuần từ số liệu ví dụ và xác định tuần thiếu tiền.
  2. Áp đường cong thu tiền cho 1.000 triệu phải thu.
  3. Viết truy vấn 13 tuần với generate_series.
  4. Thêm cờ trạng thái theo ngưỡng 100 triệu.
  5. Chạy kịch bản xấu với doanh thu giảm 20%.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Hết tiền bất ngờDự báo theo thángChuyển sang tuần
Số dư dự báo quá caoDùng doanh thuDùng tiền thu thực
Thiếu tuần trong bảngKhông sinh đủ tuầngenerate_series
Không thấy rủi roChỉ một kịch bảnChạy kịch bản xấu
Dự báo lệch xaKhông cập nhậtCập nhật hằng tuần
Không kịp xoayKhông có ngưỡng an toànĐặt ngưỡng và cờ

Tóm tắt

  • Dự báo theo tuần vì chi tiêu dồn vào các tuần cụ thể.
  • 13 tuần là khung phù hợp cho một quý.
  • Ước tính thu tiền bằng đường cong lịch sử, không giả định đúng hạn.
  • Luôn sinh đủ tuần và tính số dư luỹ kế.
  • Đặt ngưỡng an toàn và chạy ít nhất hai kịch bản.

Dùng ← → để chuyển bài