From 70f6b9a34d6bdb5cf0e1d391602e95a4d2dcd5de Mon Sep 17 00:00:00 2001 From: hyowons Date: Tue, 16 Jun 2026 12:16:08 +0900 Subject: [PATCH] =?UTF-8?q?feat(sim):=20=EC=A0=95=EB=A0=AC=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80(=EC=98=A4=EB=A6=84/=EB=82=B4=EB=A6=BC)=C2=B740?= =?UTF-8?q?=EC=9D=BC=EC=84=A0=201=EB=93=B1=EC=A0=84=EB=9E=B5(v300)=20?= =?UTF-8?q?=EB=B3=B5=EA=B5=AC=C2=B7=EB=B3=B4=EC=9C=A0=EB=B0=B0=EC=A7=80=20?= =?UTF-8?q?=F0=9F=93=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sim_web 비교탭 정렬: 손익/평가/보유/거래순 클릭마다 오름↔내림 토글 (기본 내림, 평가순만 오름), 활성버튼 화살표 표시 - 40일선 1등 전략 v62 파라미터 복구 → v300 (새 계좌, 220개) - behive_web 보유 배지: '보유 xx 주' → '📦 xx' (폰트 8px, sim웹과 통일) Co-Authored-By: Claude Opus 4.8 (1M context) --- agents/stock/workspace/scripts/behive_web.py | 6 +- agents/stock/workspace/sim/sim_web.py | 52 +++-- .../workspace/state/sim/equity_history.json | 2 +- .../stock/workspace/state/sim/favorites.json | 2 +- .../workspace/state/sim/index_history.json | 2 +- .../stock/workspace/state/sim/variants.json | 16 ++ .../state/sim/variants/v1/portfolio.json | 2 +- .../state/sim/variants/v10/portfolio.json | 2 +- .../state/sim/variants/v100/portfolio.json | 2 +- .../state/sim/variants/v101/portfolio.json | 2 +- .../state/sim/variants/v102/portfolio.json | 2 +- .../state/sim/variants/v103/portfolio.json | 2 +- .../state/sim/variants/v104/portfolio.json | 2 +- .../state/sim/variants/v105/portfolio.json | 4 +- .../state/sim/variants/v106/portfolio.json | 4 +- .../state/sim/variants/v107/portfolio.json | 2 +- .../state/sim/variants/v108/portfolio.json | 2 +- .../state/sim/variants/v109/portfolio.json | 2 +- .../state/sim/variants/v11/portfolio.json | 2 +- .../state/sim/variants/v110/portfolio.json | 2 +- .../state/sim/variants/v111/portfolio.json | 2 +- .../state/sim/variants/v112/portfolio.json | 2 +- .../state/sim/variants/v113/portfolio.json | 2 +- .../state/sim/variants/v114/portfolio.json | 2 +- .../state/sim/variants/v115/portfolio.json | 2 +- .../state/sim/variants/v116/portfolio.json | 2 +- .../state/sim/variants/v117/portfolio.json | 2 +- .../state/sim/variants/v118/portfolio.json | 2 +- .../state/sim/variants/v119/portfolio.json | 2 +- .../state/sim/variants/v12/portfolio.json | 2 +- .../state/sim/variants/v120/portfolio.json | 2 +- .../state/sim/variants/v131/portfolio.json | 2 +- .../state/sim/variants/v134/portfolio.json | 2 +- .../state/sim/variants/v135/portfolio.json | 2 +- .../state/sim/variants/v136/portfolio.json | 2 +- .../state/sim/variants/v137/portfolio.json | 2 +- .../state/sim/variants/v138/portfolio.json | 2 +- .../state/sim/variants/v139/portfolio.json | 2 +- .../state/sim/variants/v140/portfolio.json | 2 +- .../state/sim/variants/v141/portfolio.json | 2 +- .../state/sim/variants/v142/portfolio.json | 2 +- .../state/sim/variants/v143/portfolio.json | 2 +- .../state/sim/variants/v144/portfolio.json | 2 +- .../state/sim/variants/v145/portfolio.json | 2 +- .../state/sim/variants/v146/portfolio.json | 2 +- .../state/sim/variants/v147/portfolio.json | 2 +- .../state/sim/variants/v148/portfolio.json | 2 +- .../state/sim/variants/v149/portfolio.json | 2 +- .../state/sim/variants/v150/portfolio.json | 2 +- .../state/sim/variants/v151/portfolio.json | 2 +- .../state/sim/variants/v152/portfolio.json | 2 +- .../state/sim/variants/v153/portfolio.json | 2 +- .../state/sim/variants/v154/portfolio.json | 2 +- .../state/sim/variants/v155/portfolio.json | 2 +- .../state/sim/variants/v156/portfolio.json | 2 +- .../state/sim/variants/v157/portfolio.json | 2 +- .../state/sim/variants/v158/portfolio.json | 2 +- .../state/sim/variants/v159/portfolio.json | 2 +- .../state/sim/variants/v160/portfolio.json | 2 +- .../state/sim/variants/v161/portfolio.json | 2 +- .../state/sim/variants/v162/portfolio.json | 2 +- .../state/sim/variants/v163/portfolio.json | 2 +- .../state/sim/variants/v164/portfolio.json | 2 +- .../state/sim/variants/v165/portfolio.json | 2 +- .../state/sim/variants/v166/portfolio.json | 2 +- .../state/sim/variants/v167/portfolio.json | 2 +- .../state/sim/variants/v168/portfolio.json | 2 +- .../state/sim/variants/v189/portfolio.json | 2 +- .../state/sim/variants/v190/portfolio.json | 2 +- .../state/sim/variants/v195/portfolio.json | 2 +- .../state/sim/variants/v196/portfolio.json | 2 +- .../state/sim/variants/v197/portfolio.json | 2 +- .../state/sim/variants/v198/portfolio.json | 2 +- .../state/sim/variants/v199/portfolio.json | 2 +- .../state/sim/variants/v2/portfolio.json | 4 +- .../state/sim/variants/v200/portfolio.json | 2 +- .../state/sim/variants/v201/portfolio.json | 2 +- .../state/sim/variants/v202/portfolio.json | 2 +- .../state/sim/variants/v203/portfolio.json | 2 +- .../state/sim/variants/v204/portfolio.json | 2 +- .../state/sim/variants/v205/portfolio.json | 2 +- .../state/sim/variants/v206/portfolio.json | 2 +- .../state/sim/variants/v207/portfolio.json | 2 +- .../state/sim/variants/v208/portfolio.json | 2 +- .../state/sim/variants/v209/portfolio.json | 2 +- .../state/sim/variants/v210/portfolio.json | 2 +- .../state/sim/variants/v211/portfolio.json | 2 +- .../state/sim/variants/v212/portfolio.json | 2 +- .../state/sim/variants/v213/portfolio.json | 2 +- .../state/sim/variants/v214/portfolio.json | 2 +- .../state/sim/variants/v215/portfolio.json | 2 +- .../state/sim/variants/v216/portfolio.json | 2 +- .../state/sim/variants/v217/portfolio.json | 2 +- .../state/sim/variants/v218/portfolio.json | 2 +- .../state/sim/variants/v219/portfolio.json | 2 +- .../state/sim/variants/v220/portfolio.json | 2 +- .../state/sim/variants/v221/portfolio.json | 2 +- .../state/sim/variants/v222/portfolio.json | 2 +- .../state/sim/variants/v223/portfolio.json | 2 +- .../state/sim/variants/v224/portfolio.json | 2 +- .../state/sim/variants/v225/portfolio.json | 2 +- .../state/sim/variants/v226/portfolio.json | 2 +- .../state/sim/variants/v227/portfolio.json | 2 +- .../state/sim/variants/v228/portfolio.json | 2 +- .../state/sim/variants/v229/portfolio.json | 2 +- .../state/sim/variants/v23/portfolio.json | 2 +- .../state/sim/variants/v230/portfolio.json | 2 +- .../state/sim/variants/v231/portfolio.json | 2 +- .../state/sim/variants/v232/portfolio.json | 2 +- .../state/sim/variants/v233/portfolio.json | 2 +- .../state/sim/variants/v234/portfolio.json | 2 +- .../state/sim/variants/v235/portfolio.json | 2 +- .../state/sim/variants/v236/portfolio.json | 2 +- .../state/sim/variants/v237/portfolio.json | 2 +- .../state/sim/variants/v238/portfolio.json | 2 +- .../state/sim/variants/v239/portfolio.json | 2 +- .../state/sim/variants/v240/portfolio.json | 2 +- .../state/sim/variants/v241/portfolio.json | 2 +- .../state/sim/variants/v242/portfolio.json | 2 +- .../state/sim/variants/v243/portfolio.json | 2 +- .../state/sim/variants/v244/portfolio.json | 2 +- .../state/sim/variants/v245/portfolio.json | 2 +- .../state/sim/variants/v246/portfolio.json | 2 +- .../state/sim/variants/v247/portfolio.json | 2 +- .../state/sim/variants/v248/portfolio.json | 2 +- .../state/sim/variants/v249/portfolio.json | 2 +- .../state/sim/variants/v250/portfolio.json | 2 +- .../state/sim/variants/v251/portfolio.json | 2 +- .../state/sim/variants/v252/portfolio.json | 2 +- .../state/sim/variants/v253/portfolio.json | 2 +- .../state/sim/variants/v254/portfolio.json | 2 +- .../state/sim/variants/v255/portfolio.json | 2 +- .../state/sim/variants/v256/portfolio.json | 2 +- .../state/sim/variants/v257/portfolio.json | 2 +- .../state/sim/variants/v258/portfolio.json | 2 +- .../state/sim/variants/v259/portfolio.json | 2 +- .../state/sim/variants/v26/portfolio.json | 2 +- .../state/sim/variants/v260/portfolio.json | 2 +- .../state/sim/variants/v261/portfolio.json | 2 +- .../state/sim/variants/v262/portfolio.json | 2 +- .../state/sim/variants/v263/portfolio.json | 2 +- .../state/sim/variants/v264/portfolio.json | 2 +- .../state/sim/variants/v265/portfolio.json | 2 +- .../state/sim/variants/v266/portfolio.json | 2 +- .../state/sim/variants/v267/portfolio.json | 2 +- .../state/sim/variants/v268/portfolio.json | 2 +- .../state/sim/variants/v269/portfolio.json | 2 +- .../state/sim/variants/v27/portfolio.json | 4 +- .../state/sim/variants/v270/portfolio.json | 2 +- .../state/sim/variants/v271/portfolio.json | 2 +- .../state/sim/variants/v272/portfolio.json | 2 +- .../state/sim/variants/v273/portfolio.json | 2 +- .../state/sim/variants/v274/portfolio.json | 2 +- .../state/sim/variants/v275/portfolio.json | 2 +- .../state/sim/variants/v276/portfolio.json | 2 +- .../state/sim/variants/v277/portfolio.json | 2 +- .../state/sim/variants/v278/portfolio.json | 2 +- .../state/sim/variants/v279/portfolio.json | 2 +- .../state/sim/variants/v28/portfolio.json | 2 +- .../state/sim/variants/v280/portfolio.json | 2 +- .../state/sim/variants/v281/portfolio.json | 2 +- .../state/sim/variants/v282/portfolio.json | 2 +- .../state/sim/variants/v283/portfolio.json | 2 +- .../state/sim/variants/v284/portfolio.json | 2 +- .../state/sim/variants/v285/portfolio.json | 2 +- .../state/sim/variants/v286/portfolio.json | 2 +- .../state/sim/variants/v287/portfolio.json | 2 +- .../state/sim/variants/v288/portfolio.json | 2 +- .../state/sim/variants/v29/portfolio.json | 2 +- .../state/sim/variants/v296/portfolio.json | 184 ++++++++++++++++++ .../state/sim/variants/v296/trades.jsonl | 11 ++ .../state/sim/variants/v298/portfolio.json | 77 ++++++++ .../state/sim/variants/v298/trades.jsonl | 3 + .../state/sim/variants/v299/portfolio.json | 182 +++++++++++++++++ .../state/sim/variants/v299/trades.jsonl | 9 + .../state/sim/variants/v3/portfolio.json | 4 +- .../state/sim/variants/v30/portfolio.json | 2 +- .../state/sim/variants/v300/portfolio.json | 13 ++ .../state/sim/variants/v31/portfolio.json | 4 +- .../state/sim/variants/v32/portfolio.json | 2 +- .../state/sim/variants/v33/portfolio.json | 2 +- .../state/sim/variants/v34/portfolio.json | 2 +- .../state/sim/variants/v35/portfolio.json | 4 +- .../state/sim/variants/v36/portfolio.json | 2 +- .../state/sim/variants/v37/portfolio.json | 2 +- .../state/sim/variants/v38/portfolio.json | 2 +- .../state/sim/variants/v39/portfolio.json | 4 +- .../state/sim/variants/v4/portfolio.json | 4 +- .../state/sim/variants/v40/portfolio.json | 4 +- .../state/sim/variants/v41/portfolio.json | 4 +- .../state/sim/variants/v42/portfolio.json | 4 +- .../state/sim/variants/v43/portfolio.json | 4 +- .../state/sim/variants/v44/portfolio.json | 4 +- .../state/sim/variants/v45/portfolio.json | 2 +- .../state/sim/variants/v46/portfolio.json | 2 +- .../state/sim/variants/v47/portfolio.json | 4 +- .../state/sim/variants/v48/portfolio.json | 4 +- .../state/sim/variants/v49/portfolio.json | 2 +- .../state/sim/variants/v5/portfolio.json | 2 +- .../state/sim/variants/v50/portfolio.json | 2 +- .../state/sim/variants/v51/portfolio.json | 2 +- .../state/sim/variants/v52/portfolio.json | 2 +- .../state/sim/variants/v53/portfolio.json | 2 +- .../state/sim/variants/v54/portfolio.json | 2 +- .../state/sim/variants/v55/portfolio.json | 2 +- .../state/sim/variants/v56/portfolio.json | 2 +- .../state/sim/variants/v57/portfolio.json | 2 +- .../state/sim/variants/v58/portfolio.json | 2 +- .../state/sim/variants/v59/portfolio.json | 2 +- .../state/sim/variants/v6/portfolio.json | 4 +- .../state/sim/variants/v60/portfolio.json | 2 +- .../state/sim/variants/v7/portfolio.json | 2 +- .../state/sim/variants/v8/portfolio.json | 2 +- .../state/sim/variants/v81/portfolio.json | 2 +- .../state/sim/variants/v82/portfolio.json | 2 +- .../state/sim/variants/v87/portfolio.json | 2 +- .../state/sim/variants/v88/portfolio.json | 2 +- .../state/sim/variants/v89/portfolio.json | 4 +- .../state/sim/variants/v9/portfolio.json | 2 +- .../state/sim/variants/v90/portfolio.json | 4 +- .../state/sim/variants/v91/portfolio.json | 2 +- .../state/sim/variants/v92/portfolio.json | 2 +- .../state/sim/variants/v93/portfolio.json | 2 +- .../state/sim/variants/v94/portfolio.json | 2 +- .../state/sim/variants/v95/portfolio.json | 2 +- .../state/sim/variants/v96/portfolio.json | 2 +- .../state/sim/variants/v97/portfolio.json | 4 +- .../state/sim/variants/v98/portfolio.json | 4 +- .../state/sim/variants/v99/portfolio.json | 2 +- .../stock/workspace/state/sim/watchlist.json | 10 + 230 files changed, 782 insertions(+), 261 deletions(-) create mode 100644 agents/stock/workspace/state/sim/variants/v296/portfolio.json create mode 100644 agents/stock/workspace/state/sim/variants/v296/trades.jsonl create mode 100644 agents/stock/workspace/state/sim/variants/v298/portfolio.json create mode 100644 agents/stock/workspace/state/sim/variants/v298/trades.jsonl create mode 100644 agents/stock/workspace/state/sim/variants/v299/portfolio.json create mode 100644 agents/stock/workspace/state/sim/variants/v299/trades.jsonl create mode 100644 agents/stock/workspace/state/sim/variants/v300/portfolio.json diff --git a/agents/stock/workspace/scripts/behive_web.py b/agents/stock/workspace/scripts/behive_web.py index ce45068..6aa787a 100644 --- a/agents/stock/workspace/scripts/behive_web.py +++ b/agents/stock/workspace/scripts/behive_web.py @@ -1907,7 +1907,7 @@ def _render_row(c: dict, source: str = 'watchlist') -> str: if mode == 'held': qty = c.get('held_qty', 0) - status_cell = f'보유 {qty:,} 주' + status_cell = f'📦 {qty:,}' accounts = c.get('held_accounts') or [] avg = c.get('held_avg_price', 0) held_row = ( @@ -2767,7 +2767,7 @@ def _render_holding_row(r: dict, total_value: int, show_day_change: bool = False
{_buy_rank_badge(buy_amount)}{stock}{acct_label}
-
보유 {qty:,} 주{_pending_badges_html(r)}{weight:.2f}%{star}
+
📦 {qty:,}{_pending_badges_html(r)}{weight:.2f}%{star}
{summary_journal_html}
@@ -4298,7 +4298,7 @@ details.row + .section-label { margin-top: 14px; padding-top: 24px; border-top-c .btn-tag-quick.active { color: #ff6b78; background: rgba(255,77,94,0.14); border-color: rgba(255,77,94,0.50); } .btn-tag-quick.active:hover { background: rgba(255,77,94,0.22); } .badge.watching { background: #1a1e2a; color: #7a8090; } -.badge.held { background: #2a1820; color: #ff8a96; border: 1px solid rgba(255,77,94,0.3); } +.badge.held { background: #2a1820; color: #ff8a96; border: 1px solid rgba(255,77,94,0.3); font-size: 8px; padding: 1px 5px; } .badge.pending-buy { background: #2a1822; color: #ff9fb3; border: 1px solid rgba(255,140,170,0.32); font-weight: 600; padding: 2px 6px; letter-spacing: 0; } .badge.pending-sell { background: #182030; color: #7fb8ff; border: 1px solid rgba(122,180,255,0.32); font-weight: 600; padding: 2px 6px; letter-spacing: 0; } dl.pending-detail { margin-top: 8px; padding-top: 8px; border-top: 1px dashed rgba(255,255,255,0.08); grid-template-columns: 92px minmax(0, 1fr); } diff --git a/agents/stock/workspace/sim/sim_web.py b/agents/stock/workspace/sim/sim_web.py index 7c7f920..8ba2f85 100644 --- a/agents/stock/workspace/sim/sim_web.py +++ b/agents/stock/workspace/sim/sim_web.py @@ -1122,7 +1122,7 @@ def _compare_panel() -> str: bt_row = '' rows += ( f'
' + f'data-ret="{ret}" data-held="{s.get("open_positions", 0)}" data-trades="{s.get("closed_trades", 0)}">' f'{rank_of[v["id"]]}위{_bear_chip_html(mp)}{_relax_chip_html(mp)}{_immediate_chip_html(mp)} {_vid_disp(vid)} ' f'{_esc(_cat_name(mp))}{tag}' f'🛒{s.get("open_positions", 0)} ' @@ -1155,29 +1155,45 @@ def _compare_panel() -> str: f'
' ) sortbar = ('
' - '' - '' - '' - '
') + '' + '' + '' + '') + # 각 버튼: 한 번 누를 때마다 오름/내림 토글. 기본 방향 — 손익/보유/거래=내림(desc), 평가(백테스트순위)=오름(asc) sort_js = """ """ fav_js = ("""