포트폴리오 서비스(ETF 데이터 추가하기)

·2024년 2월 29일
0

Portfolio Backtest

목록 보기
21/31

시작하면서

  • 과거 데이터를 추가하고 싶지만 구하지 못하였다...
  • ETF의 데이터를 추가하고 우선 다음 단계로 나아가자
  • ETF의 데이터를 새로 Entity를 만들어서 구현하는 것 보다는 현재의 주식 정보에 추가적으로 저장하는 방식도 괜찮은 것 같다.
    -> 데이터의 양을 저번에 줄였고 다른 로직에서 편리함이 있을거 같다.
  • 저번에 변경한 방식으로 인해 StockInfo가 동작하지 않는다 해당 부분도 수정해보자!

StockInfo 수정하기

Entity 수정하기

  • 지금 사용중인 json 파일에는 기존에 존재하던 mrktCtg, isinCd가 없다.
    -> 해당 부분을 삭제
  • 상장폐지, 신규상장등 주식이 사라지거나 추가됨...
    -> 가격을 저장할 때, 같이 저장 / 단, 성능을 위해 마지막에 한 번 저장

StockInfo saveall 추가

    public List<StockInfo> saveAll(Set<StockInfo> stockInfos) {
        List<StockInfo> saveStockInfos = new ArrayList<>();
        List<StockInfo> savedStockInfos = stockInfoRepository.findAll();
        List<String> savedItmsNm = savedStockInfos.stream().map(StockInfo::getItmsNm).toList();

        for(StockInfo stockInfo : stockInfos) {
            if(!savedItmsNm.contains(stockInfo.getItmsNm())) {
                saveStockInfos.add(stockInfo);
            }
        }
        return stockInfoRepository.saveAll(saveStockInfos);
    }

다음과 같이 존재하지 않는 것만 모아서 저장하는 saveAll()을 구현하였다. 이로써, 이름이 같은 것은 저장하지 않는다.
단, 이름이 다르지만 종목코드가 다른 것은 저장! (종목명이 바뀐 경우)

저장하기

    public void loadETFPriceByBaseDate(String baseDate) {
        JsonArray stockJson = dataPortalApi.getETF(baseDate.substring(0, 6));
        if(stockJson == null){
            return;
        }
        List<StockPrice> stockPrices = new ArrayList<>();
        Set<StockInfo> stockInfos = new HashSet<>();


        for(int i = 0 ; i < stockJson.size() ; i++){
            StockPrice stockPrice = new StockPrice();
            stockPrice.setItmsNm(stockJson.get(i).getAsJsonObject().get("itmsNm").getAsString());
            stockPrice.setSrtnCd(stockJson.get(i).getAsJsonObject().get("srtnCd").getAsString());
            stockPrice.setClpr(Math.round(Double.parseDouble(stockJson.get(i).getAsJsonObject().get("clpr").getAsString())));

            String basDt = stockJson.get(i).getAsJsonObject().get("basDt").getAsString() + "01";
            LocalDate date = LocalDate.parse(basDt, DateTimeFormatter.ofPattern("yyyyMMdd"));
            stockPrice.setBasDt(date);
            stockPrices.add(stockPrice);

            StockInfo stockInfo = new StockInfo();
            stockInfo.setItmsNm(stockJson.get(i).getAsJsonObject().get("itmsNm").getAsString());
            stockInfo.setSrtnCd(stockJson.get(i).getAsJsonObject().get("srtnCd").getAsString());
            stockInfos.add(stockInfo);
        }

        stockPriceService.saveAll(stockPrices);
        stockInfoService.saveAll(stockInfos);
    }
    

다음과 같이 json을 불러와서 stockPrice와 stockInfo를 구성하고 저장하였다.

총 결과

ETF까지 추가한 결과이다(2020.01. ~ 2024.01.)



profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보