Optimizations for CMTrend

This commit is contained in:
2025-04-21 18:03:07 -04:00
parent 53e84e765c
commit 14bd7651ca
9 changed files with 302 additions and 34 deletions

View File

@@ -21,13 +21,46 @@ namespace MarketData.Generator.CMTrend
try
{
List<String> symbols=PricingDA.GetSymbols();
// Filter out symbols where we do not have a price on trade date
Dictionary<String,DateTime> latestDates = PricingDA.GetLatestDates(symbols);
symbols=symbols.Where(x => latestDates.ContainsKey(x) && latestDates[x].Date>=tradeDate.Date).ToList();
// Prefetch a subset of fundamentals where each fundamental.asof is no greater than tradeDate
FundamentalsV2 fundamentals = FundamentalDA.GetFundamentalsMaxDateV2(tradeDate);
// Prefetch the Company Profiles
Dictionary<String,CompanyProfile> companyProfiles = CompanyProfileDA.GetCompanyProfiles(symbols);
// Prefetch the pricing dates requires for 200 day moving average.
DateGenerator dateGenerator = new DateGenerator();
DateTime historicalDate=dateGenerator.GenerateHistoricalDate(tradeDate,cmtParams.DMA200Horizon+10);
List<DateTime> historicalDates=PricingDA.GetPricingDatesBetween(historicalDate,tradeDate);
// Prefetch the EPS time series
Dictionary<String,TimeSeriesCollection> epsTimeSeriesCollectionDictionary = FundamentalDA.GetEPS(symbols,tradeDate,3);
// Prefetch the profit margin time series
Dictionary<String,TimeSeriesCollection> profitMarginTimeSeriesCollectionDictionary = IncomeStatementDA.GetProfitMarginMaxAsOf(symbols,tradeDate,3,IncomeStatement.PeriodType.Quarterly);
for(int index=0;index<symbols.Count;index++)
{
String symbol=symbols[index];
if(0==(index%1000)) Console.WriteLine("Processing item {0} of {1}",index+1,symbols.Count);
CMTCandidate cmtCandidate=CMTCandidateGenerator.GenerateCandidate(symbol,tradeDate,cmtParams,symbolsHeld);
FundamentalV2 fundamental = default;
if(fundamentals.ContainsKey(symbol))fundamental=fundamentals[symbol];
CompanyProfile companyProfile = default;
if(companyProfiles.ContainsKey(symbol))companyProfile = companyProfiles[symbol];
TimeSeriesCollection epsTimeSeriesCollection = default;
if(epsTimeSeriesCollectionDictionary.ContainsKey(symbol))epsTimeSeriesCollection=epsTimeSeriesCollectionDictionary[symbol];
TimeSeriesCollection profitMarginTimeSeriesCollection = default;
if(profitMarginTimeSeriesCollectionDictionary.ContainsKey(symbol))profitMarginTimeSeriesCollection=profitMarginTimeSeriesCollectionDictionary[symbol];
CMTCandidate cmtCandidate=CMTCandidateGenerator.GenerateCandidate(symbol,tradeDate,cmtParams,fundamental,companyProfile,historicalDates,epsTimeSeriesCollection,profitMarginTimeSeriesCollection,symbolsHeld);
if(null==cmtCandidate) continue;
if(cmtCandidate.Violation) cmtGeneratorResult.CMTCandidatesWithViolation.Add(cmtCandidate);
else cmtGeneratorResult.CMTCandidates.Add(cmtCandidate);