21 using System.Collections.Generic;
22 using System.Globalization;
33 private static readonly DateTime _firstInterestRateDate =
new DateTime(1998, 1, 1);
34 private static DateTime _lastInterestRateDate;
35 private static Dictionary<DateTime, decimal> _riskFreeRateProvider;
36 private static readonly
object _lock =
new();
46 private IReadOnlyDictionary<DateTime, decimal> RiskFreeRateProvider
51 if (_riskFreeRateProvider !=
null)
53 return _riskFreeRateProvider;
58 if (_riskFreeRateProvider ==
null)
62 return _riskFreeRateProvider;
74 if (!RiskFreeRateProvider.TryGetValue(date.Date, out var interestRate))
76 return date < _firstInterestRateDate
77 ? RiskFreeRateProvider[_firstInterestRateDate]
78 : RiskFreeRateProvider[_lastInterestRateDate];
89 var directory = Path.Combine(
Globals.
DataFolder,
"alternative",
"interest-rate",
"usa",
91 _riskFreeRateProvider =
FromCsvFile(directory, out var previousInterestRate);
93 _lastInterestRateDate = DateTime.UtcNow.Date;
96 for (var date = _firstInterestRateDate; date <= _lastInterestRateDate; date = date.AddDays(1))
98 if (!_riskFreeRateProvider.TryGetValue(date, out var currentRate))
100 _riskFreeRateProvider[date] = previousInterestRate;
104 previousInterestRate = currentRate;
114 public static Dictionary<DateTime, decimal>
FromCsvFile(
string file, out decimal firstInterestRate)
118 var firstInterestRateSet =
false;
122 var interestRateProvider =
new Dictionary<DateTime, decimal>();
123 foreach (var line
in dataProvider.ReadLines(file).Skip(1)
124 .Where(x => !
string.IsNullOrWhiteSpace(x)))
126 if (
TryParse(line, out var date, out var interestRate))
128 if (!firstInterestRateSet)
130 firstInterestRate = interestRate;
131 firstInterestRateSet =
true;
134 interestRateProvider[date] = interestRate;
138 if (interestRateProvider.Count == 0)
140 Log.
Error($
"InterestRateProvider.FromCsvFile(): no interest rates were loaded, please make sure the file is present '{file}'");
143 return interestRateProvider;
152 public static bool TryParse(
string csvLine, out DateTime date, out decimal interestRate)
154 var line = csvLine.Split(
',');
156 if (!DateTime.TryParseExact(line[0],
"yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
158 Log.
Error($
"Couldn't parse date/time while reading FED primary credit rate file. Line: {csvLine}");
163 if (!decimal.TryParse(line[1], NumberStyles.Any, CultureInfo.InvariantCulture, out interestRate))
165 Log.
Error($
"Couldn't parse primary credit rate while reading FED primary credit rate file. Line: {csvLine}");