| New Version 5.0! |
|
Try it for free with our fully functional
60-day trial version.
Download now!
|
QuickStart Samples
Variable Transformations QuickStart Sample (Visual Basic)
Illustrates how to perform a range of transformations on statistical data in Visual Basic.
C# code
F# code
IronPython code
Back to QuickStart Samples
Imports System.Data
Imports System.Data.OleDb
Imports Extreme.Statistics
Imports Extreme.Statistics.TimeSeriesAnalysis
Namespace Extreme.Numerics.QuickStart.VB
' Illustrates various kinds of transformations of numerical variables
' by showing how to compute several financial indicators.
Module VariableTransforms
Sub Main()
' We use a TimeSeriesCollection to load the data.
Dim seriesTable As DataTable = LoadTimeSeriesData()
Dim timeSeries As TimeSeriesCollection = New TimeSeriesCollection(seriesTable)
Dim open As NumericalVariable = CType(timeSeries("Open"), NumericalVariable)
Dim close As NumericalVariable = CType(timeSeries("Close"), NumericalVariable)
Dim high As NumericalVariable = CType(timeSeries("High"), NumericalVariable)
Dim low As NumericalVariable = CType(timeSeries("Low"), NumericalVariable)
Dim volume As NumericalVariable = CType(timeSeries("Volume"), NumericalVariable)
'
' Arithmetic operations
'
' The NumericalVariable class defines the standard
' arithmetic operators. Operands can be either
' numerical variables or constants.
' The Typical Price (TP) is the average of the day's high, low and close:
Dim TP As NumericalVariable = NumericalVariable.Divide( _
NumericalVariable.Add(NumericalVariable.Add(high, low), close), 3.0)
' Exponentiation is available through the Power method:
Dim inverseVolume As NumericalVariable = NumericalVariable.Power(volume, -1)
'
' Simple transformations
'
' The Transforms property of a numerical variable gives access
' to a large number of transformations.
' The GetLag method returns a variable whose observations
' are moved ahead by the specified amount:
Dim close1 As NumericalVariable = close.Transforms.GetLag(1)
' You can get cumulative sums and products:
Dim cumVolume As NumericalVariable = volume.Transforms.GetCumulativeSum()
'
' Indicators of change
'
' You can get the absolute change, percent change,
' or (exponential) growth rate of a variable. The optional
' parameter is the number of periods to go back.
' The default is 1.
Dim closeChange As NumericalVariable = close.Transforms.GetChange(10)
' You can extrapolate the change to a longer number of periods.
' The additional argument is the number of large periods.
Dim monthyChange As NumericalVariable = close.Transforms.GetExtrapolatedChange(10, 20)
'
' Moving averages
'
' You can get simple, exponential, and weighted moving averages.
Dim MA20 As NumericalVariable = close.Transforms.GetMovingAverage(20)
' Weighted moving averages can use either a fixed array or vector
' to specify the weight. The weights are automatically normalized.
Dim weights As Double() = {1.0, 2.0, 3.0}
Dim WMA3 As NumericalVariable = close.Transforms.GetWeightedMovingAverage(weights)
' You can also specify another variable for the weights.
' In this case, the corresponding observations are used.
' For example, to obtain the volume weighted average
' of the close price over a 14 day period, you can write:
Dim VWA14 As NumericalVariable = close.Transforms.GetWeightedMovingAverage(14, volume)
' Other statistics, such as maximum, minimum and standard
' deviation are also available.
'
' Misc. transforms
'
' The Box-Cox transform is often used to reduce the effects
' of non-normality of a variable. It takes one parameter,
' which must be between 0 and 1.
Dim bcVolume As NumericalVariable = volume.Transforms.GetBoxCoxTransform(0.4)
'
' Creating more complicated indicators
'
' All these transformations can be combined to create
' more compicated transformations. We give some examples
' of common Technical Analysis indicators.
' The Accumulation Distribution is a leading indicator of price movements.
' It is used in many other indicators.
' The formula uses only arithmetic operations:
Dim AD As NumericalVariable = NumericalVariable.Multiply( _
NumericalVariable.Divide( _
NumericalVariable.Subtract(close, open), _
NumericalVariable.Subtract(high, low)), _
volume)
' The Chaikin oscillator is used to monitor the flow of money into
' and out of a market. It is the difference between a 3 day and a 10 day
' moving average of the Accumulation Distribution.
' We use the GetExponentialMovingAverage method for this purpose.
Dim CO As NumericalVariable = NumericalVariable.Subtract( _
AD.Transforms.GetExponentialMovingAverage(3), _
AD.Transforms.GetExponentialMovingAverage(10))
' Bollinger bands provide an envelope around the price that indicates
' whether the current price level is relatively high or low.
' It uses a 20 day simple average as a central line:
Dim TPMA20 As NumericalVariable = TP.Transforms.GetMovingAverage(20)
' The actual bands are at 2 standard deviations (over the same period)
' from the central line. We have to pass the moving average
' over the same period as the second parameter.
Dim SD20 As NumericalVariable = _
TP.Transforms.GetMovingStandardDeviation(20, TPMA20)
Dim BOLU As NumericalVariable = NumericalVariable.Add(MA20, _
NumericalVariable.Multiply(2, SD20))
Dim BOLD As NumericalVariable = NumericalVariable.Subtract(MA20, _
NumericalVariable.Multiply(2, SD20))
' The Relative Strength Index is an index that compares
' the average price gain to the average loss.
' The GetPositiveToNegativeIndex method performs this
' calculation in one operation. The first argument is the period.
' The second argument is the variable that determines
' if an observation counts towards the plus or the minus side.
Dim change As NumericalVariable = close.Transforms.GetChange(1)
Dim RSI As NumericalVariable = change.Transforms.GetPositiveToNegativeIndex(14, change)
' Finally, let's print some of our results:
Dim index As Integer = timeSeries.GetRowIndex(New DateTime(2002, 9, 17))
Console.WriteLine("Data for September 17, 2002:")
Console.WriteLine("Acumulation Distribution (in millions): {0:F2}", AD(index) / 1000000)
Console.WriteLine("Chaikin Oscillator (in millions): {0:F2}", CO(index) / 1000000)
Console.WriteLine("Bollinger Band (Upper): {0:F2}", BOLU(index))
Console.WriteLine("Bollinger Band (Central): {0:F2}", TPMA20(index))
Console.WriteLine("Bollinger Band (Lower): {0:F2}", BOLD(index))
Console.WriteLine("Relative Strength Index: {0:F2}", RSI(index))
Console.WriteLine("Press Enter key to continue.")
Console.ReadLine()
End Sub
Private Function LoadTimeSeriesData() As DataTable
Dim filename As String = "..\..\..\Data\MicrosoftStock.xls"
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
Dim cnn As OleDbConnection = Nothing
Dim ds As DataSet = New DataSet
Try
cnn = New OleDbConnection(connectionString)
cnn.Open()
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter("Select * from [MicrosoftStock$]", cnn)
adapter.Fill(ds)
Catch ex As OleDbException
Console.WriteLine(ex.InnerException)
Finally
If Not (cnn Is Nothing) Then
cnn.Close()
End If
end try
Return ds.Tables(0)
End Function
End Module
End Namespace
Copyright © 2003-2013, Extreme Optimization. All rights reserved.
Extreme Optimization, Complexity made simple, M#, and M Sharp are trademarks of ExoAnalytics Inc.
Microsoft, Visual C#, Visual Basic, Visual Studio, Visual Studio.NET, and the Optimized for Visual Studio logo
are registered trademarks of Microsoft Corporation.