Skip to content

Commit d5be28a

Browse files
authored
Merge pull request #103 from SynergyX-AI-Pattern/refactor/#102_backtest_rounding
Refactor/#102 backtest rounding
2 parents 99d48c3 + 4b2cf73 commit d5be28a

File tree

4 files changed

+52
-20
lines changed

4 files changed

+52
-20
lines changed

src/main/java/com/synergyx/trading/service/backtestService/BacktestServiceImpl.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.springframework.data.domain.Pageable;
2222
import org.springframework.transaction.annotation.Transactional;
2323
import com.synergyx.trading.service.backtestService.client.BacktestClientService;
24-
24+
import static com.synergyx.trading.util.NumberUtil.round;
2525
import java.time.LocalDate;
2626
import java.time.LocalDateTime;
2727
import java.util.List;
@@ -97,15 +97,15 @@ public BacktestResponseDTO.BacktestExecutionDTO runBacktest(Long userId, Long pa
9797
.matchedCount(saved.getMatchedCount())
9898
.startDate(saved.getStartDate())
9999
.endDate(saved.getEndDate())
100-
.winRate(saved.getWinRate())
101-
.averageReturn(saved.getAverageReturn())
102-
.maxReturn(saved.getMaxReturn())
100+
.winRate(round(saved.getWinRate()))
101+
.averageReturn(round(saved.getAverageReturn()))
102+
.maxReturn(round(saved.getMaxReturn()))
103103
.maxReturnDate(saved.getMaxReturnDate())
104-
.minReturn(saved.getMinReturn())
104+
.minReturn(round(saved.getMinReturn()))
105105
.minReturnDate(saved.getMinReturnDate())
106-
.totalReturn(saved.getTotalReturn())
106+
.totalReturn(round(saved.getTotalReturn()))
107107
.lastMatchedDate(saved.getLastMatchedDate())
108-
.lastMatchedReturn(saved.getLastMatchedReturn())
108+
.lastMatchedReturn(round(saved.getLastMatchedReturn()))
109109
.highlightRange(
110110
(saved.getHighlightFromDate() != null && saved.getHighlightToDate() != null)
111111
? BacktestResponseDTO.HighlightRangeDTO.builder()
@@ -139,16 +139,16 @@ public BacktestResponseDTO.BacktestResultDetailDTO getBacktestResultDetail(Long
139139
.executedAt(backtest.getExecutedAt())
140140
.startDate(backtest.getStartDate())
141141
.endDate(backtest.getEndDate())
142-
.winRate(backtest.getWinRate())
143-
.averageReturn(backtest.getAverageReturn())
142+
.winRate(round(backtest.getWinRate()))
143+
.averageReturn(round(backtest.getAverageReturn()))
144144
.matchedCount(backtest.getMatchedCount())
145145
.maxReturnDate(backtest.getMaxReturnDate())
146-
.maxReturn(backtest.getMaxReturn())
146+
.maxReturn(round(backtest.getMaxReturn()))
147147
.minReturnDate(backtest.getMinReturnDate())
148-
.minReturn(backtest.getMinReturn())
148+
.minReturn(round(backtest.getMinReturn()))
149149
.lastMatchedDate(backtest.getLastMatchedDate())
150-
.lastMatchedReturn(backtest.getLastMatchedReturn())
151-
.totalReturn(backtest.getTotalReturn())
150+
.lastMatchedReturn(round(backtest.getLastMatchedReturn()))
151+
.totalReturn(round(backtest.getTotalReturn()))
152152
.highlightRange(
153153
(backtest.getHighlightFromDate() != null && backtest.getHighlightToDate() != null)
154154
? BacktestResponseDTO.HighlightRangeDTO.builder()
@@ -178,8 +178,8 @@ public Page<BacktestResponseDTO.BacktestSummaryDTO> getBacktestResultList(Long u
178178
.backtestId(bt.getId())
179179
.stockName(bt.getStock().getName())
180180
.executedAt(bt.getExecutedAt())
181-
.winRate(bt.getWinRate())
182-
.averageReturn(bt.getAverageReturn())
181+
.winRate(round(bt.getWinRate()))
182+
.averageReturn(round(bt.getAverageReturn()))
183183
.matchedCount(bt.getMatchedCount())
184184
.build());
185185
}

src/main/java/com/synergyx/trading/service/backtestService/ranking/BacktestRankingService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.concurrent.atomic.AtomicInteger;
1717
import java.util.function.Function;
1818
import java.util.stream.Collectors;
19+
import static com.synergyx.trading.util.NumberUtil.round;
1920

2021
@Service
2122
@RequiredArgsConstructor
@@ -65,6 +66,13 @@ public List<BacktestRankingDTO> getRanking(int limit) {
6566
// 순위 부여
6667
assignRanks(rankings);
6768

69+
// 반올림 처리
70+
rankings.forEach(r -> {
71+
r.setWinRate(round(r.getWinRate()));
72+
r.setAverageReturn(round(r.getAverageReturn()));
73+
r.setMaxReturn(round(r.getMaxReturn()));
74+
});
75+
6876
return rankings;
6977
}
7078
}

src/main/java/com/synergyx/trading/service/patternService/PatternQueryServiceImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import java.util.List;
1515
import java.util.Optional;
16+
import static com.synergyx.trading.util.NumberUtil.round;
1617

1718
@Service
1819
@RequiredArgsConstructor
@@ -40,8 +41,8 @@ public List<PatternResponseDTO.PatternDTO> getPatternList(Long userId) {
4041
List<PatternResponseDTO.BacktestSummaryDTO> summaries = backtests.stream()
4142
.map(b -> PatternResponseDTO.BacktestSummaryDTO.builder()
4243
.stockName(b.getStock().getName())
43-
.averageReturn(b.getAverageReturn())
44-
.winRate(b.getWinRate())
44+
.averageReturn(round(b.getAverageReturn()))
45+
.winRate(round(b.getWinRate()))
4546
.matchedCount(b.getMatchedCount())
4647
.executedAt(b.getExecutedAt())
4748
.build())
@@ -81,10 +82,10 @@ public PatternResponseDTO.PatternDetailDTO getPatternDetail(Long userId, Long pa
8182
.executedAt(bt.getExecutedAt())
8283
.startDate(bt.getStartDate())
8384
.endDate(bt.getEndDate())
84-
.winRate(bt.getWinRate())
85-
.averageReturn(bt.getAverageReturn())
85+
.winRate(round(bt.getWinRate()))
86+
.averageReturn(round(bt.getAverageReturn()))
8687
.matchedCount(bt.getMatchedCount())
87-
.maxReturn(bt.getMaxReturn())
88+
.maxReturn(round(bt.getMaxReturn()))
8889
.maxReturnDate(bt.getMaxReturnDate())
8990
.build()
9091
).orElse(null);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.synergyx.trading.util;
2+
3+
import java.math.BigDecimal;
4+
import java.math.RoundingMode;
5+
6+
/**
7+
* 숫자 관련 공통 유틸리티 클래스
8+
*/
9+
public class NumberUtil {
10+
11+
/**
12+
* 값을 소수점 둘째 자리까지 반올림합니다.
13+
*
14+
* @param value Double 값
15+
* @return 소수점 둘째 자리까지 반올림된 값
16+
*/
17+
public static Double round(Double value) {
18+
if (value == null) return null;
19+
return BigDecimal.valueOf(value)
20+
.setScale(2, RoundingMode.HALF_UP) // 둘째 자리에서 반올림
21+
.doubleValue();
22+
}
23+
}

0 commit comments

Comments
 (0)