• Thứ Ba, 05/09/2006 07:18 (GMT+7)

    Dự báo giá cả chứng khoán

    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

    ID: A0608_123