Skip to content

Commit

Permalink
feat: calc portfolio sigmas
Browse files Browse the repository at this point in the history
  • Loading branch information
Angular2Guy committed Jul 27, 2024
1 parent 9cbdbcb commit e37225b
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,28 +44,40 @@ public class PortfolioBase {
private Double year1LinRegReturnSp500;
private Double year1LinRegReturnMsciChina;
private Double year1LinRegReturnEuroStoxx50;
private Double year1Sigma;
private Double year1SigmaSp500;
private Double year1SigmaMsciChina;
private Double year1SigmaEuroStoxx50;
private Double year1SigmaPortfolio;
private Double year2CorrelationSp500;
private Double year2CorrelationMsciChina;
private Double year2CorrelationEuroStoxx50;
private Double year2LinRegReturnSp500;
private Double year2LinRegReturnMsciChina;
private Double year2LinRegReturnEuroStoxx50;
private Double year2Sigma;
private Double year2SigmaSp500;
private Double year2SigmaMsciChina;
private Double year2SigmaEuroStoxx50;
private Double year2SigmaPortfolio;
private Double year5CorrelationSp500;
private Double year5CorrelationMsciChina;
private Double year5CorrelationEuroStoxx50;
private Double year5LinRegReturnSp500;
private Double year5LinRegReturnMsciChina;
private Double year5LinRegReturnEuroStoxx50;
private Double year5Sigma;
private Double year5SigmaSp500;
private Double year5SigmaMsciChina;
private Double year5SigmaEuroStoxx50;
private Double year5SigmaPortfolio;
private Double year10CorrelationSp500;
private Double year10CorrelationMsciChina;
private Double year10CorrelationEuroStoxx50;
private Double year10LinRegReturnSp500;
private Double year10LinRegReturnMsciChina;
private Double year10LinRegReturnEuroStoxx50;
private Double year10Sigma;
private Double year10SigmaSp500;
private Double year10SigmaMsciChina;
private Double year10SigmaEuroStoxx50;
private Double year10SigmaPortfolio;

public Long getId() {
return id;
Expand Down Expand Up @@ -315,35 +327,131 @@ public void setYear10LinRegReturnEuroStoxx50(Double year10LinRegReturnEuroStoxx5
this.year10LinRegReturnEuroStoxx50 = year10LinRegReturnEuroStoxx50;
}

public Double getYear1Sigma() {
return year1Sigma;
public Double getYear1SigmaSp500() {
return year1SigmaSp500;
}

public void setYear1Sigma(Double year1Sigma) {
this.year1Sigma = year1Sigma;
public void setYear1SigmaSp500(Double year1SigmaSp500) {
this.year1SigmaSp500 = year1SigmaSp500;
}

public Double getYear2Sigma() {
return year2Sigma;
public Double getYear1SigmaMsciChina() {
return year1SigmaMsciChina;
}

public void setYear2Sigma(Double year2Sigma) {
this.year2Sigma = year2Sigma;
public void setYear1SigmaMsciChina(Double year1SigmaMsciChina) {
this.year1SigmaMsciChina = year1SigmaMsciChina;
}

public Double getYear5Sigma() {
return year5Sigma;
public Double getYear2SigmaSp500() {
return year2SigmaSp500;
}

public void setYear5Sigma(Double year5Sigma) {
this.year5Sigma = year5Sigma;
public void setYear2SigmaSp500(Double year2SigmaSp500) {
this.year2SigmaSp500 = year2SigmaSp500;
}

public Double getYear10Sigma() {
return year10Sigma;
public Double getYear2SigmaMsciChina() {
return year2SigmaMsciChina;
}

public void setYear10Sigma(Double year10Sigma) {
this.year10Sigma = year10Sigma;
public void setYear2SigmaMsciChina(Double year2SigmaMsciChina) {
this.year2SigmaMsciChina = year2SigmaMsciChina;
}

public Double getYear5SigmaSp500() {
return year5SigmaSp500;
}

public void setYear5SigmaSp500(Double year5SigmaSp500) {
this.year5SigmaSp500 = year5SigmaSp500;
}

public Double getYear5SigmaMsciChina() {
return year5SigmaMsciChina;
}

public void setYear5SigmaMsciChina(Double year5SigmaMsciChina) {
this.year5SigmaMsciChina = year5SigmaMsciChina;
}

public Double getYear10SigmaSp500() {
return year10SigmaSp500;
}

public void setYear10SigmaSp500(Double year10SigmaSp500) {
this.year10SigmaSp500 = year10SigmaSp500;
}

public Double getYear10SigmaMsciChina() {
return year10SigmaMsciChina;
}

public void setYear10SigmaMsciChina(Double year10SigmaMsciChina) {
this.year10SigmaMsciChina = year10SigmaMsciChina;
}

public Double getYear1SigmaEuroStoxx50() {
return year1SigmaEuroStoxx50;
}

public void setYear1SigmaEuroStoxx50(Double year1SigmaEuroStoxx50) {
this.year1SigmaEuroStoxx50 = year1SigmaEuroStoxx50;
}

public Double getYear2SigmaEuroStoxx50() {
return year2SigmaEuroStoxx50;
}

public void setYear2SigmaEuroStoxx50(Double year2SigmaEuroStoxx50) {
this.year2SigmaEuroStoxx50 = year2SigmaEuroStoxx50;
}

public Double getYear5SigmaEuroStoxx50() {
return year5SigmaEuroStoxx50;
}

public void setYear5SigmaEuroStoxx50(Double year5SigmaEuroStoxx50) {
this.year5SigmaEuroStoxx50 = year5SigmaEuroStoxx50;
}

public Double getYear10SigmaEuroStoxx50() {
return year10SigmaEuroStoxx50;
}

public void setYear10SigmaEuroStoxx50(Double year10SigmaEuroStoxx50) {
this.year10SigmaEuroStoxx50 = year10SigmaEuroStoxx50;
}

public Double getYear1SigmaPortfolio() {
return year1SigmaPortfolio;
}

public void setYear1SigmaPortfolio(Double year1SigmaPortfolio) {
this.year1SigmaPortfolio = year1SigmaPortfolio;
}

public Double getYear2SigmaPortfolio() {
return year2SigmaPortfolio;
}

public void setYear2SigmaPortfolio(Double year2SigmaPortfolio) {
this.year2SigmaPortfolio = year2SigmaPortfolio;
}

public Double getYear5SigmaPortfolio() {
return year5SigmaPortfolio;
}

public void setYear5SigmaPortfolio(Double year5SigmaPortfolio) {
this.year5SigmaPortfolio = year5SigmaPortfolio;
}

public Double getYear10SigmaPortfolio() {
return year10SigmaPortfolio;
}

public void setYear10SigmaPortfolio(Double year10SigmaPortfolio) {
this.year10SigmaPortfolio = year10SigmaPortfolio;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand All @@ -31,8 +32,6 @@
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.google.common.util.concurrent.AtomicDouble;

import ch.xxx.manager.domain.model.entity.Currency;
import ch.xxx.manager.domain.model.entity.DailyQuote;
import ch.xxx.manager.domain.model.entity.DailyQuoteRepository;
Expand Down Expand Up @@ -117,15 +116,16 @@ private void updateSigmas(final Portfolio portfolio, final PortfolioBase portfol
Collection<Symbol> comparisonSymbols, List<DailyQuote> portfolioQuotes) {
var adjClosePercents = this.calcClosePercentages(portfolioQuotes, LocalDate.now().minusYears(10L));
final var sigma10Y = calcStandardDiviation(adjClosePercents);
portfolio.setYear10SigmaPortfolio(adjClosePercents.lastEntry().getValue().divide(sigma10Y, 25, RoundingMode.HALF_EVEN).doubleValue());
adjClosePercents = this.calcClosePercentages(portfolioQuotes, LocalDate.now().minusYears(5L));
final var sigma5Y = calcStandardDiviation(adjClosePercents);
portfolio.setYear5SigmaPortfolio(adjClosePercents.lastEntry().getValue().divide(sigma5Y, 25, RoundingMode.HALF_EVEN).doubleValue());
adjClosePercents = this.calcClosePercentages(portfolioQuotes, LocalDate.now().minusYears(2L));
final var sigma2Y = calcStandardDiviation(adjClosePercents);
portfolio.setYear2SigmaPortfolio(adjClosePercents.lastEntry().getValue().divide(sigma2Y, 25, RoundingMode.HALF_EVEN).doubleValue());
adjClosePercents = this.calcClosePercentages(portfolioQuotes, LocalDate.now().minusYears(1L));
final var sigma1Y = calcStandardDiviation(adjClosePercents);
final var lastValue = portfolioQuotes.stream()
.sorted((calcValues1, calcValues2) -> calcValues1.getLocalDay().compareTo(calcValues2.getLocalDay()))
.toList().reversed().stream().findFirst().orElseThrow();
portfolio.setYear1SigmaPortfolio(adjClosePercents.lastEntry().getValue().divide(sigma1Y, 25, RoundingMode.HALF_EVEN).doubleValue());
}

private BigDecimal calcStandardDiviation(Map<LocalDate, BigDecimal> adjClosePercents) {
Expand All @@ -143,7 +143,7 @@ private BigDecimal calcStandardDiviation(Map<LocalDate, BigDecimal> adjClosePerc
return standardDeviation;
}

private Map<LocalDate, BigDecimal> calcClosePercentages(List<DailyQuote> portfolioQuotes,
private LinkedHashMap<LocalDate, BigDecimal> calcClosePercentages(List<DailyQuote> portfolioQuotes,
final LocalDate cutOffDate) {
record DateToCloseAdjPercent(LocalDate localDate, BigDecimal closeAdjPercent) {
}
Expand All @@ -157,8 +157,10 @@ record DateToCloseAdjPercent(LocalDate localDate, BigDecimal closeAdjPercent) {
}
lastValue.set(myQuote.getAdjClose());
return new DateToCloseAdjPercent(myQuote.getLocalDay(), result);
}).filter(myValue -> myValue.closeAdjPercent().longValue() < -900L)
.collect(Collectors.toMap(myVal -> myVal.localDate(), myVal -> myVal.closeAdjPercent()));
})
.sorted((a,b) -> a.localDate().compareTo(b.localDate()))
.filter(myValue -> myValue.closeAdjPercent().longValue() < -900L)
.collect(Collectors.toMap(myVal -> myVal.localDate(), myVal -> myVal.closeAdjPercent(), (x, y) -> y, LinkedHashMap::new));
return closeAdjPercents;
}

Expand Down
24 changes: 5 additions & 19 deletions backend/src/main/resources/dbchangelog/changes/db.changelog-8.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,10 @@
</changeSet>
<changeSet id="42" author="angular2guy">
<addColumn tableName="portfolio">
<column name="year1sigma" type="double" />
<column name="year2sigma" type="double" />
<column name="year5sigma" type="double" />
<column name="year10sigma" type="double" />
</addColumn>
<dropColumn tableName="portfolio">
<column name="year1sigma_sp500" type="double" />
<column name="year1sigma_msci_china" type="double" />
<column name="year1sigma_euro_stoxx50" type="double" />
<column name="year2sigma_sp500" type="double" />
<column name="year2sigma_msci_china" type="double" />
<column name="year2sigma_euro_stoxx50" type="double" />
<column name="year5sigma_sp500" type="double" />
<column name="year5sigma_msci_china" type="double" />
<column name="year5sigma_euro_stoxx50" type="double" />
<column name="year10sigma_sp500" type="double" />
<column name="year10sigma_msci_china" type="double" />
<column name="year10sigma_euro_stoxx50" type="double" />
</dropColumn>
<column name="year1sigma_portfolio" type="double" />
<column name="year2sigma_portfolio" type="double" />
<column name="year5sigma_portfolio" type="double" />
<column name="year10sigma_portfolio" type="double" />
</addColumn>
</changeSet>
</databaseChangeLog>

0 comments on commit e37225b

Please sign in to comment.