@@ -195,9 +195,9 @@ private BigDecimal zeroSafeDivideBigDecimal(final LinkedHashMap<LocalDate, BigDe
195195 private BigDecimal calcStandardDiviation (Map <LocalDate , BigDecimal > adjClosePercents ) {
196196 final var adjCloseMean = adjClosePercents .entrySet ().stream ().map (Entry ::getValue )
197197 .reduce (BigDecimal .ZERO , (acc , value ) -> value .add (acc ))
198- .divide (BigDecimal .valueOf (adjClosePercents .entrySet ().size ()), 25 , RoundingMode .HALF_EVEN );
198+ .divide (BigDecimal .valueOf (Math . max ( adjClosePercents .entrySet ().size (), 1 )), 25 , RoundingMode .HALF_EVEN );
199199 final var divisor = BigDecimal .ONE .divide (
200- BigDecimal .valueOf (adjClosePercents .entrySet ().size () < 2 ? 2 : adjClosePercents . entrySet (). size ( ))
200+ BigDecimal .valueOf (Math . max ( adjClosePercents .entrySet ().size (), 2 ))
201201 .subtract (BigDecimal .ONE ),
202202 25 , RoundingMode .HALF_EVEN );
203203 final var standardDeviation = adjClosePercents .entrySet ().stream ().map (Entry ::getValue )
@@ -225,9 +225,13 @@ private static Gatherer<DailyQuote, AtomicReference<BigDecimal>, DateToCloseAdjP
225225 (state , element , downstream ) -> {
226226 var result = true ;
227227 if (state .get ().longValue () > -900L ) {
228- var resultPercetage = element .getAdjClose ().divide (state .get (), 25 , RoundingMode .HALF_EVEN )
229- .multiply (new BigDecimal (100L ));
230- result = downstream .push (new DateToCloseAdjPercent (element .getLocalDay (), resultPercetage ));
228+ try {
229+ var resultPercetage = element .getAdjClose ().divide (state .get (), 25 , RoundingMode .HALF_EVEN )
230+ .multiply (new BigDecimal (100L ));
231+ result = downstream .push (new DateToCloseAdjPercent (element .getLocalDay (), resultPercetage ));
232+ }catch (ArithmeticException e ) {
233+ LOGGER .info ("calcClosePercentage failed: " ,e );
234+ }
231235 }
232236 state .set (element .getAdjClose ());
233237 return result ;
@@ -354,15 +358,19 @@ private Double calcLinRegReturn(final Portfolio portfolio, LocalDate cutOffDate,
354358 CalcValuesDay prevValues = null ;
355359 for (int i = 0 ; i < calcValuesDays .size (); i ++) {
356360 if (prevValues != null ) {
357- BigDecimal quoteReturn = calcValuesDays .get (i ).quote ()
358- .divide (calcValuesDays .get (i - 1 ).quote (), 25 , RoundingMode .HALF_EVEN )
359- .multiply (BigDecimal .valueOf (100L ));
360- BigDecimal compQuoteReturn = calcValuesDays .get (i ).compQuote ()
361- .divide (calcValuesDays .get (i - 1 ).compQuote (), 25 , RoundingMode .HALF_EVEN )
362- .multiply (BigDecimal .valueOf (100L ));
363- CalcValuesDay myCalcValuesDay = new CalcValuesDay (calcValuesDays .get (i ).day (), quoteReturn ,
364- compQuoteReturn );
365- divValuesDays .add (myCalcValuesDay );
361+ try {
362+ BigDecimal quoteReturn = calcValuesDays .get (i ).quote ()
363+ .divide (calcValuesDays .get (i - 1 ).quote (), 25 , RoundingMode .HALF_EVEN )
364+ .multiply (BigDecimal .valueOf (100L ));
365+ BigDecimal compQuoteReturn = calcValuesDays .get (i ).compQuote ()
366+ .divide (calcValuesDays .get (i - 1 ).compQuote (), 25 , RoundingMode .HALF_EVEN )
367+ .multiply (BigDecimal .valueOf (100L ));
368+ CalcValuesDay myCalcValuesDay = new CalcValuesDay (calcValuesDays .get (i ).day (), quoteReturn ,
369+ compQuoteReturn );
370+ divValuesDays .add (myCalcValuesDay );
371+ }catch (ArithmeticException e ) {
372+ LOGGER .info ("calcLinRegReturn had an error: " ,e );
373+ }
366374 }
367375 prevValues = calcValuesDays .get (i );
368376 }
@@ -373,7 +381,7 @@ private Double calcLinRegReturn(final Portfolio portfolio, LocalDate cutOffDate,
373381 LinearRegressionResults calcLinRegReturn (List <CalcValuesDay > calcValuesDays ) {
374382 BigDecimalValues meanValues = this .calculateMeans (calcValuesDays );
375383 BigDecimal yMean = BigDecimal .valueOf (IntStream .range (0 , calcValuesDays .size ()).sum ()).divide (
376- BigDecimal .valueOf (calcValuesDays .size () < 1 ? 1 : calcValuesDays . size ( )), 25 , RoundingMode .HALF_EVEN );
384+ BigDecimal .valueOf (Math . max ( calcValuesDays .size (), 1 )), 25 , RoundingMode .HALF_EVEN );
377385 final int [] yValue = new int [1 ];
378386 yValue [0 ] = 0 ;
379387 BigDecimal crossDiviationDailyQuotes = calcValuesDays .stream ()
@@ -443,11 +451,11 @@ private boolean checkCurrencyQuotes(final Portfolio portfolio, Map<LocalDate, Da
443451 private BigDecimalValues calculateMeans (List <CalcValuesDay > calcValuesDays ) {
444452 BigDecimal meanDailyQuotes = calcValuesDays .stream ().map (CalcValuesDay ::quote )
445453 .reduce (BigDecimal .ZERO , BigDecimal ::add )
446- .divide (BigDecimal .valueOf (calcValuesDays .size () < 1 ? 1 : calcValuesDays . size ( )), 25 ,
454+ .divide (BigDecimal .valueOf (Math . max ( calcValuesDays .size (), 1 )), 25 ,
447455 RoundingMode .HALF_EVEN );
448456 BigDecimal meanCompQuotes = calcValuesDays .stream ().map (CalcValuesDay ::compQuote )
449457 .reduce (BigDecimal .ZERO , BigDecimal ::add )
450- .divide (BigDecimal .valueOf (calcValuesDays .size () < 1 ? 1 : calcValuesDays . size ( )), 25 ,
458+ .divide (BigDecimal .valueOf (Math . max ( calcValuesDays .size (), 1 )), 25 ,
451459 RoundingMode .HALF_EVEN );
452460 return new BigDecimalValues (meanDailyQuotes , meanCompQuotes );
453461 }
0 commit comments