F# 语言 时间序列实战示例

F#阿木 发布于 2025-06-21 12 次阅读


F 语言时间序列实战示例

时间序列分析是统计学和数据分析中的一个重要领域,它涉及对随时间变化的数据进行建模、分析和预测。F 语言作为一种功能编程语言,以其简洁、高效和强大的类型系统在数据处理和分析领域有着广泛的应用。本文将围绕F语言,通过一个实战示例,展示如何使用F进行时间序列数据的处理和分析。

环境准备

在开始之前,请确保您的开发环境中已安装以下工具:

- .NET Core SDK

- Visual Studio 或其他支持F的开发环境

- F 编译器 (fsharp.exe)

实战示例:股票价格预测

在这个示例中,我们将使用F来分析股票价格的时间序列数据,并尝试预测未来的价格走势。

1. 数据获取

我们需要获取股票价格的历史数据。这里我们可以使用公开的股票数据API,如Yahoo Finance API。

fsharp

open System


open System.Net.Http


open FSharp.Data

type YahooFinance = JsonProvider<"""

{


"chart": {


"result": [


{


"timestamp": 1609459200,


"symbol": "AAPL",


"open": 133.21,


"high": 134.18,


"low": 132.21,


"close": 133.12,


"volume": 87292000


},


// ... 更多数据


]


}


}


""">

let getStockData symbol =


let client = new HttpClient()


let url = sprintf "https://query1.finance.yahoo.com/v7/finance/download/%s" symbol


let! content = client.GetAsync(url) |> Async.AwaitTask


let! text = content.Content.ReadAsStringAsync() |> Async.AwaitTask


YahooFinance.Parse(text)


2. 数据处理

获取到数据后,我们需要对其进行处理,以便进行后续分析。这里我们将数据转换为F中的TimeSpan类型,并计算每日的涨跌幅。

fsharp

let processStockData (data: YahooFinance) =


data.Chart.Result


|> List.map (fun x ->


let date = DateTime.FromUnixTimeSeconds(x.Timestamp)


let change = x.Close - x.Open


let changePercent = change / x.Open 100.0


(date, x.Open, x.Close, change, changePercent))


3. 时间序列分析

接下来,我们将使用F中的统计库进行时间序列分析。这里我们使用移动平均和自回归模型来预测未来的股票价格。

fsharp

open System.Linq


open MathNet.Numerics


open MathNet.Numerics.LinearAlgebra

let movingAverage data windowSize =


data


|> List.windowed windowSize


|> List.map (fun window ->


let values = window |> List.map (fun x -> x.Close)


let avg = values.Average()


(window |> List.head |> fst, avg))

let autoregression data order =


let x = data |> List.map (fun x -> float x.Close)


let y = data |> List.map (fun x -> float x.Close)


let model = LinearRegression.Fit(x, y, order)


model


4. 预测

我们将使用训练好的模型进行预测。

fsharp

let predict data model =


let x = data |> List.map (fun x -> float x.Close)


let y = model.Transform(x)


y


5. 结果展示

我们将预测结果与实际数据进行对比,并绘制图表。

fsharp

open System.Windows.Forms


open ZedGraph

let showGraph data predictedData =


let form = new Form()


let graphControl = new ZedGraphControl()


form.Controls.Add(graphControl)


form.Width <- 800


form.Height <- 600


form.Show()

let graph = graphControl.GraphPane


graph.Title.Text <- "Stock Price Prediction"


graph.XAxis.Title.Text <- "Date"


graph.YAxis.Title.Text <- "Price"

let symbol = "AAPL"


let stockData = getStockData symbol


let processedData = processStockData stockData


let movingAverages = movingAverage processedData 5


let model = autoregression processedData 1


let predictedData = predict processedData model

let dates = processedData |> List.map (fun x -> x |> fst)


let actualPrices = processedData |> List.map (fun x -> x |> List.last)


let predictedPrices = predictedData |> List.tail

let curve1 = graph.AddCurve("Actual Prices", dates, actualPrices, Color.Blue)


let curve2 = graph.AddCurve("Predicted Prices", dates @ List.init 5 (fun _ -> DateTime.Now), predictedPrices, Color.Red)


let curve3 = graph.AddCurve("Moving Average", movingAverages |> List.map (fun x -> x |> fst), movingAverages |> List.map (fun x -> x |> snd), Color.Green)

form.ShowDialog() |> ignore


总结

本文通过一个股票价格预测的实战示例,展示了如何使用F语言进行时间序列数据的处理和分析。通过结合F的简洁语法和强大的功能,我们可以轻松地实现复杂的数据分析任务。希望本文能对您在F语言和时间序列分析领域的学习有所帮助。