[C#] 老古董的 Microsoft Chart Controls 也可以進行數據預測

我要先聲明,這篇文章介紹到的內容雖說不是不能用,但玩樂成分居多,大家看看就好,不要太認真。

1. Microsoft Chart Controls 中的 FinancialFormula

在上一篇文章 使用 Math.Net 進行曲線擬合和數據預測 中,我介紹了如何使用 Math.Net ,這篇文章玩玩「新」花樣,用古老的 Microsoft Chart Controls 實現相同的功能。

A long time ago in a galaxy far, far away… 微軟推出了一套免費又強大的圖表控件,它用於 WinForms 和 WebForms 中,可輕鬆套用各種功能強大的 2D、3D、實時變化的動態圖表,頭髮比較少的 .NET 開發者或多或少都接觸過這套圖表控件。雖然現在看來多少有些落後了,但它還是很有用啊,而且還不收錢。

那麼,在哪裡可以找到這個圖表庫呢?現在微軟的官網也只能找到 for Microsoft .NET Framework 3.5 的下載,找不到更新的版本。幸好 Visual Studio 里就自帶了這個圖標庫,可以直接添加 System.Windows.Forms.DataVisualization 的引用:

這篇我不會介紹如何做圖表,而是講講這個圖標庫中的一樣很有趣的東西:FinancialFormula。如果只是做簡單的財務數據處理,可以用它玩玩。當圖表中已有其它序列(Series)的數據,DataManipulator 的 FinancialFormula 可以使用大部分常見的金融公式處理這些數據併產生新的數據序列。

例指,數移動平均線 (Exponential Moving Average) 是對一段時間內的數據計算所得的平均值,它的輸入和輸出如下:

蔡金震蕩 (Chaikin Oscillator) 指標是指應用於聚散的 3 天指數移動平均線與 10 天指數移動平均線之差,它的輸出如下:

FinancialFormula 還有很多其它用法,具體可以參考以下兩個頁面:

FinancialFormula Enum (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs

Using Financial Formulas

2. 數據預測

這次我用到的是預測 (Forecasting) ,它是指使用歷史觀測值來預測未來值。

Forecasting公式採用四個可選參數:

  • RegressionType: 回歸類型。使用一個數字來指示特定次數的多元回歸,或者使用以下值之一指定不同的回歸類型:Linear、Exponential、Logarithmic、Power。默認值為 2,與指定 Linear 等效。

  • Period: 預測時段。公式會預測此指定的未來天數內的數據變化。默認值為序列長度的一半。

  • ApproxError: 是否輸出近似誤差。如果設置為 false,則輸出誤差序列不包含相應歷史數據的數據。默認值為 true。

  • ForecastError: 是否輸出預測誤差。如果設置為 false,並且 ApproxError 設置為 true,則輸出誤差序列將包含所有預測數據點的近似誤差。默認值為 true。

輸出值有三個序列:

  • Forecast: 預測測值。

  • UpperError: 上限誤差。

  • LowerError: 下限誤差。

輸入參數中回歸類型的具體值所代表的公式可以參考以下鏈接:

Time Series and Forecasting Formula

使用 FinancialFormula 的代碼十分簡單,只需創建一個臨時的 Chart ,插入原始數據作為一個 Series ,然後調用 DataManipulator.FinancialFormula 即可,所有代碼加起來也就 30 來行:

public double[] GetPredictData(int forecastingPoints, double[] points)
{
    var tempChart = new Chart();

    tempChart.ChartAreas.Add(new ChartArea());
    tempChart.ChartAreas[0].AxisX = new Axis();
    tempChart.ChartAreas[0].AxisY = new Axis();
    tempChart.Series.Add(new Series());

    for (int i = 0; i < points.Length; i++)
    {
        tempChart.Series[0].Points.AddXY(i, points[i]);
    }

    var trendSeries = new Series();
    tempChart.Series.Add(trendSeries);

    var typeRegression = "Exponential";
    var forecasting = forecastingPoints.ToString();
    var error = "false";
    var forecastingError = "false";
    var parameters = typeRegression + ',' + forecasting + ',' + error + ',' + forecastingError;

    tempChart.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, tempChart.Series[0], trendSeries);

    var result = new List<double>();
    for (int i = 0; i < trendSeries.Points.Count; i++)
    {
        result.Add(trendSeries.Points[i].YValues[0]);
    }

    return result.ToArray();
}

這裡我使用了 Exponential (指數函數)作為回歸類型,結果如下,看起來重複性很好,但是轉折處比較生硬,導致最後在實際計算中不太理想。如果想要理想的結果,應該先嘗試找出最合適的回歸公式。

3. 最後

FinancialFormula 挺好玩的,但它和圖表控件耦合在一起,用起來感覺有點邪門歪道,倒是通過它多少學會了一點財務公式。

話說回來當年微軟的控件庫都很上心嘛,現在微軟都不會出這麼良心的圖表庫了,逼我們買第三方控件。

4.參考

Time Series and Forecasting Formula

DataManipulator Class (System.Web.UI.DataVisualization.Charting) Microsoft Docs

DataFormula.FinancialFormula Method (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs

FinancialFormula Enum (System.Windows.Forms.DataVisualization.Charting) Microsoft Docs

how to generate graphs using Microsoft Chart Control

5. 源碼

//github.com/DinoChan/SimpleDataPrediction

Tags: