2009-02-07 17:51:04艾倫 Programer

用亂數隨機產生模擬期貨行情

本文的重點在於幫助交易員用亂數隨機產生模擬期貨行情, 我們會介紹一個期貨亂數函數 FutureNewPrice(), 版主使用的範例程式語言是 VB.NET 2005, 當然啦, 大家可以改寫在自己熟悉的平台 !

首先, 我們先拉四個 TextBox 來代表初始價, 上次價, 最新價和種類, 以及按下 Button 就啟動 Timer, 每次觸發 Timer 的時候, 就會呼叫 FutureNewPrice() 來產生新的期貨行情, 並會在視窗畫面上看到最新價一直在跳動 !

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    TextBox2.Text = TextBox3.Text
    If IsNumeric(TextBox2.Text) = True Then
        TextBox3.Text = FutureNewPrice(CDbl(TextBox2.Text), 0.5, Timer1.Interval / 1000, TextBox4.Text)
    Else
        TextBox3.Text = FutureNewPrice(CDbl(TextBox1.Text), 0.5, Timer1.Interval / 1000, TextBox4.Text)
    End If
End Sub

當每次呼叫 Timer1_Tick() 時, 我們會更新上次價, 然後把上次價再帶入 FutureNewPrice(), 以便得到新一次的行情, 接著我們來看一下 FutureNewPrice() 函數做了哪些事情 !

Private Function FutureNewPrice(ByVal dLastPrice As Double, ByVal dVol As Double, ByVal dDeltaT As Double, ByVal strGoodCode As String) As Double
    '參數說明:
    'dLastPrice: 上次價格
    'dVol: 波動率
    'dDeltaT: 時間間隔,單位為秒
    'strGoodCode: 商品代碼
    Try
        dDeltaT /= 252 * 300 * 60
        Dim dEpsilon As Double = -6
        Dim i As Integer
        Dim rnd As New Random
        For i = 1 To 12
            dEpsilon += rnd.NextDouble
        Next
        Dim dReturn As Double = 0
        dReturn = CDbl(dLastPrice * Math.Exp(dVol * dEpsilon * Math.Sqrt(dDeltaT)))
        Select Case strGoodCode
            Case "TX", "FITX"
                Dim dTick As Double = 1
                dReturn = dTick * Math.Round(dReturn / dTick)
            Case "TE", "FITE"
                Dim dTick As Double = 0.05
                dReturn = dTick * Math.Round(dReturn / dTick)
            Case "TF", "FITF"
                Dim dTick As Double = 0.2
                dReturn = dTick * Math.Round(dReturn / dTick)
        End Select
        Return dReturn
    Catch ex As Exception
        MessageBox.Show(ex.ToString, "Error Message - FutureNewPrice()", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Function

再者, 說明一下為何需要傳入【種類】或說是【商品代碼】呢 ? 主要是亂數產生後是 Double 資料型態, 可能並不會符合實際商品的價位(或說最小升降單位), 必需要修正才合理, 舉例來說, TX 代表【台指期貨】, TE 代表【電子期貨】, TF 代表【金融期貨】, 其他商品大家可以參考期交所公佈的商品網頁 !

期交所商品網頁 http://www.taifex.com.tw/chinese/home.htm

當然啦, 我們為何要辛苦產生模擬期貨行情呢 ? 這當然是用來測試自己開發的期貨程式啦, 如果有自己 DIY 的期貨程式, 但又不是很確定邏輯一定 OK 時, 就可以利用模擬期貨行情來驗證程式運作是否正確啦 !

VB.NET 2005 範例下載 http://cat.hfu.edu.tw/~m9025004/download/FutureNewPrice.zip