Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .gradle/8.14.3/executionHistory/executionHistory.bin
Binary file not shown.
Binary file modified .gradle/8.14.3/executionHistory/executionHistory.lock
Binary file not shown.
Binary file modified .gradle/8.14.3/fileHashes/fileHashes.bin
Binary file not shown.
Binary file modified .gradle/8.14.3/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified .gradle/8.14.3/fileHashes/resourceHashesCache.bin
Binary file not shown.
Binary file modified .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
Binary file modified build/tmp/compileJava/previous-compilation-data.bin
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.stockport.server.application.controller.backtest;

import com.stockport.server.application.controller.backtest.dto.request.BacktestRequest;
import com.stockport.server.application.controller.backtest.dto.response.BacktestResponse;
import com.stockport.server.application.service.backtest.BacktestService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@Tag(name = "Backtest", description = "백테스팅 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/backtest")
public class BacktestController {
private final BacktestService backtestService;

@PostMapping
public ResponseEntity<BacktestResponse> runBacktest(@RequestBody BacktestRequest request) {
backtestService.validateRequest(request);
return ResponseEntity.ok(backtestService.runBacktest(request));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.stockport.server.application.controller.backtest.dto.request;


import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class AssetRequest {
private String stockCd;
private int weight;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.stockport.server.application.controller.backtest.dto.request;

import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.util.List;

@Getter
@Setter
public class BacktestRequest {

private LocalDate startDate;
private LocalDate endDate;
private Long initialCapital;
private RebalanceCycle rebalanceCycle;
private List<AssetRequest> assets;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.stockport.server.application.controller.backtest.dto.request;

public enum RebalanceCycle {
MONTHLY, QUARTERLY, YEARLY
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.stockport.server.application.controller.backtest.dto.response;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Getter
@Setter
@Builder
public class BacktestResponse {
private SummaryReport kospiSummary;
private SummaryReport kosdaqSummary;
private SummaryReport portfolioSummary;
private List<PortfolioValue> monthlyDrawdowns;
private List<PortfolioValue> monthlyAssets;
private List<PortfolioValue> monthlyReturns;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.stockport.server.application.controller.backtest.dto.response;

import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.time.LocalDate;

@Getter
@Setter
public class MonthlyAsset {
private LocalDate date;
private BigDecimal portfolioValue;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.stockport.server.application.controller.backtest.dto.response;

import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.time.LocalDate;

@Getter
@Setter
public class MonthlyDrawdown {
private LocalDate date;
private BigDecimal drawdown;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.stockport.server.application.controller.backtest.dto.response;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;
import java.time.LocalDate;

@Getter
@Setter
@Builder
public class PortfolioValue {
private LocalDate date;
private BigDecimal value;

public static PortfolioValue create(LocalDate date, BigDecimal returnRate) {
return PortfolioValue.builder()
.date(date)
.value(returnRate)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.stockport.server.application.controller.backtest.dto.response;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;

@Getter
@Setter
@Builder
public class SummaryReport {

private String portfolioName;
private BigDecimal initialCapital;
private BigDecimal finalCapital;

private BigDecimal cagr;
private BigDecimal maxDrawdown;
private BigDecimal volatility;
private BigDecimal sharpeRatio;
private BigDecimal sortinoRatio;
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,14 @@ public ApiResponse<String> updatePeriodicStockData(
stockService.updatePeriodicStockData(startDate, endDate);
return ApiResponse.onSuccess("주가 데이터 업데이트 성공");
}

@GetMapping("/update/stock-data")
@Operation(
summary = "주식 데이터 강제 업데이트",
description = "주식 데이터를 강제 업데이트합니다."
)
public ApiResponse<String> updateErrorStockData(@RequestParam String stockCd) {
stockService.forceUpdateStockData(stockCd);
return ApiResponse.onSuccess("오류 주가 데이터 재업데이트 성공");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
public class IndexDataScheduler {
private final IndexDataService indexDataService;

@Scheduled(cron = "0 0/5 9-18 * * MON-FRI", zone = "Asia/Seoul") // todo: 공휴일/휴장일 스케쥴러 처리 필요.
@Scheduled(cron = "0 0/5 9-17 * * MON-FRI", zone = "Asia/Seoul") // todo: 공휴일/휴장일 스케쥴러 처리 필요.
public void updateKospi() {
indexDataService.updateCurrentIndexData(MarketType.KOSPI);
log.info("[Scheduler] 코스피 데이터 업데이트 완료");
}

@Scheduled(cron = "0 0/5 9-18 * * MON-FRI", zone = "Asia/Seoul") // todo: 공휴일/휴장일 스케쥴러 처리 필요.
@Scheduled(cron = "0 0/5 9-17 * * MON-FRI", zone = "Asia/Seoul") // todo: 공휴일/휴장일 스케쥴러 처리 필요.
public void updateKosdaq() {
indexDataService.updateCurrentIndexData(MarketType.KOSPI);
log.info("[Scheduler] 코스닥 데이터 업데이트 완료");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public void saveDailyStockData() {
log.info("[Scheduler] 일별 주가 데이터 업데이트 완료");
}

@Scheduled(cron = "0 0/5 9-18 * * MON-FRI", zone = "Asia/Seoul") // todo: 공휴일/휴장일 스케쥴러 처리 필요.
@Scheduled(cron = "0 0/5 9-17 * * MON-FRI", zone = "Asia/Seoul") // todo: 공휴일/휴장일 스케쥴러 처리 필요.
public void updateStockData() {
stockService.updateCurrentStockData();
log.info("[Scheduler] 주가 데이터 업데이트 완료");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.stockport.server.application.service.backtest;

import com.stockport.server.application.controller.backtest.dto.request.BacktestRequest;
import com.stockport.server.application.controller.backtest.dto.response.BacktestResponse;

public interface BacktestService {
BacktestResponse runBacktest(BacktestRequest request);
void validateRequest(BacktestRequest request);
}
Loading
Loading