diff --git a/frontend/src/app/backtest/page.tsx b/frontend/src/app/backtest/page.tsx
index 28c8a99..134a490 100644
--- a/frontend/src/app/backtest/page.tsx
+++ b/frontend/src/app/backtest/page.tsx
@@ -60,6 +60,7 @@ const strategyOptions = [
{ value: 'multi_factor', label: '멀티 팩터' },
{ value: 'quality', label: '슈퍼 퀄리티' },
{ value: 'value_momentum', label: '밸류 모멘텀' },
+ { value: 'kjb', label: '김종봉 단기매매' },
];
const periodOptions = [
@@ -98,6 +99,13 @@ export default function BacktestPage() {
const [vmValueWeight, setVmValueWeight] = useState(0.5);
const [vmMomentumWeight, setVmMomentumWeight] = useState(0.5);
+ // KJB params
+ const [kjbMaxPositions, setKjbMaxPositions] = useState(10);
+ const [kjbCashReserve, setKjbCashReserve] = useState(0.3);
+ const [kjbStopLoss, setKjbStopLoss] = useState(0.03);
+ const [kjbTarget1, setKjbTarget1] = useState(0.05);
+ const [kjbTarget2, setKjbTarget2] = useState(0.10);
+
useEffect(() => {
const init = async () => {
try {
@@ -167,6 +175,14 @@ export default function BacktestPage() {
value_weight: vmValueWeight,
momentum_weight: vmMomentumWeight,
};
+ } else if (strategyType === 'kjb') {
+ strategyParams = {
+ max_positions: kjbMaxPositions,
+ cash_reserve_ratio: kjbCashReserve,
+ stop_loss_pct: kjbStopLoss,
+ target1_pct: kjbTarget1,
+ target2_pct: kjbTarget2,
+ };
}
const response = await api.post<{ id: number }>('/api/backtest', {
@@ -379,7 +395,8 @@ export default function BacktestPage() {
- {/* Rebalancing Period */}
+ {/* Rebalancing Period (not for KJB) */}
+ {strategyType !== 'kjb' && (
+ )}
{/* Initial Capital & Top N */}
@@ -514,6 +532,80 @@ export default function BacktestPage() {
)}
+ {strategyType === 'kjb' && (
+
+ )}
+
{/* Advanced options toggle */}