我要先宣告,這篇文章介紹到的內容雖說不是不能用,但玩樂成分居多,大家看看就好,不要太認真,
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. 原始碼
https://github.com/DinoChan/SimpleDataPrediction
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/248361.html
標籤:.NET技术
