http://www.pcworld.com.vn/pcworld/magazine_a.asp?t=mzdetail&atcl_id=5f5e5d5e565a56
Người chơi chứng khoán luôn muốn dự báo giá cả chứng khoán trong tương lai, với xác suất là bao nhiêu thì giá cổ phiếu sẽ tăng với mức XXX %. Cũng có nhu cầu tương tự đối với tỷ giá USD, EURO hay giá của mặt hàng nào đó. Nói chung là dự báo xu hướng của giá và khả năng (xác suất) của từng xu hướng. Bạn có thể sử dụng trực giác hoặc kinh nghiệm để phán đoán tuy nhiên để lượng hoá một cách cụ thể và có cơ sở khoa học bạn cần lập cơ sở dữ liệu và hàm tính toán, ở đây tôi đề xuất dùng MS Excel vì phần mềm này có các hàm tính xác suất và thống kê rất tuyệt.
PHƯƠNG PHÁP LUẬN
Cơ sở phương pháp luận ở đây chính là lý thuyết về quá trình Wiener được trình bày trong cuốn “Nguyên lý tài chính kế toán của thị trường chứng khoán” (NXB Chính trị Quốc gia, năm 2000) của tác giả Vương Hoàng Quân và Ngô Phương Chí.
Giả sử giá cả tuân theo quy luật chuẩn thì vận động của nó theo thời gian là một quá trình Wiener bao gồm 2 thành phần: một thành phần theo quán tính và một thành phần ngẫu nhiên. Đặc điểm của thành phần ngẫu nhiên, gọi là z, là mỗi khi nó chuyển động tới một giá trị nhất định nó sẽ còn quay trở lại giá trị đó nhiều lần trong bất kỳ một khoảng thời gian xác lập nào.
Sự vận động của giá theo quá trình Wiener trong khoảng thời gian T được biểu diễn bằng công thức sau:
|
St
|
|
|
Giá ở thời gian t
|
|
|
So
|
|
|
Giá ở thời gian o
|
|
|
μ
|
|
|
Trung bình của “naturelogarithm” (Ln) trong khoảng thời gian T
|
|
|
σ
|
|
|
Phương sai của “naturelogarithm” (Ln) trong khoảng thời gian T
|
|
|
z
|
|
|
Đại lượng ngẫu nhiên
|
|
Giá cả kỳ vọng sau thời gian T là:
Phương sai của giá cả sau thời gian T là:
a) Xu hướng tăng giá (St>Y)
Ta muốn xác định xác suất để bất đẳng thức St>Y luôn đúng
(N là viết tắt của hàm phân bổ xác suất luỹ kế chuẩn hoá)
Để xác định kỳ vọng giá cổ phiếu với điều kiện ràng buộc là giá cổ phiếu St>Y. Trước hết định nghĩa đại lượng q như sau:
mà St>Y
nên
Tức là
b) Xu hướng giảm giá (St
Lập luận tương tự:
Với
TẠO HÀM
a) Dữ liệu
Bạn tạo 1 cơ sở dữ liệu gồm 4 trường như trong hình, từ A2:D11.
• Trường thứ nhất là mô tả các mốc thời gian mà tại đó thông tin giá cả được thu thập, sắp xếp theo thứ tự tăng dần, mức tăng (timeStep) là như nhau.
• Trường thứ hai là giá cả theo từng mốc thời gian. Nếu các mốc thời gian không tăng theo quy luật timeStep thì bạn phải nội suy để đảm bảo tính chính xác.
• Trường thứ ba là giá cả tại mốc thời gian sau chia cho giá cả mốc trước, ví dụ C3=B3/B2
• Trường thứ tư là naturelogarithm của trường thứ ba
(Dữ liệu càng chi tiết thì dự báo càng chính xác)
b) Các hàm
Bạn tạo một module trong một workbook rồi nhập tại mục khai báo:
Option Explicit
Const exp = 2.71828182845904
Sau đó bạn tạo các hàm sau:
1. Function NotConsistentTimeStep(ByRef timeRange As Range, timeStep As Long) As Boolean
Hàm này để kiểm tra các mốc thời gian có tăng theo quy luật timeStep không, tham số mRange chính là cơ sở dữ liệu của chúng ta từ A2:D11, tham số timeStep là mức tăng của các mốc thời gian.
Public Function NotConsistentTimeStep (ByRef timeRange As Range, timeStep As Long) As Boolean
On Error GoTo loi:
Dim i As Long
For i = 2 To timeRange.Rows.Count
If timeRange.Cells(i, 1).Value – timeRange.Cells(i – 1, 1).Value <> timeStep Then
NotConsistentTimeStep = True
Exit Function
End If
Next i
NotConsistentTimeStep = False
Exit Function
loi:
NotConsistentTimeStep = True
End Function
2. Function ProbaLow (mRange As Range, X_val As Double, forcast As Long, timeStep As Long) As Double
Hàm này trả về xác suất với điều kiện giá cả sau forcast ngày nữa kể từ mốc thời gian cuối cùng sẽ nhỏ hơn X_val. Trở về -3 nếu mRange có số cột khác 4; -2 nếu forcast <=0; -1 nếu các mốc thời gian tăng không theo quy luật timeStep.
Public Function ProbaLow(mRange As Range, X_val As Double, forcast As Long, timeStep As Long) As Double
Dim ln_ave As Double Trung binh cua cot ln(Pt/Pt-1)
Dim ln_std As Double do lech chuan cua cot ln(Pt/Pt-1)
Dim t_Range As Range tham chieu toi CSDL thoi gian
Dim ln_Range As Range tham chieu cot CSDL ln(Pt/Pt-1)
Dim t_forcast As Double Quy doi forcast theo chieu dai cua cot thoi gian
Dim So As Double Gia ca tai moc thoi gian cuoi cung
Dim a As Double Tinh trung gian
Dim ret As Double Gia tri tro ve cua ham
If mRange.Columns.Count <> 4 Then
ProbaLow = -3
Exit Function
End If
If forcast <= 0 Then
ProbaLow = -2
Exit Function
End If
Dim mRow As Long
mRow = mRange.Rows.Count
Set t_Range = mRange.Range(Cells(1, 1), Cells(mRow, 1))
If NotConsistentTimeStep(t_Range, timeStep) Then
ProbaLow = -1
Exit Function
End If
Set ln_Range = mRange.Range(Cells(2, 4), Cells(mRow, 4))
So = mRange.Cells(mRow, 2).Value
ln_ave = Application.WorksheetFunction.Average(ln_Range)
ln_std = Application.WorksheetFunction.StDev(ln_Range)
t_forcast = forcast / (t_Range.Cells(mRow, 1).Value – t_Range.Cells(1, 1).Value)
a = -(Application.WorksheetFunction.Ln(So / X_val) + ln_ave * t_forcast) / ln_std * t_forcast ^ (1 / 2)
ret = Application.WorksheetFunction.NormSDist(a)
ProbaLow = ret
End Function
3.Function AverageLow(mRange As Range, X_val As Double, forcast As Long, timeStep As Long) As Double
Hàm này trả về trung bình của giá với điều kiện giá cả sau forcast ngày nữa kể từ mốc thời gian cuối cùng sẽ nhỏ hơn X_val. Trở về -3 nếu mRange có số cột khác 4; -2 nếu forcast <=0; -1 nếu các mốc thời gian tăng không theo quy luật timeStep.
Public Function AverageLow(mRange As Range, X_val As Double, forcast As Long, timeStep As Long) As Double
Dim ln_ave As Double Trung binh cua cot ln(Pt/Pt-1)
Dim ln_std As Double do lech chuan cua cot ln(Pt/Pt-1)
Dim t_Range As Range tham chieu toi CSDL thoi gian
Dim ln_Range As Range tham chieu cot CSDL ln(Pt/Pt-1)
Dim t_forcast As Double Quy doi forcast theo chieu dai cua cot thoi gian
Dim So As Double Gia ca tai ngay cuoi cung tai Cot thoi gian
Dim a As Double Gia tri tro ve cua ham
Dim ret As Double
If mRange.Columns.Count <> 4 Then
AverageLow = -3
Exit Function
End If
If forcast <= 0 Then
AverageLow = -2
Exit Function
End If
Dim mRow As Long
mRow = mRange.Rows.Count
Set t_Range = mRange.Range(Cells(1, 1), Cells(mRow, 1))
If NotConsistentTimeStep(t_Range, timeStep) Then
AverageLow = -1
Exit Function
End If
Set ln_Range = mRange.Range(Cells(2, 4), Cells(mRow, 4))
So = mRange.Cells(mRow, 2).Value
ln_ave = Application.WorksheetFunction.Average(ln_Range)
ln_std = Application.WorksheetFunction.StDev(ln_Range)
t_forcast = forcast / (t_Range.Cells(mRow, 1).Value – t_Range.Cells(1, 1).Value)
a = ((Application.WorksheetFunction.Ln(So / X_val) + ln_ave * t_forcast) / ln_std * t_forcast ^ (1 / 2)) + ln_std * t_forcast ^ (1 / 2)
ret = So * exp ^ (t_forcast * (ln_ave + (ln_std ^ 2) / 2))
ret = ret * (1 – Application.WorksheetFunction.NormSDist(a))
ret = ret / Application.WorksheetFunction.NormSDist(-a + ln_std * t_forcast ^ (1 / 2))
AverageLow = ret
End Function
4. Function ProbaHight(mRange As Range, Y_val As Double, forcast As Long, timeStep As Long) As Double
Hàm này trả về xác suất với điều kiện giá cả sau forcast ngày nữa kể từ mốc thời gian cuối cùng sẽ lớn hơn Y_val. Trở về -3 nếu mRange có số cột khác 4;-2 nếu forcast <=0; -1 nếu các mốc thời gian tăng không theo quy luật timeStep.
Public Function ProbaHight(mRange As Range, Y_val As Double, forcast As Long, timeStep As Long) As Double
Dim ln_ave As Double Trung binh cua cot ln(Pt/Pt-1)
Dim ln_std As Double do lech chuan cua cot ln(Pt/Pt-1)
Dim t_Range As Range tham chieu toi CSDL thoi gian
Dim ln_Range As Range tham chieu cot CSDL ln(Pt/Pt-1)
Dim t_forcast As Double Quy doi forcast theo chieu dai cua cot thoi gian
Dim So As Double Gia ca tai ngay cuoi cung tai Cot thoi gian
Dim a As Double
Dim ret As Double
If mRange.Columns.Count <> 4 Then
ProbaHight = -3
Exit Function
End If
If forcast <= 0 Then
ProbaHight = -2
Exit Function
End If
Dim mRow As Long
mRow = mRange.Rows.Count
Set t_Range = mRange.Range(Cells(1, 1), Cells(mRow, 1))
If NotConsistentTimeStep(t_Range, timeStep) Then
ProbaHight = -1
Exit Function
End If
Set ln_Range = mRange.Range(Cells(2, 4), Cells(mRow, 4))
So = mRange.Cells(mRow, 2).Value
ln_ave = Application.WorksheetFunction.Average(ln_Range)
ln_std = Application.WorksheetFunction.StDev(ln_Range)
t_forcast = forcast / (t_Range.Cells(mRow, 1).Value – t_Range.Cells(1, 1).Value)
a = -(Application.WorksheetFunction.Ln(So / Y_val) + ln_ave * t_forcast) / ln_std * t_forcast ^ (1 / 2)
ret = 1 – Application.WorksheetFunction.NormSDist(a)
ProbaHight = ret
End Function
5. Function AverageHight(mRange As Range, Y_val As Double, forcast As Long, timeStep As Long) As Double
Hàm này trả về trung bình của giá với điều kiện giá cả sau forcast ngày nữa kể từ mốc thời gian cuối cùng sẽ lớn hơn Y_val. Trở về -3 nếu mRange có số cột khác 4; -2 nếu forcast <=0; -1 nếu các mốc thời gian tăng không theo quy luật timeStep.
Public Function AverageHight(mRange As Range, Y_val As Double, forcast As Long, timeStep As Long) As Double
Dim ln_ave As Double Trung binh cua cot ln(Pt/Pt-1)
Dim ln_std As Double do lech chuan cua cot ln(Pt/Pt-1)
Dim t_Range As Range tham chieu toi CSDL thoi gian
Dim ln_Range As Range
Dim t_forcast As Double
Dim So As Double
Dim a As Double
Dim ret As Double
If mRange.Columns.Count <> 4 Then
AverageHight = -3
Exit Function
End If
If forcast <= 0 Then
AverageHight = -2
Exit Function
End If
Dim mRow As Long
mRow = mRange.Rows.Count
Set t_Range = mRange.Range(Cells(1, 1), Cells(mRow, 1))
If NotConsistentTimeStep(t_Range, timeStep) Then
AverageHight = -1
Exit Function
End If
Set ln_Range = mRange.Range(Cells(2, 4), Cells(mRow, 4))
So = mRange.Cells(mRow, 2).Value
ln_ave = Application.WorksheetFunction.Average(ln_Range)
ln_std = Application.WorksheetFunction.StDev(ln_Range)
t_forcast = forcast / (t_Range.Cells(mRow, 1).Value – t_Range.Cells(1, 1).Value)
a = ((Application.WorksheetFunction.Ln(So / Y_val) + ln_ave * t_forcast) / ln_std * t_forcast ^ (1 / 2)) + ln_std * t_forcast ^ (1 / 2)
ret = So * exp ^ (t_forcast * (ln_ave + (ln_std ^ 2) / 2))
ret = ret * Application.WorksheetFunction.NormSDist(a)
ret = ret / (1 – Application.WorksheetFunction.NormSDist(-a + ln_std * t_forcast ^ (1 / 2)))
AverageHight = ret
End Function
6. Function AverageValue(mRange As Range, forcast As Long, timeStep As Long) As Double
Hàm này trả về trung bình của giá sau forcast ngày nữa kể từ mốc thời gian cuối cùng. Trở về -3 nếu mRange có số cột khác 4;-2 nếu forcast <=0-1 nếu các mốc thời gian tăng không theo quy luật timeStep.
Public Function AverageValue(mRange As Range, forcast As Long, timeStep As Long) As Double
Dim ln_ave As Double
Dim ln_std As Double
Dim t_Range As Range
Dim ln_Range As Range
Dim t_forcast As Double
Dim So As Double
Dim a As Double
Dim ret As Double
If mRange.Columns.Count <> 4 Then
AverageValue = -3
Exit Function
End If
If forcast <= 0 Then
AverageValue = -2
Exit Function
End If
Dim mRow As Long
mRow = mRange.Rows.Count
Set t_Range = mRange.Range(Cells(1, 1), Cells(mRow, 1))
If NotConsistentTimeStep(t_Range, timeStep) Then
AverageValue = -1
Exit Function
End If
Set ln_Range = mRange.Range(Cells(2, 4), Cells(mRow, 4))
So = mRange.Cells(mRow, 2).Value
ln_ave = Application.WorksheetFunction.Average(ln_Range)
ln_std = Application.WorksheetFunction.StDev(ln_Range)
t_forcast = forcast / (t_Range.Cells(mRow, 1).Value – t_Range.Cells(1, 1).Value)
ret = So * exp ^ (t_forcast * (ln_ave + (ln_std ^ 2) / 2))
AverageValue = ret
End Function
7. Function StDevValue(mRange As Range, forcast As Long, timeStep As Long) As Double
Hàm này trả về độ lệch chuẩn của giá sau forcast ngày nữa kể từ mốc thời gian cuối cùng. Trở về -3 nếu mRange có số cột khác 4;-2 nếu forcast <=0; -1 nếu trường thời gian tăng không theo quy luật timeStep.
Public Function StDevValue(mRange As Range, forcast As Long, timeStep As Long) As Double
Dim ln_ave As Double
Dim ln_std As Double
Dim t_Range As Range
Dim ln_Range As Range
Dim t_forcast As Double
Dim So As Double
Dim a As Double
Dim ret As Double Tro ve phuong sai
If mRange.Columns.Count <> 4 Then
StDevValue = -3
Exit Function
End If
If forcast <= 0 Then
StDevValue = -2
Exit Function
End If
Dim mRow As Long
mRow = mRange.Rows.Count
Set t_Range = mRange.Range(Cells(1, 1), Cells(mRow, 1))
If NotConsistentTimeStep(t_Range, timeStep) Then
StDevValue = -1
Exit Function
End If
Set ln_Range = mRange.Range(Cells(2, 4), Cells(mRow, 4))
So = mRange.Cells(mRow, 2).Value
ln_ave = Application.WorksheetFunction.Average(ln_Range)
ln_std = Application.WorksheetFunction.StDev(ln_Range)
t_forcast = forcast / (t_Range.Cells(mRow, 1).Value – t_Range.Cells(1, 1).Value)
ret = So * exp ^ (2 * t_forcast * (ln_ave + (ln_std ^ 2) / 2))
ret = ret * exp ^ (t_forcast * ln_std ^ 2)
StDevValue = ret ^ (1 / 2)
End Function
Sử dụng
Trong ví dụ minh hoạ có cơ sở dữ liệu từ A2:D11, tham số forcast tại ô D12 là 120, tham số timeStep tại ô D13 là 30 thì sau 120 ngày kể từ ngày 29/08/05 (ô A11):
• Giá trị trung bình của giá tại ô D14 có công thức =AverageValue($A$2:$D$11;$D$12;$D$13)
• Độ lệch chuẩn của giá tại ô D15 có công thức =StDevValue(A2:D11;D12;D13)
• Dự đoán cho mức giá 12.100 như tại ô A18:
- Công thức xác suất P(Pt<12.100) tại B18 =ProbaLow($A$2:$D$11;A18;$D$12;$D$13);
- Công thức trung bình E(Pt |Pt<12.100) tại C18 =AverageLow($A$2:$D$11;A18;$D$12;$D$13)
- Công thức xác suất P(Pt>12.100) tại D18 =ProbaHight($A$2:$D$11;A18;$D$12;$D$13)
- Công thức trung bình E(Pt |Pt>12.100) tại E18 =AverageHight($A$2:$D$11;A18;$D$12;$D$13).
• Dự đoán cho xác suất mức giá trong khoảng X1 và X0 được tính là
P(Xo
X1)
Ví dụ với Xo=12.100 tại ô A18 và X1=12.200 tại ô A19 thì P(12.100
<12.200) là=”1-ProbaLow(A2:D11;A18;D12;D13)-ProbaHight(A2:D11;A19;D12;D13)
• Dự đoán cho trung bình mức giá trong khoảng X1 và X0 được tính là
E(Xo
X1)*P(Pt>X1))] / P(Xo
Ví dụ với Xo=12.100 tại ô A18 và X1=12.200 tại ô A19 thì E(12.100
<12.200) là=”(AverageValue(A2:D11;D12;D13)-AverageLow(A2:D11;A18;D12;D13)*ProbaLow(A2:D11;A18;D12;D13)-AverageHight(A2:D11;A19;D12;D13)*ProbaHight(A2:D11;A19;D12;D13))/F19
Lưu ý:
Khi dự đoán giá cả trung bình (kỳ vọng) với các điều kiện giá cả lớn hơn hay nhỏ hơn hoặc trong khoảng nào đó thì các mức này nên trong khoảng trung bình của giá cả (toàn cục) 2 lần độ lệch chuẩn của giá cả.
Nguyễn Văn Thắng
Công ty Kiểm Toán Quốc Tế Việt Nam
E-mail: thang_via@yahoo.com