From 600ae88d17126fbc63b2915b57f888fbec320bd8 Mon Sep 17 00:00:00 2001 From: nhirschey Date: Fri, 1 Dec 2023 12:03:27 +0000 Subject: [PATCH] momentum factor --- src/NovaSBE.Finance/CHANGELOG.md | 6 ++++++ src/NovaSBE.Finance/French.fs | 24 ++++++++++++++++++++++++ tests/NovaSBE.Finance.Tests/French.fs | 9 +++++++++ 3 files changed, 39 insertions(+) diff --git a/src/NovaSBE.Finance/CHANGELOG.md b/src/NovaSBE.Finance/CHANGELOG.md index d82ad94..7e5f647 100644 --- a/src/NovaSBE.Finance/CHANGELOG.md +++ b/src/NovaSBE.Finance/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.5.0 - 2023-12-01 + +### Added + +* NovaSBE.Finance added momentum factors. + ## 0.4.1 - 2023-12-01 ### Fixed diff --git a/src/NovaSBE.Finance/French.fs b/src/NovaSBE.Finance/French.fs index 1612373..ad11003 100644 --- a/src/NovaSBE.Finance/French.fs +++ b/src/NovaSBE.Finance/French.fs @@ -25,6 +25,11 @@ type FF5Obs = Rf : float Frequency : Frequency } +type WMLObs = + { Date : DateTime + WML : float + Frequency : Frequency } + module internal Utils = type FF3Csv = CsvProvider<"Date (string),Mkt-RF,SMB,HML,RF 19260701, 0.10, -0.24, -0.28, 0.009"> @@ -32,6 +37,8 @@ module internal Utils = type FF5Csv = CsvProvider<"Date (string),Mkt-RF,SMB,HML,RMW,CMA,RF 19260701, 0.10, -0.24, -0.28,0.0,1.2, 0.009"> + type WMLCsv = CsvProvider<"Date (string),Mom (float)"> + let frenchDay x = DateTime.ParseExact(x, "yyyyMMdd", @@ -107,3 +114,20 @@ let getFF5 frequency = Cma = float parsedLine.CMA / 100.0 Rf = float parsedLine.RF / 100.0 Frequency = frequency }) + +let getWML frequency = + let (dataset, dateParser) = + match frequency with + | Monthly -> "F-F_Momentum_Factor_CSV", frenchMonth + | Daily -> "F-F_Momentum_Factor_daily_CSV", frenchDay + let data = new StringReader(getData dataset) + [| while data.Peek() <> -1 do + data.ReadLine() |] + |> Array.skipWhile(fun line -> not (line.StartsWith(",Mom"))) + |> Array.skip 1 + |> Array.takeWhile(fun line -> line <> "") + |> Array.map(fun line -> + let parsedLine = WMLCsv.ParseRows(line).[0] + { Date = dateParser parsedLine.Date + WML = float parsedLine.Mom / 100.0 + Frequency = frequency }) \ No newline at end of file diff --git a/tests/NovaSBE.Finance.Tests/French.fs b/tests/NovaSBE.Finance.Tests/French.fs index be8c409..72ea5ca 100644 --- a/tests/NovaSBE.Finance.Tests/French.fs +++ b/tests/NovaSBE.Finance.Tests/French.fs @@ -26,3 +26,12 @@ let ``Can do ff5 monthly`` () = let ff5m = getFF5 Frequency.Monthly ff5m.Length |> shouldBeGreaterThan 10 +[] +let ``Can do wml daily`` () = + let wmld = getWML Frequency.Daily + wmld.Length |> shouldBeGreaterThan 10 + +[] +let ``Can do wml monthly`` () = + let wmlm = getWML Frequency.Monthly + wmlm.Length |> shouldBeGreaterThan 10 \ No newline at end of file