포트폴리오 서비스(수익률 계산 부분 수정)

·2024년 6월 4일
0

Portfolio Backtest

목록 보기
30/31

기존 수익률 계산 부분

    public List<StockPrice> findAllByItmsNmAndYear(String itmsNm, int year) {
        LocalDate startDate = LocalDate.of(year, 1, 1);
        LocalDate endDate = LocalDate.of(year, 12, 31);
        return stockPriceRepository.findByItmsNmAndBasDtBetween(itmsNm, startDate, endDate);
    }

    public List<Long> getPricesByItmsNmAndYear(String itmsNm, int year) {
        List<StockPrice> stockPrices = findAllByItmsNmAndYear(itmsNm, year);

        List<Long> clprs = new ArrayList<>();

        for(int i = 0 ; i < 12 ; i++) {
            clprs.add(0L);
        }

        stockPrices.forEach(stockPrice -> {
            clprs.set(stockPrice.getBasDt().getMonthValue() - 1, stockPrice.getClpr());
        });
        return clprs;
    }
  • 다음과 같은 방식으로 특정년도의 데이터를 받아온 후 가공하여서 사용하였다.
  • 한개의 주식에 년도에 따라 접근하므로 DB에 접근횟수가 많다.

수정한 부분

계산을 위한 Object

@Getter
@Setter
public class PortfolioStockDTO {
    private String name;
    private String code;
    private Map<String, Long> priceMap;
    private double weight;
}
  • 가격을 다음과 같이 Map 구조를 이용해서 사용하였다.

가격 가져오기

    public List<PortfolioStockDTO> getortfolioStockDTOList(List<String> code, List<Double> weightList) {
        List<PortfolioStockDTO> portfolioStockDTOList = new ArrayList<>();
        for(String s : code) {
            List<StockPriceDTO> stockPrices = stockPriceService.getStockPriceListByCode(s);
            Map<String, Long> price = new HashMap<>();
            for(StockPriceDTO stockPriceDTO : stockPrices) {
                price.put(stockPriceDTO.getDate().toString(), stockPriceDTO.getPrice());
            }
            portfolioStockDTOList.add(new PortfolioStockDTO(stockPrices.get(0).getName(), s, price, weightList.get(code.indexOf(s))));
        }
        return portfolioStockDTOList;
    }
    
  • 다음과 같이 종목당 한번 DB에 접근한다.
profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보