<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>취업하고싶어요</title>
    <link>https://floatboy91.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 4 Aug 2026 21:30:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>게임취업하고싶은 사람</managingEditor>
    <image>
      <title>취업하고싶어요</title>
      <url>https://tistory1.daumcdn.net/tistory/7519291/attach/535a94385fec4d2b9ad569ad4f180fd7</url>
      <link>https://floatboy91.tistory.com</link>
    </image>
    <item>
      <title>11주차 TIL - 전략을 개선 해보자</title>
      <link>https://floatboy91.tistory.com/89</link>
      <description>&lt;h2 data-end=&quot;145&quot; data-start=&quot;124&quot; data-ke-size=&quot;size26&quot;&gt;✅ 추가 가능한 전략적 개선 제안&lt;/h2&gt;
&lt;h3 data-end=&quot;188&quot; data-start=&quot;147&quot; data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;포트폴리오 최적화&lt;/b&gt; (Multi-symbol 배분 전략)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;337&quot; data-start=&quot;189&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;209&quot; data-start=&quot;189&quot;&gt;현재는 각 종목에 동일 자산 배분&lt;/li&gt;
&lt;li data-end=&quot;254&quot; data-start=&quot;210&quot;&gt;&amp;rarr; &lt;b&gt;예측 정확도, 변동성, 샤프 지수 기반으로 자산 비율 가중치 설정&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;255&quot;&gt;예시:&lt;/li&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;263&quot;&gt;
&lt;div&gt;python&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;복사&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;asset_weight = normalize(accuracy * sharpe / volatility) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;342&quot; data-start=&quot;339&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;381&quot; data-start=&quot;344&quot; data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;드로우다운 제한 청산 (Dynamic Stop)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;493&quot; data-start=&quot;382&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;406&quot; data-start=&quot;382&quot;&gt;MDD가 특정 % 초과시 전 포지션 청산&lt;/li&gt;
&lt;li data-end=&quot;420&quot; data-start=&quot;407&quot;&gt;자산 보존 우선 전략&lt;/li&gt;
&lt;li data-end=&quot;493&quot; data-start=&quot;421&quot;&gt;예시:&lt;/li&gt;
&lt;li data-end=&quot;493&quot; data-start=&quot;429&quot;&gt;
&lt;div&gt;python&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;복사&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span&gt; current_drawdown &amp;gt; max_allowed_dd: 청산 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;498&quot; data-start=&quot;495&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;531&quot; data-start=&quot;500&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;모델 리트레이닝 또는 슬라이딩 윈도우&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;689&quot; data-start=&quot;532&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;532&quot;&gt;현 구조는 과거 전체로 학습&lt;/li&gt;
&lt;li data-end=&quot;588&quot; data-start=&quot;550&quot;&gt;&amp;rarr; &lt;b&gt;최근 60~120일 기준 슬라이딩 학습&lt;/b&gt;으로 적응력 향상&lt;/li&gt;
&lt;li data-end=&quot;689&quot; data-start=&quot;589&quot;&gt;예시:&lt;/li&gt;
&lt;li data-end=&quot;689&quot; data-start=&quot;597&quot;&gt;
&lt;div&gt;python&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;복사&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;&lt;span&gt;in&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;range&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(window, &lt;/span&gt;&lt;span&gt;&lt;span&gt;len&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(df)): train_ensemble(df.iloc[i-window:i]) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;694&quot; data-start=&quot;691&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;730&quot; data-start=&quot;696&quot; data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;시간 필터링 (요일/시간 기반 무역 제한)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;881&quot; data-start=&quot;731&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;753&quot; data-start=&quot;731&quot;&gt;Crypto는 주말에도 변동성이 심함&lt;/li&gt;
&lt;li data-end=&quot;787&quot; data-start=&quot;754&quot;&gt;&amp;rarr; &lt;b&gt;일요일 제외&lt;/b&gt;, 혹은 &lt;b&gt;특정 시간대만 진입&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;881&quot; data-start=&quot;788&quot;&gt;예시:&lt;/li&gt;
&lt;li data-end=&quot;881&quot; data-start=&quot;796&quot;&gt;
&lt;div&gt;python&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;복사&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;df[&lt;/span&gt;&lt;span&gt;&lt;span&gt;'hour'&lt;/span&gt;&lt;/span&gt;&lt;span&gt;] = df.index.hour &lt;/span&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;not&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (hour &lt;/span&gt;&lt;span&gt;&lt;span&gt;in&lt;/span&gt;&lt;/span&gt;&lt;span&gt; trade_hours): &lt;/span&gt;&lt;span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;886&quot; data-start=&quot;883&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;910&quot; data-start=&quot;888&quot; data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;추가 피처 엔지니어링&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1051&quot; data-start=&quot;911&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;939&quot; data-start=&quot;911&quot;&gt;현재는 이동평균/RSI/Volatility 정도&lt;/li&gt;
&lt;li data-end=&quot;995&quot; data-start=&quot;940&quot;&gt;&amp;rarr; &lt;b&gt;MACD, %K, %D (Stochastic), CCI, OBV 등 기술지표 추가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1051&quot; data-start=&quot;996&quot;&gt;또는:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1051&quot; data-start=&quot;1004&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1014&quot; data-start=&quot;1004&quot;&gt;이동평균 기울기&lt;/li&gt;
&lt;li data-end=&quot;1030&quot; data-start=&quot;1017&quot;&gt;최근 고점/저점 돌파&lt;/li&gt;
&lt;li data-end=&quot;1051&quot; data-start=&quot;1033&quot;&gt;평균 거래량 대비 급등락 감지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1056&quot; data-start=&quot;1053&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1085&quot; data-start=&quot;1058&quot; data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;트레이딩 룰 강화: 전략 혼합&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1205&quot; data-start=&quot;1086&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1132&quot; data-start=&quot;1086&quot;&gt;Rule-based + ML 기반 신호를 혼합 (예: 둘 다 만족할 때만 진입)&lt;/li&gt;
&lt;li data-end=&quot;1205&quot; data-start=&quot;1133&quot;&gt;예시:&lt;/li&gt;
&lt;li data-end=&quot;1205&quot; data-start=&quot;1141&quot;&gt;
&lt;div&gt;python&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;복사&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;편집&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span&gt; alpha[i] &amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;0.6&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;and&lt;/span&gt;&lt;/span&gt;&lt;span&gt; signal[i] == &lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: 진입 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1210&quot; data-start=&quot;1207&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1241&quot; data-start=&quot;1212&quot; data-ke-size=&quot;size23&quot;&gt;7. &lt;b&gt;수익실현 전략 (TP 조건 도입)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1299&quot; data-start=&quot;1242&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1268&quot; data-start=&quot;1242&quot;&gt;현재는 예측 변화 or 손절로만 포지션 종료&lt;/li&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1269&quot;&gt;&amp;rarr; &lt;b&gt;목표 수익률 도달 시 분할청산&lt;/b&gt; 전략 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1304&quot; data-start=&quot;1301&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1336&quot; data-start=&quot;1306&quot; data-ke-size=&quot;size23&quot;&gt;8. &lt;b&gt;강화학습 기반 의사결정 (심화)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1411&quot; data-start=&quot;1337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1411&quot; data-start=&quot;1337&quot;&gt;stable-baselines3 등 라이브러리를 이용해&lt;br /&gt;&lt;b&gt;포지션 비율, 진입 타이밍을 학습&lt;/b&gt;하는 방법으로 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1416&quot; data-start=&quot;1413&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1432&quot; data-start=&quot;1418&quot; data-ke-size=&quot;size26&quot;&gt;  적용 순서 추천&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1549&quot; data-start=&quot;1434&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1454&quot; data-start=&quot;1434&quot;&gt;포트폴리오 자산 비중 최적화&lt;/li&gt;
&lt;li data-end=&quot;1479&quot; data-start=&quot;1455&quot;&gt;MACD, CCI 등 추가 기술지표&lt;/li&gt;
&lt;li data-end=&quot;1500&quot; data-start=&quot;1480&quot;&gt;슬라이딩 윈도우 기반 재학습&lt;/li&gt;
&lt;li data-end=&quot;1518&quot; data-start=&quot;1501&quot;&gt;요일/시간대 진입 제한&lt;/li&gt;
&lt;li data-end=&quot;1535&quot; data-start=&quot;1519&quot;&gt;드로우다운 기준 청산&lt;/li&gt;
&lt;li data-end=&quot;1549&quot; data-start=&quot;1536&quot;&gt;수익실현 TP 도입&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/89</guid>
      <comments>https://floatboy91.tistory.com/89#entry89comment</comments>
      <pubDate>Fri, 18 Apr 2025 20:41:44 +0900</pubDate>
    </item>
    <item>
      <title>11주차 TIL - 반복되는 학습</title>
      <link>https://floatboy91.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp;auto_trading_system/main.py&amp;nbsp;(리디자인:&amp;nbsp;조건&amp;nbsp;완화&amp;nbsp;및&amp;nbsp;손실&amp;nbsp;제어&amp;nbsp;포함) &lt;br /&gt;&lt;br /&gt;import&amp;nbsp;ccxt &lt;br /&gt;import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd &lt;br /&gt;import&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np &lt;br /&gt;import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt &lt;br /&gt;from&amp;nbsp;matplotlib&amp;nbsp;import&amp;nbsp;font_manager,&amp;nbsp;rc &lt;br /&gt;from&amp;nbsp;sklearn.model_selection&amp;nbsp;import&amp;nbsp;train_test_split &lt;br /&gt;from&amp;nbsp;sklearn.metrics&amp;nbsp;import&amp;nbsp;accuracy_score &lt;br /&gt;from&amp;nbsp;xgboost&amp;nbsp;import&amp;nbsp;XGBClassifier &lt;br /&gt;from&amp;nbsp;sklearn.ensemble&amp;nbsp;import&amp;nbsp;RandomForestClassifier &lt;br /&gt;from&amp;nbsp;lightgbm&amp;nbsp;import&amp;nbsp;LGBMClassifier &lt;br /&gt;import&amp;nbsp;traceback &lt;br /&gt;import&amp;nbsp;warnings &lt;br /&gt;&lt;br /&gt;warnings.filterwarnings('ignore') &lt;br /&gt;&lt;br /&gt;font_path&amp;nbsp;=&amp;nbsp;&quot;c:/Windows/Fonts/malgun.ttf&quot; &lt;br /&gt;font_name&amp;nbsp;=&amp;nbsp;font_manager.FontProperties(fname=font_path).get_name() &lt;br /&gt;rc('font',&amp;nbsp;family=font_name) &lt;br /&gt;&lt;br /&gt;symbols&amp;nbsp;=&amp;nbsp;[&quot;BTC/USDT&quot;,&amp;nbsp;&quot;ETH/USDT&quot;,&amp;nbsp;&quot;XRP/USDT&quot;] &lt;br /&gt;timeframe&amp;nbsp;=&amp;nbsp;'1d' &lt;br /&gt;limit&amp;nbsp;=&amp;nbsp;500 &lt;br /&gt;initial_cash&amp;nbsp;=&amp;nbsp;10000000 &lt;br /&gt;fee&amp;nbsp;=&amp;nbsp;0.001 &lt;br /&gt;risk_free_rate&amp;nbsp;=&amp;nbsp;0.01 &lt;br /&gt;stop_loss_pct&amp;nbsp;=&amp;nbsp;0.07&amp;nbsp;&amp;nbsp;#&amp;nbsp;7%&amp;nbsp;손절 &lt;br /&gt;lookback_window&amp;nbsp;=&amp;nbsp;100 &lt;br /&gt;min_accuracy_threshold&amp;nbsp;=&amp;nbsp;0.55 &lt;br /&gt;&lt;br /&gt;exchange&amp;nbsp;=&amp;nbsp;ccxt.binance() &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;get_strategy_config(symbol): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;symbol&amp;nbsp;==&amp;nbsp;&quot;XRP/USDT&quot;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{'use_predictive':&amp;nbsp;False,&amp;nbsp;'label_thresh':&amp;nbsp;0.02,&amp;nbsp;'vol_limit':&amp;nbsp;0.04} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;symbol&amp;nbsp;==&amp;nbsp;&quot;ETH/USDT&quot;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{'use_predictive':&amp;nbsp;True,&amp;nbsp;'label_thresh':&amp;nbsp;0.015,&amp;nbsp;'vol_limit':&amp;nbsp;0.05}&amp;nbsp;&amp;nbsp;#&amp;nbsp;조건&amp;nbsp;완화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{'use_predictive':&amp;nbsp;True,&amp;nbsp;'label_thresh':&amp;nbsp;0.01,&amp;nbsp;'vol_limit':&amp;nbsp;0.03} &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;fetch_ohlcv(symbol): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ohlcv&amp;nbsp;=&amp;nbsp;exchange.fetch_ohlcv(symbol,&amp;nbsp;timeframe=timeframe,&amp;nbsp;limit=limit) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(ohlcv,&amp;nbsp;columns=['timestamp',&amp;nbsp;'open',&amp;nbsp;'high',&amp;nbsp;'low',&amp;nbsp;'close',&amp;nbsp;'volume']) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['timestamp']&amp;nbsp;=&amp;nbsp;pd.to_datetime(df['timestamp'],&amp;nbsp;unit='ms') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.set_index('timestamp',&amp;nbsp;inplace=True) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;generate_indicators(df): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['ma20']&amp;nbsp;=&amp;nbsp;df['close'].rolling(20).mean() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['ma60']&amp;nbsp;=&amp;nbsp;df['close'].rolling(60).mean() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['rsi']&amp;nbsp;=&amp;nbsp;compute_rsi(df['close'],&amp;nbsp;14) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['volatility']&amp;nbsp;=&amp;nbsp;df['close'].pct_change().rolling(14).std() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['range_ratio']&amp;nbsp;=&amp;nbsp;(df['high']&amp;nbsp;-&amp;nbsp;df['low'])&amp;nbsp;/&amp;nbsp;df['open'] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['body_ratio']&amp;nbsp;=&amp;nbsp;abs(df['close']&amp;nbsp;-&amp;nbsp;df['open'])&amp;nbsp;/&amp;nbsp;df['open'] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['ma_gap']&amp;nbsp;=&amp;nbsp;df['ma20']&amp;nbsp;-&amp;nbsp;df['ma60'] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['trend_up']&amp;nbsp;=&amp;nbsp;df['ma20']&amp;nbsp;&amp;gt;&amp;nbsp;df['ma60'] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.dropna(inplace=True) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;compute_rsi(series,&amp;nbsp;period): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delta&amp;nbsp;=&amp;nbsp;series.diff() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gain&amp;nbsp;=&amp;nbsp;delta.where(delta&amp;nbsp;&amp;gt;&amp;nbsp;0,&amp;nbsp;0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loss&amp;nbsp;=&amp;nbsp;-delta.where(delta&amp;nbsp;&amp;lt;&amp;nbsp;0,&amp;nbsp;0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;avg_gain&amp;nbsp;=&amp;nbsp;gain.rolling(window=period).mean() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;avg_loss&amp;nbsp;=&amp;nbsp;loss.rolling(window=period).mean() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs&amp;nbsp;=&amp;nbsp;avg_gain&amp;nbsp;/&amp;nbsp;avg_loss &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;100&amp;nbsp;-&amp;nbsp;(100&amp;nbsp;/&amp;nbsp;(1&amp;nbsp;+&amp;nbsp;rs)) &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;rule_based_filter(df): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['signal']&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.loc[(df['ma20']&amp;nbsp;&amp;gt;&amp;nbsp;df['ma60'])&amp;nbsp;&amp;amp;&amp;nbsp;(df['rsi']&amp;nbsp;&amp;lt;&amp;nbsp;30),&amp;nbsp;'signal']&amp;nbsp;=&amp;nbsp;1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.loc[(df['ma20']&amp;nbsp;&amp;lt;&amp;nbsp;df['ma60'])&amp;nbsp;&amp;amp;&amp;nbsp;(df['rsi']&amp;nbsp;&amp;gt;&amp;nbsp;70),&amp;nbsp;'signal']&amp;nbsp;=&amp;nbsp;-1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;generate_target(df,&amp;nbsp;thresh): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;future_max&amp;nbsp;=&amp;nbsp;df['close'].shift(-1).rolling(window=3).max() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['target']&amp;nbsp;=&amp;nbsp;np.where(future_max&amp;nbsp;&amp;gt;&amp;nbsp;df['close']&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;+&amp;nbsp;thresh),&amp;nbsp;1,&amp;nbsp;0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;train_ensemble(df): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;df.copy().iloc[-lookback_window:] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;features&amp;nbsp;=&amp;nbsp;['ma20',&amp;nbsp;'ma60',&amp;nbsp;'rsi',&amp;nbsp;'volatility',&amp;nbsp;'range_ratio',&amp;nbsp;'body_ratio',&amp;nbsp;'ma_gap'] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X&amp;nbsp;=&amp;nbsp;df[features] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y&amp;nbsp;=&amp;nbsp;df['target'] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X_train,&amp;nbsp;X_test,&amp;nbsp;y_train,&amp;nbsp;y_test&amp;nbsp;=&amp;nbsp;train_test_split(X,&amp;nbsp;y,&amp;nbsp;shuffle=False,&amp;nbsp;test_size=0.2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;models&amp;nbsp;=&amp;nbsp;[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XGBClassifier(use_label_encoder=False,&amp;nbsp;eval_metric='logloss'), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RandomForestClassifier(n_estimators=100), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LGBMClassifier(min_gain_to_split=0,&amp;nbsp;min_data_in_leaf=1,&amp;nbsp;verbose=-1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preds&amp;nbsp;=&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;model&amp;nbsp;in&amp;nbsp;models: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.fit(X_train,&amp;nbsp;y_train) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preds.append(model.predict_proba(X)[:,&amp;nbsp;1]) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alpha&amp;nbsp;=&amp;nbsp;np.mean(preds,&amp;nbsp;axis=0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acc&amp;nbsp;=&amp;nbsp;accuracy_score(y_test,&amp;nbsp;(alpha[-len(y_test):]&amp;nbsp;&amp;gt;&amp;nbsp;0.5).astype(int)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[정확도]&amp;nbsp;{acc:.2f}&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;alpha&amp;nbsp;if&amp;nbsp;acc&amp;nbsp;&amp;gt;=&amp;nbsp;min_accuracy_threshold&amp;nbsp;else&amp;nbsp;None &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;run_backtest(df,&amp;nbsp;alpha,&amp;nbsp;use_predictive,&amp;nbsp;vol_limit): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;=&amp;nbsp;initial_cash &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry_price&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset_curve&amp;nbsp;=&amp;nbsp;[] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_returns&amp;nbsp;=&amp;nbsp;[] &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(1,&amp;nbsp;len(df)): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price&amp;nbsp;=&amp;nbsp;df['close'].iloc[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trend_up&amp;nbsp;=&amp;nbsp;df['trend_up'].iloc[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signal&amp;nbsp;=&amp;nbsp;df['signal'].iloc[i] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;alpha[i]&amp;nbsp;if&amp;nbsp;not&amp;nbsp;np.isnan(alpha[i])&amp;nbsp;else&amp;nbsp;0.5 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vol&amp;nbsp;=&amp;nbsp;df['volatility'].iloc[i] &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow_trade&amp;nbsp;=&amp;nbsp;False &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position_ratio&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;use_predictive&amp;nbsp;and&amp;nbsp;vol&amp;nbsp;&amp;lt;&amp;nbsp;vol_limit&amp;nbsp;and&amp;nbsp;(a&amp;nbsp;&amp;gt;&amp;nbsp;0.6&amp;nbsp;or&amp;nbsp;a&amp;nbsp;&amp;lt;&amp;nbsp;0.4): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position_ratio&amp;nbsp;=&amp;nbsp;min(max(abs(a&amp;nbsp;-&amp;nbsp;0.5)&amp;nbsp;*&amp;nbsp;2,&amp;nbsp;0.2),&amp;nbsp;0.8) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow_trade&amp;nbsp;=&amp;nbsp;True &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;not&amp;nbsp;use_predictive&amp;nbsp;and&amp;nbsp;signal&amp;nbsp;==&amp;nbsp;1: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position_ratio&amp;nbsp;=&amp;nbsp;0.5 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow_trade&amp;nbsp;=&amp;nbsp;True &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;allow_trade&amp;nbsp;and&amp;nbsp;coin&amp;nbsp;==&amp;nbsp;0: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;invest&amp;nbsp;=&amp;nbsp;asset&amp;nbsp;*&amp;nbsp;position_ratio&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;fee) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;invest&amp;nbsp;/&amp;nbsp;price &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;-=&amp;nbsp;invest &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry_price&amp;nbsp;=&amp;nbsp;price &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;+=&amp;nbsp;1 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;coin&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;and&amp;nbsp;price&amp;nbsp;&amp;lt;&amp;nbsp;entry_price&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;stop_loss_pct): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;+=&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;price&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;fee) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;+=&amp;nbsp;1 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;coin&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;and&amp;nbsp;((use_predictive&amp;nbsp;and&amp;nbsp;a&amp;nbsp;&amp;lt;&amp;nbsp;0.4)&amp;nbsp;or&amp;nbsp;(not&amp;nbsp;use_predictive&amp;nbsp;and&amp;nbsp;signal&amp;nbsp;==&amp;nbsp;-1)): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;+=&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;price&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;fee) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;+=&amp;nbsp;1 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_value&amp;nbsp;=&amp;nbsp;asset&amp;nbsp;+&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;price &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset_curve.append(total_value) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;i&amp;nbsp;&amp;gt;&amp;nbsp;1: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;(asset_curve[-1]&amp;nbsp;-&amp;nbsp;asset_curve[-2])&amp;nbsp;/&amp;nbsp;asset_curve[-2] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_returns.append(ret) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final&amp;nbsp;=&amp;nbsp;asset&amp;nbsp;+&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;df['close'].iloc[-1] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sharpe&amp;nbsp;=&amp;nbsp;(np.mean(daily_returns)&amp;nbsp;-&amp;nbsp;risk_free_rate&amp;nbsp;/&amp;nbsp;365)&amp;nbsp;/&amp;nbsp;(np.std(daily_returns)&amp;nbsp;+&amp;nbsp;1e-6)&amp;nbsp;*&amp;nbsp;np.sqrt(365) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mdd&amp;nbsp;=&amp;nbsp;np.max(np.maximum.accumulate(asset_curve)&amp;nbsp;-&amp;nbsp;asset_curve) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['asset_curve']&amp;nbsp;=&amp;nbsp;pd.Series(asset_curve,&amp;nbsp;index=df.index[-len(asset_curve):]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df,&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'최종&amp;nbsp;자산':&amp;nbsp;final, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'수익률':&amp;nbsp;(final&amp;nbsp;-&amp;nbsp;initial_cash)&amp;nbsp;/&amp;nbsp;initial_cash&amp;nbsp;*&amp;nbsp;100, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'거래&amp;nbsp;횟수':&amp;nbsp;trades, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Sharpe':&amp;nbsp;sharpe, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'MDD':&amp;nbsp;mdd &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;def&amp;nbsp;plot_results(df,&amp;nbsp;stats,&amp;nbsp;symbol): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.figure(figsize=(14,&amp;nbsp;6)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.subplot(2,&amp;nbsp;1,&amp;nbsp;1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['close'],&amp;nbsp;label='Close') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['ma20'],&amp;nbsp;label='MA20') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['ma60'],&amp;nbsp;label='MA60') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(f&quot;{symbol}&amp;nbsp;가격&amp;nbsp;및&amp;nbsp;지표&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.legend() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.grid() &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.subplot(2,&amp;nbsp;1,&amp;nbsp;2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['asset_curve'],&amp;nbsp;label='자산곡선',&amp;nbsp;color='green') &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(f&quot;{symbol}&amp;nbsp;수익곡선&amp;nbsp;/&amp;nbsp;최종:&amp;nbsp;{int(stats['최종&amp;nbsp;자산'])}원&amp;nbsp;|&amp;nbsp;수익률:&amp;nbsp;{stats['수익률']:.2f}%&amp;nbsp;|&amp;nbsp;거래:&amp;nbsp;{stats['거래&amp;nbsp;횟수']}회&amp;nbsp;|&amp;nbsp;Sharpe:&amp;nbsp;{stats['Sharpe']:.2f}&amp;nbsp;|&amp;nbsp;MDD:&amp;nbsp;{stats['MDD']:.2f}&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.legend() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.grid() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.tight_layout() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(f&quot;{symbol.replace('/',&amp;nbsp;'_')}_result.png&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show() &lt;br /&gt;&lt;br /&gt;if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;'__main__': &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;symbol&amp;nbsp;in&amp;nbsp;symbols: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[진행]&amp;nbsp;{symbol}&amp;nbsp;시작&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cfg&amp;nbsp;=&amp;nbsp;get_strategy_config(symbol) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;fetch_ohlcv(symbol) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;generate_indicators(df) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;rule_based_filter(df) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;generate_target(df,&amp;nbsp;cfg['label_thresh']) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alpha&amp;nbsp;=&amp;nbsp;train_ensemble(df) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;alpha&amp;nbsp;is&amp;nbsp;None: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[중단]&amp;nbsp;{symbol}:&amp;nbsp;모델&amp;nbsp;성능&amp;nbsp;미달&quot;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alpha&amp;nbsp;=&amp;nbsp;np.concatenate([np.full(len(df)&amp;nbsp;-&amp;nbsp;len(alpha),&amp;nbsp;np.nan),&amp;nbsp;alpha]) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df,&amp;nbsp;stats&amp;nbsp;=&amp;nbsp;run_backtest(df,&amp;nbsp;alpha,&amp;nbsp;cfg['use_predictive'],&amp;nbsp;cfg['vol_limit']) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot_results(df,&amp;nbsp;stats,&amp;nbsp;symbol) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;traceback.print_exc() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[오류]&amp;nbsp;{symbol}:&amp;nbsp;{str(e)}&quot;) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;[완료]&amp;nbsp;모든&amp;nbsp;종목&amp;nbsp;처리&amp;nbsp;종료&quot;) &lt;/p&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/88</guid>
      <comments>https://floatboy91.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 17 Apr 2025 20:55:56 +0900</pubDate>
    </item>
    <item>
      <title>11주차 TIL - 개선 또 개선</title>
      <link>https://floatboy91.tistory.com/87</link>
      <description>&lt;h2 data-end=&quot;96&quot; data-start=&quot;80&quot; data-ke-size=&quot;size26&quot;&gt;✅ 1. BTC/USDT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;214&quot; data-start=&quot;98&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;124&quot; data-start=&quot;98&quot;&gt;&lt;b&gt;최종 자산&lt;/b&gt;: 10,304,720원&lt;/li&gt;
&lt;li data-end=&quot;144&quot; data-start=&quot;125&quot;&gt;&lt;b&gt;수익률&lt;/b&gt;: +3.05%&lt;/li&gt;
&lt;li data-end=&quot;173&quot; data-start=&quot;145&quot;&gt;&lt;b&gt;Sharpe&lt;/b&gt;: 0.26 (양호한 편)&lt;/li&gt;
&lt;li data-end=&quot;195&quot; data-start=&quot;174&quot;&gt;&lt;b&gt;MDD&lt;/b&gt;: 429,808원&lt;/li&gt;
&lt;li data-end=&quot;214&quot; data-start=&quot;196&quot;&gt;&lt;b&gt;거래 횟수&lt;/b&gt;: 34회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;309&quot; data-start=&quot;216&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해석&lt;/b&gt;:&lt;br /&gt;보수적이지만 실현 가능한 성과.&lt;br /&gt;추세 구간에서 진입해 상승분을 적절히 취한 흔적이 보임.&lt;br /&gt;변동성이 낮은 시기에 거래를 자제한 것도 좋은 전략.&lt;/p&gt;
&lt;hr data-end=&quot;314&quot; data-start=&quot;311&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;332&quot; data-start=&quot;316&quot; data-ke-size=&quot;size26&quot;&gt;✅ 2. ETH/USDT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;460&quot; data-start=&quot;334&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;360&quot; data-start=&quot;334&quot;&gt;&lt;b&gt;최종 자산&lt;/b&gt;: 10,000,000원&lt;/li&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;361&quot;&gt;&lt;b&gt;수익률&lt;/b&gt;: 0.00%&lt;/li&gt;
&lt;li data-end=&quot;424&quot; data-start=&quot;380&quot;&gt;&lt;b&gt;Sharpe&lt;/b&gt;: -523.42 (거래가 없었기 때문에 왜곡된 수치)&lt;/li&gt;
&lt;li data-end=&quot;442&quot; data-start=&quot;425&quot;&gt;&lt;b&gt;MDD&lt;/b&gt;: 0.00&lt;/li&gt;
&lt;li data-end=&quot;460&quot; data-start=&quot;443&quot;&gt;&lt;b&gt;거래 횟수&lt;/b&gt;: 0회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;565&quot; data-start=&quot;462&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해석&lt;/b&gt;:&lt;br /&gt;예측 신호가 미약하거나 조건 충족이 없었음.&lt;br /&gt;시장 추세 인식 조건이 너무 보수적일 가능성 있음.&lt;br /&gt;&amp;rarr; &lt;b&gt;진입 기준 완화&lt;/b&gt;나 &lt;b&gt;시장 필터 조정&lt;/b&gt; 고려 필요.&lt;/p&gt;
&lt;hr data-end=&quot;570&quot; data-start=&quot;567&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;588&quot; data-start=&quot;572&quot; data-ke-size=&quot;size26&quot;&gt;✅ 3. XRP/USDT&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;700&quot; data-start=&quot;590&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;615&quot; data-start=&quot;590&quot;&gt;&lt;b&gt;최종 자산&lt;/b&gt;: 8,988,370원&lt;/li&gt;
&lt;li data-end=&quot;636&quot; data-start=&quot;616&quot;&gt;&lt;b&gt;수익률&lt;/b&gt;: -10.12%&lt;/li&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;637&quot;&gt;&lt;b&gt;Sharpe&lt;/b&gt;: -0.13&lt;/li&gt;
&lt;li data-end=&quot;682&quot; data-start=&quot;659&quot;&gt;&lt;b&gt;MDD&lt;/b&gt;: 3,489,943원&lt;/li&gt;
&lt;li data-end=&quot;700&quot; data-start=&quot;683&quot;&gt;&lt;b&gt;거래 횟수&lt;/b&gt;: 8회&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;832&quot; data-start=&quot;702&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해석&lt;/b&gt;:&lt;br /&gt;루즈한 진입 또는 진입 후 반등 실패로 손절 발생.&lt;br /&gt;상승 시기 후반에 진입한 흔적이 보이며, 하락장에서 손실 확대.&lt;br /&gt;&amp;rarr; &lt;b&gt;리스크 제어 조건 보강&lt;/b&gt;, &lt;b&gt;진입 타이밍 조정&lt;/b&gt;, &lt;b&gt;과매수 방지 룰&lt;/b&gt; 필요.&lt;/p&gt;
&lt;hr data-end=&quot;837&quot; data-start=&quot;834&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;853&quot; data-start=&quot;839&quot; data-ke-size=&quot;size26&quot;&gt;  전략 통합 평가&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;종목수익률거래 수Sharpe위험관리
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1093&quot; data-start=&quot;855&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1093&quot; data-start=&quot;949&quot;&gt;
&lt;tr data-end=&quot;991&quot; data-start=&quot;949&quot;&gt;
&lt;td data-end=&quot;960&quot; data-start=&quot;949&quot;&gt;BTC/USDT&lt;/td&gt;
&lt;td data-end=&quot;967&quot; data-start=&quot;960&quot;&gt;✅ 양호&lt;/td&gt;
&lt;td data-end=&quot;973&quot; data-start=&quot;967&quot;&gt;안정적&lt;/td&gt;
&lt;td data-end=&quot;981&quot; data-start=&quot;973&quot;&gt;+0.26&lt;/td&gt;
&lt;td data-end=&quot;991&quot; data-start=&quot;981&quot;&gt;  적절함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1042&quot; data-start=&quot;992&quot;&gt;
&lt;td data-end=&quot;1003&quot; data-start=&quot;992&quot;&gt;ETH/USDT&lt;/td&gt;
&lt;td data-end=&quot;1010&quot; data-start=&quot;1003&quot;&gt;⛔ 없음&lt;/td&gt;
&lt;td data-end=&quot;1019&quot; data-start=&quot;1010&quot;&gt;없음&lt;/td&gt;
&lt;td data-end=&quot;1027&quot; data-start=&quot;1019&quot;&gt;N/A&lt;/td&gt;
&lt;td data-end=&quot;1042&quot; data-start=&quot;1027&quot;&gt;  지나치게 보수적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1093&quot; data-start=&quot;1043&quot;&gt;
&lt;td data-end=&quot;1054&quot; data-start=&quot;1043&quot;&gt;XRP/USDT&lt;/td&gt;
&lt;td data-end=&quot;1061&quot; data-start=&quot;1054&quot;&gt;❌ 손실&lt;/td&gt;
&lt;td data-end=&quot;1070&quot; data-start=&quot;1061&quot;&gt;적음&lt;/td&gt;
&lt;td data-end=&quot;1078&quot; data-start=&quot;1070&quot;&gt;-0.13&lt;/td&gt;
&lt;td data-end=&quot;1093&quot; data-start=&quot;1078&quot;&gt;❗ 리스크 확대 우려&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1098&quot; data-start=&quot;1095&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1119&quot; data-start=&quot;1100&quot; data-ke-size=&quot;size26&quot;&gt;  제안할 다음 개선 포인트&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1367&quot; data-start=&quot;1121&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1121&quot;&gt;&lt;b&gt;ETH/USDT의 진입조건 완화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1208&quot; data-start=&quot;1149&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1179&quot; data-start=&quot;1149&quot;&gt;trend_up + vol 조건 너무 강할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1183&quot;&gt;예측 점수 기준만으로 진입해보는 실험 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1294&quot; data-start=&quot;1210&quot;&gt;&lt;b&gt;XRP/USDT 손실 관리 강화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1294&quot; data-start=&quot;1238&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1238&quot;&gt;예측 신뢰도 낮을 때 진입 금지&lt;/li&gt;
&lt;li data-end=&quot;1294&quot; data-start=&quot;1261&quot;&gt;볼린저밴드 + RSI 기반 &lt;b&gt;과매수 회피 필터&lt;/b&gt; 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1367&quot; data-start=&quot;1296&quot;&gt;&lt;b&gt;공통&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1367&quot; data-start=&quot;1309&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1330&quot; data-start=&quot;1309&quot;&gt;MDD 기반 조건부 전량 청산 전략&lt;/li&gt;
&lt;li data-end=&quot;1367&quot; data-start=&quot;1334&quot;&gt;전체 자산의 5~20%만 진입하는 &lt;b&gt;분산 진입 전략&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/87</guid>
      <comments>https://floatboy91.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 16 Apr 2025 22:31:38 +0900</pubDate>
    </item>
    <item>
      <title>11주차 TIL - 수익은 개선 되었느니라~</title>
      <link>https://floatboy91.tistory.com/86</link>
      <description>&lt;p data-end=&quot;135&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;이번 결과는 전략 리디자인(예측 확률 기반 포지션 사이징 + 시장 추세 조건 + 진입 확률 필터 + 라벨 완화)을 적용한 후 &lt;b&gt;수익성과 안정성 면에서 전반적인 도약&lt;/b&gt;을 보여줬어. 아래에 종목별로 상세 해설할게.&lt;/p&gt;
&lt;hr data-end=&quot;140&quot; data-start=&quot;137&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;158&quot; data-start=&quot;142&quot; data-ke-size=&quot;size26&quot;&gt;✅ BTC/USDT 분석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;항목결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;324&quot; data-start=&quot;200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;324&quot; data-start=&quot;228&quot;&gt;
&lt;tr data-end=&quot;251&quot; data-start=&quot;228&quot;&gt;
&lt;td data-end=&quot;236&quot; data-start=&quot;228&quot;&gt;최종 자산&lt;/td&gt;
&lt;td data-end=&quot;251&quot; data-start=&quot;236&quot;&gt;11,698,147원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;273&quot; data-start=&quot;252&quot;&gt;
&lt;td data-end=&quot;258&quot; data-start=&quot;252&quot;&gt;수익률&lt;/td&gt;
&lt;td data-end=&quot;273&quot; data-start=&quot;258&quot;&gt;&lt;b&gt;+16.98%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;289&quot; data-start=&quot;274&quot;&gt;
&lt;td data-end=&quot;281&quot; data-start=&quot;274&quot;&gt;거래 수&lt;/td&gt;
&lt;td data-end=&quot;289&quot; data-start=&quot;281&quot;&gt;118회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;307&quot; data-start=&quot;290&quot;&gt;
&lt;td data-end=&quot;299&quot; data-start=&quot;290&quot;&gt;Sharpe&lt;/td&gt;
&lt;td data-end=&quot;307&quot; data-start=&quot;299&quot;&gt;0.54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;324&quot; data-start=&quot;308&quot;&gt;
&lt;td data-end=&quot;314&quot; data-start=&quot;308&quot;&gt;MDD&lt;/td&gt;
&lt;td data-end=&quot;324&quot; data-start=&quot;314&quot;&gt;296만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;335&quot; data-start=&quot;326&quot; data-ke-size=&quot;size23&quot;&gt;  해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;459&quot; data-start=&quot;336&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;383&quot; data-start=&quot;336&quot;&gt;&lt;b&gt;진입 횟수가 대폭 증가(118회)&lt;/b&gt; &amp;rarr; 라벨 완화 + 확률 조건 완화의 영향&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;384&quot;&gt;하단 수익곡선에서 &lt;b&gt;꾸준한 수익성과 회복 탄력성&lt;/b&gt; 확인 가능&lt;/li&gt;
&lt;li data-end=&quot;459&quot; data-start=&quot;422&quot;&gt;Sharpe 지수가 0.5를 넘으며 &lt;b&gt;위험 대비 보상 우수&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;464&quot; data-start=&quot;461&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;482&quot; data-start=&quot;466&quot; data-ke-size=&quot;size26&quot;&gt;✅ ETH/USDT 분석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;항목결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;657&quot; data-start=&quot;524&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;657&quot; data-start=&quot;552&quot;&gt;
&lt;tr data-end=&quot;575&quot; data-start=&quot;552&quot;&gt;
&lt;td data-end=&quot;560&quot; data-start=&quot;552&quot;&gt;최종 자산&lt;/td&gt;
&lt;td data-end=&quot;575&quot; data-start=&quot;560&quot;&gt;14,382,651원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;597&quot; data-start=&quot;576&quot;&gt;
&lt;td data-end=&quot;582&quot; data-start=&quot;576&quot;&gt;수익률&lt;/td&gt;
&lt;td data-end=&quot;597&quot; data-start=&quot;582&quot;&gt;&lt;b&gt;+43.83%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;613&quot; data-start=&quot;598&quot;&gt;
&lt;td data-end=&quot;605&quot; data-start=&quot;598&quot;&gt;거래 수&lt;/td&gt;
&lt;td data-end=&quot;613&quot; data-start=&quot;605&quot;&gt;104회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;640&quot; data-start=&quot;614&quot;&gt;
&lt;td data-end=&quot;623&quot; data-start=&quot;614&quot;&gt;Sharpe&lt;/td&gt;
&lt;td data-end=&quot;640&quot; data-start=&quot;623&quot;&gt;1.17 (&lt;b&gt;우수&lt;/b&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;657&quot; data-start=&quot;641&quot;&gt;
&lt;td data-end=&quot;647&quot; data-start=&quot;641&quot;&gt;MDD&lt;/td&gt;
&lt;td data-end=&quot;657&quot; data-start=&quot;647&quot;&gt;264만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;668&quot; data-start=&quot;659&quot; data-ke-size=&quot;size23&quot;&gt;  해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;796&quot; data-start=&quot;669&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;708&quot; data-start=&quot;669&quot;&gt;수익곡선이 중후반부에 급등하며 &lt;b&gt;우상향 안정적 수익 구조 형성&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;709&quot;&gt;Sharpe &amp;gt; 1.0 &amp;rarr; &lt;b&gt;전문가 전략 수준의 수익/위험 균형&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;796&quot; data-start=&quot;750&quot;&gt;가장 이상적인 결과 (전략 전환 + 포지션 조절 + 진입확률 필터의 총합 효과)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;801&quot; data-start=&quot;798&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;819&quot; data-start=&quot;803&quot; data-ke-size=&quot;size26&quot;&gt;❌ XRP/USDT 분석&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;항목결과
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;984&quot; data-start=&quot;861&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;984&quot; data-start=&quot;889&quot;&gt;
&lt;tr data-end=&quot;911&quot; data-start=&quot;889&quot;&gt;
&lt;td data-end=&quot;897&quot; data-start=&quot;889&quot;&gt;최종 자산&lt;/td&gt;
&lt;td data-end=&quot;911&quot; data-start=&quot;897&quot;&gt;6,161,369원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;933&quot; data-start=&quot;912&quot;&gt;
&lt;td data-end=&quot;918&quot; data-start=&quot;912&quot;&gt;수익률&lt;/td&gt;
&lt;td data-end=&quot;933&quot; data-start=&quot;918&quot;&gt;&lt;b&gt;-38.39%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;948&quot; data-start=&quot;934&quot;&gt;
&lt;td data-end=&quot;941&quot; data-start=&quot;934&quot;&gt;거래 수&lt;/td&gt;
&lt;td data-end=&quot;948&quot; data-start=&quot;941&quot;&gt;12회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;967&quot; data-start=&quot;949&quot;&gt;
&lt;td data-end=&quot;958&quot; data-start=&quot;949&quot;&gt;Sharpe&lt;/td&gt;
&lt;td data-end=&quot;967&quot; data-start=&quot;958&quot;&gt;-0.71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;984&quot; data-start=&quot;968&quot;&gt;
&lt;td data-end=&quot;974&quot; data-start=&quot;968&quot;&gt;MDD&lt;/td&gt;
&lt;td data-end=&quot;984&quot; data-start=&quot;974&quot;&gt;585만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;995&quot; data-start=&quot;986&quot; data-ke-size=&quot;size23&quot;&gt;  해설&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1123&quot; data-start=&quot;996&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1041&quot; data-start=&quot;996&quot;&gt;&lt;b&gt;거래 수 12회&lt;/b&gt; &amp;rarr; 여전히 예측력이 낮고 진입 기준 충족이 어려운 구조&lt;/li&gt;
&lt;li data-end=&quot;1078&quot; data-start=&quot;1042&quot;&gt;초반 수익 후 &lt;b&gt;지속적인 하락 &amp;rarr; 모델의 학습/예측 한계&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1123&quot; data-start=&quot;1079&quot;&gt;XRP는 기술적 노이즈가 많거나 예측 모델과 궁합이 맞지 않는 종목일 가능성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1128&quot; data-start=&quot;1125&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1142&quot; data-start=&quot;1130&quot; data-ke-size=&quot;size26&quot;&gt;✅ 종합 비교 표&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;종목수익률Sharpe거래 수MDD전략 평가
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1425&quot; data-start=&quot;1144&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1425&quot; data-start=&quot;1245&quot;&gt;
&lt;tr data-end=&quot;1301&quot; data-start=&quot;1245&quot;&gt;
&lt;td data-end=&quot;1255&quot; data-start=&quot;1245&quot;&gt;&lt;b&gt;BTC&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1265&quot; data-start=&quot;1255&quot;&gt;+16.98%&lt;/td&gt;
&lt;td data-end=&quot;1272&quot; data-start=&quot;1265&quot;&gt;0.54&lt;/td&gt;
&lt;td data-end=&quot;1278&quot; data-start=&quot;1272&quot;&gt;118&lt;/td&gt;
&lt;td data-end=&quot;1285&quot; data-start=&quot;1278&quot;&gt;296만&lt;/td&gt;
&lt;td data-end=&quot;1301&quot; data-start=&quot;1285&quot;&gt;안정적 수익 구조 형성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1367&quot; data-start=&quot;1302&quot;&gt;
&lt;td data-end=&quot;1312&quot; data-start=&quot;1302&quot;&gt;&lt;b&gt;ETH&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1322&quot; data-start=&quot;1312&quot;&gt;+43.83%&lt;/td&gt;
&lt;td data-end=&quot;1333&quot; data-start=&quot;1322&quot;&gt;&lt;b&gt;1.17&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1339&quot; data-start=&quot;1333&quot;&gt;104&lt;/td&gt;
&lt;td data-end=&quot;1346&quot; data-start=&quot;1339&quot;&gt;264만&lt;/td&gt;
&lt;td data-end=&quot;1367&quot; data-start=&quot;1346&quot;&gt;&lt;b&gt;가장 이상적인 전략 적용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1425&quot; data-start=&quot;1368&quot;&gt;
&lt;td data-end=&quot;1378&quot; data-start=&quot;1368&quot;&gt;&lt;b&gt;XRP&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;1388&quot; data-start=&quot;1378&quot;&gt;-38.39%&lt;/td&gt;
&lt;td data-end=&quot;1396&quot; data-start=&quot;1388&quot;&gt;-0.71&lt;/td&gt;
&lt;td data-end=&quot;1401&quot; data-start=&quot;1396&quot;&gt;12&lt;/td&gt;
&lt;td data-end=&quot;1408&quot; data-start=&quot;1401&quot;&gt;585만&lt;/td&gt;
&lt;td data-end=&quot;1425&quot; data-start=&quot;1408&quot;&gt;학습 성능 및 전략 미흡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/86</guid>
      <comments>https://floatboy91.tistory.com/86#entry86comment</comments>
      <pubDate>Tue, 15 Apr 2025 20:58:34 +0900</pubDate>
    </item>
    <item>
      <title>11주차 TIL - 그래도 갈길이 멀다</title>
      <link>https://floatboy91.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;#&amp;nbsp;auto_trading_system/main.py&amp;nbsp;(종목별&amp;nbsp;전략&amp;nbsp;최적화&amp;nbsp;+&amp;nbsp;앙상블&amp;nbsp;모델&amp;nbsp;+&amp;nbsp;실시간&amp;nbsp;대응&amp;nbsp;구조) &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;ccxt &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;matplotlib&amp;nbsp;import&amp;nbsp;font_manager,&amp;nbsp;rc &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;sklearn.model_selection&amp;nbsp;import&amp;nbsp;train_test_split &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;sklearn.metrics&amp;nbsp;import&amp;nbsp;accuracy_score &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;xgboost&amp;nbsp;import&amp;nbsp;XGBClassifier &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;sklearn.ensemble&amp;nbsp;import&amp;nbsp;RandomForestClassifier &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;lightgbm&amp;nbsp;import&amp;nbsp;LGBMClassifier &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;warnings &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;tqdm&amp;nbsp;import&amp;nbsp;tqdm &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;warnings.filterwarnings('ignore') &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;폰트&amp;nbsp;설정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;font_path&amp;nbsp;=&amp;nbsp;&quot;c:/Windows/Fonts/malgun.ttf&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;font_name&amp;nbsp;=&amp;nbsp;font_manager.FontProperties(fname=font_path).get_name() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;rc('font',&amp;nbsp;family=font_name) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;설정값 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;symbols&amp;nbsp;=&amp;nbsp;[&quot;BTC/USDT&quot;,&amp;nbsp;&quot;ETH/USDT&quot;,&amp;nbsp;&quot;XRP/USDT&quot;] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;exchange&amp;nbsp;=&amp;nbsp;ccxt.binance() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;timeframe&amp;nbsp;=&amp;nbsp;'1d' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;limit&amp;nbsp;=&amp;nbsp;500 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;initial_cash&amp;nbsp;=&amp;nbsp;10000000 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;fee&amp;nbsp;=&amp;nbsp;0.001 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;risk_free_rate&amp;nbsp;=&amp;nbsp;0.01 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;stop_loss_pct&amp;nbsp;=&amp;nbsp;0.1 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;min_accuracy_threshold&amp;nbsp;=&amp;nbsp;0.55 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;lookback_window&amp;nbsp;=&amp;nbsp;100 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;종목별&amp;nbsp;전략&amp;nbsp;설정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;get_strategy_config(symbol): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;symbol&amp;nbsp;==&amp;nbsp;&quot;XRP/USDT&quot;: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{'use_predictive':&amp;nbsp;False,&amp;nbsp;'label_thresh':&amp;nbsp;0.02} &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;symbol&amp;nbsp;==&amp;nbsp;&quot;ETH/USDT&quot;: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{'use_predictive':&amp;nbsp;True,&amp;nbsp;'label_thresh':&amp;nbsp;0.015} &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{'use_predictive':&amp;nbsp;True,&amp;nbsp;'label_thresh':&amp;nbsp;0.01} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;데이터&amp;nbsp;수집 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;fetch_ohlcv(symbol): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ohlcv&amp;nbsp;=&amp;nbsp;exchange.fetch_ohlcv(symbol,&amp;nbsp;timeframe=timeframe,&amp;nbsp;limit=limit) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(ohlcv,&amp;nbsp;columns=['timestamp',&amp;nbsp;'open',&amp;nbsp;'high',&amp;nbsp;'low',&amp;nbsp;'close',&amp;nbsp;'volume']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['timestamp']&amp;nbsp;=&amp;nbsp;pd.to_datetime(df['timestamp'],&amp;nbsp;unit='ms') &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.set_index('timestamp',&amp;nbsp;inplace=True) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;지표&amp;nbsp;생성 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;generate_indicators(df): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['ma20']&amp;nbsp;=&amp;nbsp;df['close'].rolling(20).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['ma60']&amp;nbsp;=&amp;nbsp;df['close'].rolling(60).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['rsi']&amp;nbsp;=&amp;nbsp;compute_rsi(df['close'],&amp;nbsp;14) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['volatility']&amp;nbsp;=&amp;nbsp;df['close'].pct_change().rolling(14).std() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['range_ratio']&amp;nbsp;=&amp;nbsp;(df['high']&amp;nbsp;-&amp;nbsp;df['low'])&amp;nbsp;/&amp;nbsp;df['open'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['body_ratio']&amp;nbsp;=&amp;nbsp;abs(df['close']&amp;nbsp;-&amp;nbsp;df['open'])&amp;nbsp;/&amp;nbsp;df['open'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['ma_gap']&amp;nbsp;=&amp;nbsp;df['ma20']&amp;nbsp;-&amp;nbsp;df['ma60'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['trend_up']&amp;nbsp;=&amp;nbsp;df['ma20']&amp;nbsp;&amp;gt;&amp;nbsp;df['ma60'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.dropna(inplace=True) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;compute_rsi(series,&amp;nbsp;period): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delta&amp;nbsp;=&amp;nbsp;series.diff() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gain&amp;nbsp;=&amp;nbsp;delta.where(delta&amp;nbsp;&amp;gt;&amp;nbsp;0,&amp;nbsp;0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loss&amp;nbsp;=&amp;nbsp;-delta.where(delta&amp;nbsp;&amp;lt;&amp;nbsp;0,&amp;nbsp;0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;avg_gain&amp;nbsp;=&amp;nbsp;gain.rolling(window=period).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;avg_loss&amp;nbsp;=&amp;nbsp;loss.rolling(window=period).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs&amp;nbsp;=&amp;nbsp;avg_gain&amp;nbsp;/&amp;nbsp;avg_loss &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;100&amp;nbsp;-&amp;nbsp;(100&amp;nbsp;/&amp;nbsp;(1&amp;nbsp;+&amp;nbsp;rs)) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;룰&amp;nbsp;기반&amp;nbsp;필터 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;rule_based_filter(df): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['signal']&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.loc[(df['ma20']&amp;nbsp;&amp;gt;&amp;nbsp;df['ma60'])&amp;nbsp;&amp;amp;&amp;nbsp;(df['rsi']&amp;nbsp;&amp;lt;&amp;nbsp;30),&amp;nbsp;'signal']&amp;nbsp;=&amp;nbsp;1 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.loc[(df['ma20']&amp;nbsp;&amp;lt;&amp;nbsp;df['ma60'])&amp;nbsp;&amp;amp;&amp;nbsp;(df['rsi']&amp;nbsp;&amp;gt;&amp;nbsp;70),&amp;nbsp;'signal']&amp;nbsp;=&amp;nbsp;-1 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;라벨링 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;generate_target(df,&amp;nbsp;thresh): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;future_max&amp;nbsp;=&amp;nbsp;df['close'].shift(-1).rolling(window=3).max() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['target']&amp;nbsp;=&amp;nbsp;np.where(future_max&amp;nbsp;&amp;gt;&amp;nbsp;df['close']&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;+&amp;nbsp;thresh),&amp;nbsp;1,&amp;nbsp;0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;앙상블&amp;nbsp;모델&amp;nbsp;학습&amp;nbsp;(XGB&amp;nbsp;+&amp;nbsp;RF&amp;nbsp;+&amp;nbsp;LGBM&amp;nbsp;평균) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;train_ensemble(df): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;df.copy().iloc[-lookback_window:] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;features&amp;nbsp;=&amp;nbsp;['ma20',&amp;nbsp;'ma60',&amp;nbsp;'rsi',&amp;nbsp;'volatility',&amp;nbsp;'range_ratio',&amp;nbsp;'body_ratio',&amp;nbsp;'ma_gap'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X&amp;nbsp;=&amp;nbsp;df[features] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y&amp;nbsp;=&amp;nbsp;df['target'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X_train,&amp;nbsp;X_test,&amp;nbsp;y_train,&amp;nbsp;y_test&amp;nbsp;=&amp;nbsp;train_test_split(X,&amp;nbsp;y,&amp;nbsp;shuffle=False,&amp;nbsp;test_size=0.2) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;models&amp;nbsp;=&amp;nbsp;[ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XGBClassifier(use_label_encoder=False,&amp;nbsp;eval_metric='logloss'), &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RandomForestClassifier(n_estimators=100), &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LGBMClassifier() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preds&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;model&amp;nbsp;in&amp;nbsp;models: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.fit(X_train,&amp;nbsp;y_train) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;preds.append(model.predict_proba(X)[:,&amp;nbsp;1]) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alpha&amp;nbsp;=&amp;nbsp;np.mean(preds,&amp;nbsp;axis=0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acc&amp;nbsp;=&amp;nbsp;accuracy_score(y_test,&amp;nbsp;(alpha[-len(y_test):]&amp;nbsp;&amp;gt;&amp;nbsp;0.5).astype(int)) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[정확도]&amp;nbsp;{acc:.2f}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;alpha&amp;nbsp;if&amp;nbsp;acc&amp;nbsp;&amp;gt;=&amp;nbsp;min_accuracy_threshold&amp;nbsp;else&amp;nbsp;None &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;백테스트 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;run_backtest(df,&amp;nbsp;alpha,&amp;nbsp;use_predictive): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;=&amp;nbsp;initial_cash &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry_price&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset_curve&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_returns&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(1,&amp;nbsp;len(df)): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price&amp;nbsp;=&amp;nbsp;df['close'].iloc[i] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trend_up&amp;nbsp;=&amp;nbsp;df['trend_up'].iloc[i] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signal&amp;nbsp;=&amp;nbsp;df['signal'].iloc[i] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;alpha[i] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vol&amp;nbsp;=&amp;nbsp;df['volatility'].iloc[i] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow_trade&amp;nbsp;=&amp;nbsp;False &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position_ratio&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;use_predictive&amp;nbsp;and&amp;nbsp;trend_up&amp;nbsp;and&amp;nbsp;vol&amp;nbsp;&amp;lt;&amp;nbsp;0.03&amp;nbsp;and&amp;nbsp;(a&amp;nbsp;&amp;gt;&amp;nbsp;0.6&amp;nbsp;or&amp;nbsp;a&amp;nbsp;&amp;lt;&amp;nbsp;0.4): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position_ratio&amp;nbsp;=&amp;nbsp;min(max(a,&amp;nbsp;0.4),&amp;nbsp;0.9) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow_trade&amp;nbsp;=&amp;nbsp;True &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;not&amp;nbsp;use_predictive&amp;nbsp;and&amp;nbsp;signal&amp;nbsp;==&amp;nbsp;1: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position_ratio&amp;nbsp;=&amp;nbsp;0.5 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow_trade&amp;nbsp;=&amp;nbsp;True &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;allow_trade&amp;nbsp;and&amp;nbsp;coin&amp;nbsp;==&amp;nbsp;0: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;invest&amp;nbsp;=&amp;nbsp;asset&amp;nbsp;*&amp;nbsp;position_ratio&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;fee) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;invest&amp;nbsp;/&amp;nbsp;price &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;-=&amp;nbsp;invest &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry_price&amp;nbsp;=&amp;nbsp;price &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;+=&amp;nbsp;1 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;coin&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;and&amp;nbsp;price&amp;nbsp;&amp;lt;&amp;nbsp;entry_price&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;stop_loss_pct): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;+=&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;price&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;fee) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;+=&amp;nbsp;1 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;coin&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;and&amp;nbsp;((use_predictive&amp;nbsp;and&amp;nbsp;a&amp;nbsp;&amp;lt;&amp;nbsp;0.4)&amp;nbsp;or&amp;nbsp;(not&amp;nbsp;use_predictive&amp;nbsp;and&amp;nbsp;signal&amp;nbsp;==&amp;nbsp;-1)): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset&amp;nbsp;+=&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;price&amp;nbsp;*&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;fee) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coin&amp;nbsp;=&amp;nbsp;0 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trades&amp;nbsp;+=&amp;nbsp;1 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_value&amp;nbsp;=&amp;nbsp;asset&amp;nbsp;+&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;price &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asset_curve.append(total_value) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;i&amp;nbsp;&amp;gt;&amp;nbsp;1: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;(asset_curve[-1]&amp;nbsp;-&amp;nbsp;asset_curve[-2])&amp;nbsp;/&amp;nbsp;asset_curve[-2] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_returns.append(ret) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final&amp;nbsp;=&amp;nbsp;asset&amp;nbsp;+&amp;nbsp;coin&amp;nbsp;*&amp;nbsp;df['close'].iloc[-1] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sharpe&amp;nbsp;=&amp;nbsp;(np.mean(daily_returns)&amp;nbsp;-&amp;nbsp;risk_free_rate&amp;nbsp;/&amp;nbsp;365)&amp;nbsp;/&amp;nbsp;(np.std(daily_returns)&amp;nbsp;+&amp;nbsp;1e-6)&amp;nbsp;*&amp;nbsp;np.sqrt(365) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mdd&amp;nbsp;=&amp;nbsp;np.max(np.maximum.accumulate(asset_curve)&amp;nbsp;-&amp;nbsp;asset_curve) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df['asset_curve']&amp;nbsp;=&amp;nbsp;pd.Series(asset_curve,&amp;nbsp;index=df.index[-len(asset_curve):]) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df,&amp;nbsp;{ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'최종&amp;nbsp;자산':&amp;nbsp;final, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'수익률':&amp;nbsp;(final&amp;nbsp;-&amp;nbsp;initial_cash)&amp;nbsp;/&amp;nbsp;initial_cash&amp;nbsp;*&amp;nbsp;100, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'거래&amp;nbsp;횟수':&amp;nbsp;trades, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Sharpe':&amp;nbsp;sharpe, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'MDD':&amp;nbsp;mdd &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;시각화 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;def&amp;nbsp;plot_results(df,&amp;nbsp;stats,&amp;nbsp;symbol): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.figure(figsize=(14,&amp;nbsp;6)) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.subplot(2,&amp;nbsp;1,&amp;nbsp;1) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['close'],&amp;nbsp;label='Close') &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['ma20'],&amp;nbsp;label='MA20') &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['ma60'],&amp;nbsp;label='MA60') &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(f&quot;{symbol}&amp;nbsp;가격&amp;nbsp;및&amp;nbsp;지표&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.legend() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.grid() &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.subplot(2,&amp;nbsp;1,&amp;nbsp;2) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(df['asset_curve'],&amp;nbsp;label='자산곡선',&amp;nbsp;color='green') &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(f&quot;{symbol}&amp;nbsp;수익곡선&amp;nbsp;/&amp;nbsp;최종:&amp;nbsp;{int(stats['최종&amp;nbsp;자산'])}원&amp;nbsp;|&amp;nbsp;수익률:&amp;nbsp;{stats['수익률']:.2f}%&amp;nbsp;|&amp;nbsp;거래:&amp;nbsp;{stats['거래&amp;nbsp;횟수']}회&amp;nbsp;|&amp;nbsp;Sharpe:&amp;nbsp;{stats['Sharpe']:.2f}&amp;nbsp;|&amp;nbsp;MDD:&amp;nbsp;{stats['MDD']:.2f}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.legend() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.grid() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.tight_layout() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show() &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;실행 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;'__main__': &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;symbol&amp;nbsp;in&amp;nbsp;symbols: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[진행]&amp;nbsp;{symbol}&amp;nbsp;시작&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cfg&amp;nbsp;=&amp;nbsp;get_strategy_config(symbol) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;fetch_ohlcv(symbol) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;generate_indicators(df) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;rule_based_filter(df) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;generate_target(df,&amp;nbsp;cfg['label_thresh']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alpha&amp;nbsp;=&amp;nbsp;train_ensemble(df) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;alpha&amp;nbsp;is&amp;nbsp;None: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[중단]&amp;nbsp;{symbol}:&amp;nbsp;모델&amp;nbsp;성능&amp;nbsp;미달&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df,&amp;nbsp;stats&amp;nbsp;=&amp;nbsp;run_backtest(df,&amp;nbsp;alpha,&amp;nbsp;cfg['use_predictive']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plot_results(df,&amp;nbsp;stats,&amp;nbsp;symbol) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;[오류]&amp;nbsp;{symbol}:&amp;nbsp;{str(e)}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;[완료]&amp;nbsp;모든&amp;nbsp;종목&amp;nbsp;처리&amp;nbsp;종료&quot;)&lt;/span&gt; &lt;/p&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/85</guid>
      <comments>https://floatboy91.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 14 Apr 2025 20:38:25 +0900</pubDate>
    </item>
    <item>
      <title>10주차 TIL - 진짜 자동매매가 작동할까?</title>
      <link>https://floatboy91.tistory.com/84</link>
      <description>&lt;h2 data-end=&quot;158&quot; data-start=&quot;142&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ BTC/USDT 분석&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;항목결과&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;324&quot; data-start=&quot;200&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;324&quot; data-start=&quot;228&quot;&gt;
&lt;tr data-end=&quot;251&quot; data-start=&quot;228&quot;&gt;
&lt;td data-end=&quot;236&quot; data-start=&quot;228&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최종 자산&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;251&quot; data-start=&quot;236&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11,698,147원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;273&quot; data-start=&quot;252&quot;&gt;
&lt;td data-end=&quot;258&quot; data-start=&quot;252&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;수익률&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;273&quot; data-start=&quot;258&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;+16.98%&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;289&quot; data-start=&quot;274&quot;&gt;
&lt;td data-end=&quot;281&quot; data-start=&quot;274&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;거래 수&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;289&quot; data-start=&quot;281&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;118회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;307&quot; data-start=&quot;290&quot;&gt;
&lt;td data-end=&quot;299&quot; data-start=&quot;290&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sharpe&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;307&quot; data-start=&quot;299&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;0.54&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;324&quot; data-start=&quot;308&quot;&gt;
&lt;td data-end=&quot;314&quot; data-start=&quot;308&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MDD&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;324&quot; data-start=&quot;314&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;296만 원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;335&quot; data-start=&quot;326&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  해설&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;459&quot; data-start=&quot;336&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;383&quot; data-start=&quot;336&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;진입 횟수가 대폭 증가(118회)&lt;/b&gt; &amp;rarr; 라벨 완화 + 확률 조건 완화의 영향&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;384&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하단 수익곡선에서 &lt;b&gt;꾸준한 수익성과 회복 탄력성&lt;/b&gt; 확인 가능&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;459&quot; data-start=&quot;422&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sharpe 지수가 0.5를 넘으며 &lt;b&gt;위험 대비 보상 우수&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;464&quot; data-start=&quot;461&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;482&quot; data-start=&quot;466&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ ETH/USDT 분석&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;항목결과&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;657&quot; data-start=&quot;524&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;657&quot; data-start=&quot;552&quot;&gt;
&lt;tr data-end=&quot;575&quot; data-start=&quot;552&quot;&gt;
&lt;td data-end=&quot;560&quot; data-start=&quot;552&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최종 자산&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;575&quot; data-start=&quot;560&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;14,382,651원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;597&quot; data-start=&quot;576&quot;&gt;
&lt;td data-end=&quot;582&quot; data-start=&quot;576&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;수익률&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;597&quot; data-start=&quot;582&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;+43.83%&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;613&quot; data-start=&quot;598&quot;&gt;
&lt;td data-end=&quot;605&quot; data-start=&quot;598&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;거래 수&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;613&quot; data-start=&quot;605&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;104회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;640&quot; data-start=&quot;614&quot;&gt;
&lt;td data-end=&quot;623&quot; data-start=&quot;614&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sharpe&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;640&quot; data-start=&quot;623&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1.17 (&lt;b&gt;우수&lt;/b&gt;)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;657&quot; data-start=&quot;641&quot;&gt;
&lt;td data-end=&quot;647&quot; data-start=&quot;641&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MDD&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;657&quot; data-start=&quot;647&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;264만 원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;668&quot; data-start=&quot;659&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  해설&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;796&quot; data-start=&quot;669&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;708&quot; data-start=&quot;669&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;수익곡선이 중후반부에 급등하며 &lt;b&gt;우상향 안정적 수익 구조 형성&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;749&quot; data-start=&quot;709&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sharpe &amp;gt; 1.0 &amp;rarr; &lt;b&gt;전문가 전략 수준의 수익/위험 균형&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;796&quot; data-start=&quot;750&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;가장 이상적인 결과 (전략 전환 + 포지션 조절 + 진입확률 필터의 총합 효과)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;801&quot; data-start=&quot;798&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;819&quot; data-start=&quot;803&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;❌ XRP/USDT 분석&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;항목결과&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;984&quot; data-start=&quot;861&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;984&quot; data-start=&quot;889&quot;&gt;
&lt;tr data-end=&quot;911&quot; data-start=&quot;889&quot;&gt;
&lt;td data-end=&quot;897&quot; data-start=&quot;889&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최종 자산&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;911&quot; data-start=&quot;897&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;6,161,369원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;933&quot; data-start=&quot;912&quot;&gt;
&lt;td data-end=&quot;918&quot; data-start=&quot;912&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;수익률&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;933&quot; data-start=&quot;918&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;-38.39%&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;948&quot; data-start=&quot;934&quot;&gt;
&lt;td data-end=&quot;941&quot; data-start=&quot;934&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;거래 수&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;948&quot; data-start=&quot;941&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;12회&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;967&quot; data-start=&quot;949&quot;&gt;
&lt;td data-end=&quot;958&quot; data-start=&quot;949&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Sharpe&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;967&quot; data-start=&quot;958&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-0.71&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;984&quot; data-start=&quot;968&quot;&gt;
&lt;td data-end=&quot;974&quot; data-start=&quot;968&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MDD&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;984&quot; data-start=&quot;974&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;585만 원&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;995&quot; data-start=&quot;986&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  해설&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1123&quot; data-start=&quot;996&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1041&quot; data-start=&quot;996&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;거래 수 12회&lt;/b&gt; &amp;rarr; 여전히 예측력이 낮고 진입 기준 충족이 어려운 구조&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1078&quot; data-start=&quot;1042&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;초반 수익 후 &lt;b&gt;지속적인 하락 &amp;rarr; 모델의 학습/예측 한계&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1123&quot; data-start=&quot;1079&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;XRP는 기술적 노이즈가 많거나 예측 모델과 궁합이 맞지 않는 종목일 가능성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1128&quot; data-start=&quot;1125&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1142&quot; data-start=&quot;1130&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ 종합 비교 표&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;종목수익률Sharpe거래 수MDD전략 평가&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1425&quot; data-start=&quot;1144&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1425&quot; data-start=&quot;1245&quot;&gt;
&lt;tr data-end=&quot;1301&quot; data-start=&quot;1245&quot;&gt;
&lt;td data-end=&quot;1255&quot; data-start=&quot;1245&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;BTC&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1265&quot; data-start=&quot;1255&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+16.98%&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1272&quot; data-start=&quot;1265&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;0.54&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1278&quot; data-start=&quot;1272&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;118&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1285&quot; data-start=&quot;1278&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;296만&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1301&quot; data-start=&quot;1285&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;안정적 수익 구조 형성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1367&quot; data-start=&quot;1302&quot;&gt;
&lt;td data-end=&quot;1312&quot; data-start=&quot;1302&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;ETH&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1322&quot; data-start=&quot;1312&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+43.83%&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1333&quot; data-start=&quot;1322&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;1.17&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1339&quot; data-start=&quot;1333&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;104&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1346&quot; data-start=&quot;1339&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;264만&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1367&quot; data-start=&quot;1346&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;가장 이상적인 전략 적용&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1425&quot; data-start=&quot;1368&quot;&gt;
&lt;td data-end=&quot;1378&quot; data-start=&quot;1368&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;XRP&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1388&quot; data-start=&quot;1378&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-38.39%&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1396&quot; data-start=&quot;1388&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;-0.71&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1401&quot; data-start=&quot;1396&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;12&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1408&quot; data-start=&quot;1401&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;585만&lt;/span&gt;&lt;/td&gt;
&lt;td data-end=&quot;1425&quot; data-start=&quot;1408&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;학습 성능 및 전략 미흡&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1430&quot; data-start=&quot;1427&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1443&quot; data-start=&quot;1432&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;  핵심 결론&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1608&quot; data-start=&quot;1445&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1476&quot; data-start=&quot;1445&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ 전체 전략 리디자인 효과는 &lt;b&gt;매우 긍정적&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1541&quot; data-start=&quot;1477&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ 예측 확률 기반 포지션 조절 + 추세 기반 전략 전환 + 진입 필터링 = &lt;b&gt;고성능 자동매매 시스템 완성&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1608&quot; data-start=&quot;1542&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;❌ XRP는 &lt;b&gt;데이터 구조 또는 시장 특성상 예측 기반 전략에 부적합&lt;/b&gt; &amp;rarr; 향후 &lt;b&gt;룰 기반 or 제외&lt;/b&gt; 고려&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1613&quot; data-start=&quot;1610&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1626&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/84</guid>
      <comments>https://floatboy91.tistory.com/84#entry84comment</comments>
      <pubDate>Fri, 11 Apr 2025 19:09:42 +0900</pubDate>
    </item>
    <item>
      <title>10주차 TIL - 전략 수정</title>
      <link>https://floatboy91.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 데이터를 활용한 Python 기반 자동매매 프로그램 개발과 백테스팅 시스템 구축에 대해 도와드리겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추천할 만한 매매 전략으로는 다음과 같은 것들이 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이동평균선 교차(Moving Average Crossover)&lt;/b&gt;: 단기 이동평균선이 장기 이동평균선을 상향 돌파할 때 매수, 하향 돌파할 때 매도하는 전략입니다. 비교적 구현이 쉽고 트렌드 추종에 효과적입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RSI(상대강도지수) 기반 전략&lt;/b&gt;: RSI가 30 이하로 떨어질 때 매수, 70 이상 올라갈 때 매도하는 과매수/과매도 지표를 활용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;볼린저 밴드 전략&lt;/b&gt;: 가격이 하단밴드 아래로 떨어질 때 매수, 상단밴드 위로 올라갈 때 매도하는 전략입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MACD 교차 전략&lt;/b&gt;: MACD 라인이 시그널 라인을 상향 돌파할 때 매수, 하향 돌파할 때 매도합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 라이브러리를 사용하는 방법의 장점은:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;공식 지원&lt;/b&gt;: 바이낸스에서 직접 관리하는 라이브러리이므로 API 변경 시 업데이트가 빠릅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 기능&lt;/b&gt;: 시장 데이터 조회, 주문 생성/취소, 계정 잔액 확인 등 거의 모든 바이낸스 기능을 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebSocket 지원&lt;/b&gt;: 실시간 시장 데이터를 WebSocket을 통해 효율적으로 받을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: 많은 사용자가 검증한 라이브러리입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간 자동매매 시스템을 구현하려면 WebSocket을 활용한 방식을 추천합니다. 이를 통해 실시간으로 시장 변화를 감지하고 매매 신호를 포착할 수 있습니다. 백테스팅 시스템을 확장해서 실시간 트레이딩 시스템으로 만들 때 바이낸스 라이브러리의 WebSocket 기능이 특히 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스의 WebSocket API를 활용한 실시간 자동매매 시스템입니다. 주요 기능과 사용법을 설명해드리겠습니다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 기능&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;실시간 가격 데이터 수신&lt;/b&gt;: WebSocket을 통해 실시간으로 캔들 데이터를 수신합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 매매 전략&lt;/b&gt;: 이동평균선, RSI, 볼린저 밴드, MACD 등 다양한 전략을 선택할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 모드&lt;/b&gt;: 실제 주문 없이 전략을 테스트할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자동 재연결&lt;/b&gt;: WebSocket 연결이 끊어지면 자동으로 재연결을 시도합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이낸스 API 키와 시크릿 없이도 자동매매 시스템을 개발하고 테스트할 수 있는 몇 가지 방법이 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;공개 데이터 API 사용&lt;/b&gt;: 바이낸스는 시장 데이터를 가져오는 공개 API를 제공합니다. 이는 인증이 필요 없으며 시장 데이터를 실시간으로 가져올 수 있습니다. 단, 실제 주문은 불가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;바이낸스 테스트넷 사용&lt;/b&gt;: 바이낸스는 테스트 목적으로 테스트넷을 제공합니다. 여기서 API 키를 얻어 실제 돈을 사용하지 않고 거래를 테스트할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;과거 데이터 기반 시뮬레이션&lt;/b&gt;: 과거 데이터를 다운로드하여 시뮬레이션을 실행할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;websocket &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;json &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;numpy&amp;nbsp;as&amp;nbsp;np &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;threading &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;import&amp;nbsp;time &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;class&amp;nbsp;BinanceDataCollector: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;symbol='btcusdt',&amp;nbsp;interval='1m'): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.symbol&amp;nbsp;=&amp;nbsp;symbol.lower() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.interval&amp;nbsp;=&amp;nbsp;interval &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ws&amp;nbsp;=&amp;nbsp;None &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.closes&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.highs&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lows&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.volumes&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timestamps&amp;nbsp;=&amp;nbsp;[] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df&amp;nbsp;=&amp;nbsp;pd.DataFrame() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.max_candles&amp;nbsp;=&amp;nbsp;300 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.socket_running&amp;nbsp;=&amp;nbsp;False &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;on_message(self,&amp;nbsp;ws,&amp;nbsp;message): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg&amp;nbsp;=&amp;nbsp;json.loads(message) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.process_candle(msg) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;on_error(self,&amp;nbsp;ws,&amp;nbsp;error): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;WebSocket&amp;nbsp;오류:&amp;nbsp;{error}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;on_close(self,&amp;nbsp;ws,&amp;nbsp;close_status_code,&amp;nbsp;close_msg): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;WebSocket&amp;nbsp;연결이&amp;nbsp;종료되었습니다.&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.socket_running&amp;nbsp;=&amp;nbsp;False &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;on_open(self,&amp;nbsp;ws): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;WebSocket&amp;nbsp;연결이&amp;nbsp;시작되었습니다.&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.socket_running&amp;nbsp;=&amp;nbsp;True &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;process_candle(self,&amp;nbsp;msg): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&quot;&quot;실시간&amp;nbsp;캔들&amp;nbsp;데이터&amp;nbsp;처리&quot;&quot;&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;candle&amp;nbsp;=&amp;nbsp;msg['k'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is_candle_closed&amp;nbsp;=&amp;nbsp;candle['x'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;is_candle_closed: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timestamp&amp;nbsp;=&amp;nbsp;datetime.fromtimestamp(candle['t']/1000) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close&amp;nbsp;=&amp;nbsp;float(candle['c']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;high&amp;nbsp;=&amp;nbsp;float(candle['h']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;low&amp;nbsp;=&amp;nbsp;float(candle['l']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;volume&amp;nbsp;=&amp;nbsp;float(candle['v']) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;캔들&amp;nbsp;종료:&amp;nbsp;{timestamp}&amp;nbsp;|&amp;nbsp;종가:&amp;nbsp;{close}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;데이터&amp;nbsp;추가 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timestamps.append(timestamp) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.closes.append(close) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.highs.append(high) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lows.append(low) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.volumes.append(volume) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;최대&amp;nbsp;캔들&amp;nbsp;수&amp;nbsp;유지 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(self.closes)&amp;nbsp;&amp;gt;&amp;nbsp;self.max_candles: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timestamps.pop(0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.closes.pop(0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.highs.pop(0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.lows.pop(0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.volumes.pop(0) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;데이터프레임&amp;nbsp;업데이트 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.update_dataframe() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.analyze_data() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;데이터&amp;nbsp;처리&amp;nbsp;중&amp;nbsp;오류&amp;nbsp;발생:&amp;nbsp;{e}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;update_dataframe(self): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&quot;&quot;데이터프레임&amp;nbsp;업데이트&quot;&quot;&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df&amp;nbsp;=&amp;nbsp;pd.DataFrame({ &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'timestamp':&amp;nbsp;self.timestamps, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'close':&amp;nbsp;self.closes, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'high':&amp;nbsp;self.highs, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'low':&amp;nbsp;self.lows, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'volume':&amp;nbsp;self.volumes &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df.set_index('timestamp',&amp;nbsp;inplace=True) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;기술적&amp;nbsp;지표&amp;nbsp;추가 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(self.df)&amp;nbsp;&amp;gt;&amp;nbsp;50: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;이동평균선 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['sma_20']&amp;nbsp;=&amp;nbsp;self.df['close'].rolling(window=20).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['sma_50']&amp;nbsp;=&amp;nbsp;self.df['close'].rolling(window=50).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;RSI &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delta&amp;nbsp;=&amp;nbsp;self.df['close'].diff() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gain&amp;nbsp;=&amp;nbsp;(delta.where(delta&amp;nbsp;&amp;gt;&amp;nbsp;0,&amp;nbsp;0)).rolling(window=14).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loss&amp;nbsp;=&amp;nbsp;(-delta.where(delta&amp;nbsp;&amp;lt;&amp;nbsp;0,&amp;nbsp;0)).rolling(window=14).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rs&amp;nbsp;=&amp;nbsp;gain&amp;nbsp;/&amp;nbsp;loss &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['rsi']&amp;nbsp;=&amp;nbsp;100&amp;nbsp;-&amp;nbsp;(100&amp;nbsp;/&amp;nbsp;(1&amp;nbsp;+&amp;nbsp;rs)) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;MACD &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['ema_12']&amp;nbsp;=&amp;nbsp;self.df['close'].ewm(span=12,&amp;nbsp;adjust=False).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['ema_26']&amp;nbsp;=&amp;nbsp;self.df['close'].ewm(span=26,&amp;nbsp;adjust=False).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['macd']&amp;nbsp;=&amp;nbsp;self.df['ema_12']&amp;nbsp;-&amp;nbsp;self.df['ema_26'] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df['signal']&amp;nbsp;=&amp;nbsp;self.df['macd'].ewm(span=9,&amp;nbsp;adjust=False).mean() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;analyze_data(self): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&quot;&quot;데이터&amp;nbsp;분석&amp;nbsp;및&amp;nbsp;매매&amp;nbsp;신호&amp;nbsp;감지&quot;&quot;&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(self.df)&amp;nbsp;&amp;lt;&amp;nbsp;2: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_row&amp;nbsp;=&amp;nbsp;self.df.iloc[-1] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev_row&amp;nbsp;=&amp;nbsp;self.df.iloc[-2] &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;여기에&amp;nbsp;매매&amp;nbsp;신호&amp;nbsp;분석&amp;nbsp;로직&amp;nbsp;추가 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;예:&amp;nbsp;이동평균선&amp;nbsp;교차&amp;nbsp;전략 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;'sma_20'&amp;nbsp;in&amp;nbsp;last_row&amp;nbsp;and&amp;nbsp;'sma_50'&amp;nbsp;in&amp;nbsp;last_row: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(prev_row['sma_20']&amp;nbsp;&amp;lt;=&amp;nbsp;prev_row['sma_50'])&amp;nbsp;and&amp;nbsp;(last_row['sma_20']&amp;nbsp;&amp;gt;&amp;nbsp;last_row['sma_50']): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;매수&amp;nbsp;신호:&amp;nbsp;이동평균선&amp;nbsp;골든&amp;nbsp;크로스&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;(prev_row['sma_20']&amp;nbsp;&amp;gt;=&amp;nbsp;prev_row['sma_50'])&amp;nbsp;and&amp;nbsp;(last_row['sma_20']&amp;nbsp;&amp;lt;&amp;nbsp;last_row['sma_50']): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;매도&amp;nbsp;신호:&amp;nbsp;이동평균선&amp;nbsp;데드&amp;nbsp;크로스&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;RSI&amp;nbsp;기반&amp;nbsp;전략 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;'rsi'&amp;nbsp;in&amp;nbsp;last_row: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;last_row['rsi']&amp;nbsp;&amp;lt;&amp;nbsp;30: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;과매도&amp;nbsp;구간&amp;nbsp;(RSI:&amp;nbsp;{last_row['rsi']:.2f})&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;last_row['rsi']&amp;nbsp;&amp;gt;&amp;nbsp;70: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;과매수&amp;nbsp;구간&amp;nbsp;(RSI:&amp;nbsp;{last_row['rsi']:.2f})&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;MACD&amp;nbsp;기반&amp;nbsp;전략 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;'macd'&amp;nbsp;in&amp;nbsp;last_row&amp;nbsp;and&amp;nbsp;'signal'&amp;nbsp;in&amp;nbsp;last_row: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(prev_row['macd']&amp;nbsp;&amp;lt;=&amp;nbsp;prev_row['signal'])&amp;nbsp;and&amp;nbsp;(last_row['macd']&amp;nbsp;&amp;gt;&amp;nbsp;last_row['signal']): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;매수&amp;nbsp;신호:&amp;nbsp;MACD&amp;nbsp;골든&amp;nbsp;크로스&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;(prev_row['macd']&amp;nbsp;&amp;gt;=&amp;nbsp;prev_row['signal'])&amp;nbsp;and&amp;nbsp;(last_row['macd']&amp;nbsp;&amp;lt;&amp;nbsp;last_row['signal']): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;매도&amp;nbsp;신호:&amp;nbsp;MACD&amp;nbsp;데드&amp;nbsp;크로스&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;start_collecting(self): &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&quot;&quot;데이터&amp;nbsp;수집&amp;nbsp;시작&quot;&quot;&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;WebSocket&amp;nbsp;연결&amp;nbsp;설정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socket_url&amp;nbsp;=&amp;nbsp;f&quot;wss://strea&lt;a href=&quot;http://m.binance.com:9443/ws/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.binance.com:9443/ws/&lt;/a&gt;{self.symbol}@kline_{self.interval}&quot; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;websocket.enableTrace(False) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ws&amp;nbsp;=&amp;nbsp;websocket.WebSocketApp( &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socket_url, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on_message=self.on_message, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on_error=self.on_error, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on_close=self.on_close, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on_open=self.on_open &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;\n=====&amp;nbsp;데이터&amp;nbsp;수집&amp;nbsp;시작&amp;nbsp;=====&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;심볼:&amp;nbsp;{self.symbol}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&quot;간격:&amp;nbsp;{self.interval}&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;========================\n&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;WebSocket&amp;nbsp;실행&amp;nbsp;(별도&amp;nbsp;스레드) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wst&amp;nbsp;=&amp;nbsp;threading.Thread(target=self.ws.run_forever) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wst.daemon&amp;nbsp;=&amp;nbsp;True &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wst.start() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;메인&amp;nbsp;스레드에서는&amp;nbsp;간단한&amp;nbsp;상태&amp;nbsp;확인 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;실시간&amp;nbsp;데이터&amp;nbsp;수집&amp;nbsp;시작&amp;nbsp;(종료하려면&amp;nbsp;Ctrl+C)&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;self.socket_running: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;WebSocket&amp;nbsp;연결이&amp;nbsp;종료되었습니다.&amp;nbsp;재연결&amp;nbsp;시도&amp;nbsp;중...&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wst&amp;nbsp;=&amp;nbsp;threading.Thread(target=self.ws.run_forever) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wst.daemon&amp;nbsp;=&amp;nbsp;True &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wst.start() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(5) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;KeyboardInterrupt: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;사용자에&amp;nbsp;의해&amp;nbsp;프로그램이&amp;nbsp;종료되었습니다.&quot;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ws.close() &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;데이터&amp;nbsp;수집&amp;nbsp;종료&quot;) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;#&amp;nbsp;메인&amp;nbsp;실행&amp;nbsp;코드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&quot;__main__&quot;: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;설정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;symbol&amp;nbsp;=&amp;nbsp;&quot;btcusdt&quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;거래&amp;nbsp;심볼 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;interval&amp;nbsp;=&amp;nbsp;&quot;1m&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;캔들&amp;nbsp;간격&amp;nbsp;(1m,&amp;nbsp;5m,&amp;nbsp;15m,&amp;nbsp;1h,&amp;nbsp;4h,&amp;nbsp;1d) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;데이터&amp;nbsp;수집기&amp;nbsp;초기화&amp;nbsp;및&amp;nbsp;시작 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector&amp;nbsp;=&amp;nbsp;BinanceDataCollector(symbol=symbol,&amp;nbsp;interval=interval) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector.start_collecting()&lt;/span&gt;&lt;/p&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/83</guid>
      <comments>https://floatboy91.tistory.com/83#entry83comment</comments>
      <pubDate>Thu, 10 Apr 2025 20:48:50 +0900</pubDate>
    </item>
    <item>
      <title>10주차 TIL - 지금까지 적용해본 모델</title>
      <link>https://floatboy91.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b49DJ5/btsNfJioqH5/HbZ7o1NiDicgydF9BPTsPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b49DJ5/btsNfJioqH5/HbZ7o1NiDicgydF9BPTsPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b49DJ5/btsNfJioqH5/HbZ7o1NiDicgydF9BPTsPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb49DJ5%2FbtsNfJioqH5%2FHbZ7o1NiDicgydF9BPTsPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;522&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/82</guid>
      <comments>https://floatboy91.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 9 Apr 2025 20:46:36 +0900</pubDate>
    </item>
    <item>
      <title>10주차 TIL - ARIMA X 라고?</title>
      <link>https://floatboy91.tistory.com/81</link>
      <description>&lt;h3 data-end=&quot;184&quot; data-start=&quot;169&quot; data-ke-size=&quot;size23&quot;&gt;✅ ARIMA-X란?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;371&quot; data-start=&quot;186&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;268&quot; data-start=&quot;186&quot;&gt;&lt;b&gt;ARIMAX (AutoRegressive Integrated Moving Average with eXogenous variables)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;312&quot; data-start=&quot;269&quot;&gt;기본 시계열 예측 모델 ARIMA에 외생변수(다른 변수)를 추가한 모델&lt;/li&gt;
&lt;li data-end=&quot;371&quot; data-start=&quot;313&quot;&gt;예: close 가격을 예측하는데 volume, high, low 등을 외생변수로 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;376&quot; data-start=&quot;373&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;399&quot; data-start=&quot;378&quot; data-ke-size=&quot;size23&quot;&gt;✅ 지금 구조 vs ARIMAX&lt;/h3&gt;
&lt;div&gt;항목현재 모델 (Transformer)ARIMAX
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;678&quot; data-start=&quot;401&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;678&quot; data-start=&quot;484&quot;&gt;
&lt;tr data-end=&quot;515&quot; data-start=&quot;484&quot;&gt;
&lt;td&gt;대상&lt;/td&gt;
&lt;td&gt;회귀 + 분류 (복합)&lt;/td&gt;
&lt;td&gt;회귀 (단일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;556&quot; data-start=&quot;516&quot;&gt;
&lt;td&gt;입력&lt;/td&gt;
&lt;td&gt;다변량 시계열, 60개 step&lt;/td&gt;
&lt;td&gt;단변량 + 외생 변수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;596&quot; data-start=&quot;557&quot;&gt;
&lt;td&gt;예측 방식&lt;/td&gt;
&lt;td&gt;딥러닝 기반 패턴 학습&lt;/td&gt;
&lt;td&gt;통계적 선형 회귀 계열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;635&quot; data-start=&quot;597&quot;&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;비선형 복잡한 패턴 대응 가능&lt;/td&gt;
&lt;td&gt;해석력, 빠른 학습&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;678&quot; data-start=&quot;636&quot;&gt;
&lt;td&gt;단점&lt;/td&gt;
&lt;td&gt;많은 데이터 필요, 느림&lt;/td&gt;
&lt;td&gt;성능 한계, 비선형 처리 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;683&quot; data-start=&quot;680&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;709&quot; data-start=&quot;685&quot; data-ke-size=&quot;size23&quot;&gt;✅ ARIMAX를 쓰려면 적합한 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;798&quot; data-start=&quot;710&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;739&quot; data-start=&quot;710&quot;&gt;목표가 단순 &lt;b&gt;단일 변수 예측&lt;/b&gt; (예: 가격)&lt;/li&gt;
&lt;li data-end=&quot;765&quot; data-start=&quot;740&quot;&gt;데이터 수가 적고 모델 해석이 중요한 경우&lt;/li&gt;
&lt;li data-end=&quot;798&quot; data-start=&quot;766&quot;&gt;트레이딩 신호보단 &lt;b&gt;예측 정확도 중심의 분석&lt;/b&gt;일 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;803&quot; data-start=&quot;800&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;823&quot; data-start=&quot;805&quot; data-ke-size=&quot;size23&quot;&gt;✅ 지금 프로젝트와의 궁합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;933&quot; data-start=&quot;825&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;825&quot;&gt;현재 목표는 &lt;b&gt;하이브리드 예측 (변동률 + 급등/급락 분류)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;887&quot; data-start=&quot;866&quot;&gt;분류는 ARIMA-X로는 불가능&lt;/li&gt;
&lt;li data-end=&quot;933&quot; data-start=&quot;888&quot;&gt;회귀도 ARIMA-X는 &lt;b&gt;단기 예측엔 약하고, 변동률 예측 성능이 제한됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;938&quot; data-start=&quot;935&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;948&quot; data-start=&quot;940&quot; data-ke-size=&quot;size23&quot;&gt;✅ 요약&lt;/h3&gt;
&lt;div&gt;질문답변
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1085&quot; data-start=&quot;950&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1085&quot; data-start=&quot;978&quot;&gt;
&lt;tr data-end=&quot;1004&quot; data-start=&quot;978&quot;&gt;
&lt;td&gt;ARIMA-X 사용 가능한가?&lt;/td&gt;
&lt;td&gt;가능함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1046&quot; data-start=&quot;1005&quot;&gt;
&lt;td&gt;지금 구조와 잘 맞나?&lt;/td&gt;
&lt;td&gt;잘 맞진 않음 (분류 불가, 패턴 한계)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1085&quot; data-start=&quot;1047&quot;&gt;
&lt;td&gt;언제 사용 추천?&lt;/td&gt;
&lt;td&gt;단기 단일 회귀 분석 + 해석 중요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/81</guid>
      <comments>https://floatboy91.tistory.com/81#entry81comment</comments>
      <pubDate>Tue, 8 Apr 2025 20:53:41 +0900</pubDate>
    </item>
    <item>
      <title>10주차 TIL - 모델 모델 모델!</title>
      <link>https://floatboy91.tistory.com/80</link>
      <description>&lt;p data-end=&quot;121&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;지금 모델은 기본적인 구조를 잘 갖췄지만, 실전 예측 성능을 높이려면 아래와 같은 &lt;b&gt;개선 포인트&lt;/b&gt;들을 고려해보는 게 좋아.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이건 실제 트레이딩 시나 하이브리드 시계열 모델에서 검증된 방식&lt;/span&gt;&lt;/p&gt;
&lt;hr data-end=&quot;126&quot; data-start=&quot;123&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;151&quot; data-start=&quot;128&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ &lt;b&gt;1. 데이터 전처리 개선&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;355&quot; data-start=&quot;152&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;236&quot; data-start=&quot;152&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Log return 사용&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;log(close_t / close_t-1)은 일반적인 return보다 더 안정적이고 정규분포에 가까워짐&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;355&quot; data-start=&quot;237&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;피처 정규화&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;volume, price 등은 MinMaxScaler 또는 StandardScaler로 정규화하고 학습에 사용&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;rarr; 각 피처의 크기 차이를 줄여 학습 안정화 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;360&quot; data-start=&quot;357&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;396&quot; data-start=&quot;362&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ &lt;b&gt;2. 라벨 구조 개선 (클래스 불균형 완화)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;541&quot; data-start=&quot;397&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;435&quot; data-start=&quot;397&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;급등/급락 비율이 너무 적으면 분류 모델이 &quot;보통&quot;만 예측하려 함&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;488&quot; data-start=&quot;436&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;라벨을 5분봉 대신 30분봉 등으로 바꾸면&lt;/b&gt; 급등/급락 빈도가 증가해 불균형이 완화됨&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;541&quot; data-start=&quot;489&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;또는 &lt;b&gt;focal loss&lt;/b&gt;나 &lt;b&gt;class weight&lt;/b&gt;를 적용해 학습 밸런싱 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;546&quot; data-start=&quot;543&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;569&quot; data-start=&quot;548&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ &lt;b&gt;3. 모델 구조 개선&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;774&quot; data-start=&quot;570&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;649&quot; data-start=&quot;570&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Conv1D + Transformer 조합&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Conv로 로컬 패턴을 먼저 잡고, Transformer로 시계열 전체 문맥 이해&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;722&quot; data-start=&quot;650&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;LayerNormalization 위치 조정 (Pre-Norm vs Post-Norm)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;안정성 개선에 영향 있음&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;774&quot; data-start=&quot;723&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Dropout 추가 조정&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오버피팅 방지 (특히 작은 데이터셋에서는 효과적)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;779&quot; data-start=&quot;776&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;814&quot; data-start=&quot;781&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ &lt;b&gt;4. Custom Metric / Loss&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;941&quot; data-start=&quot;815&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;875&quot; data-start=&quot;815&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Custom classification F1-score metric&lt;/b&gt;: 정확도 외의 균형 지표 필요&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;941&quot; data-start=&quot;876&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;하이브리드 risk-adjusted loss&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;급등/급락 예측 실패에 더 큰 패널티를 주는 방식 고려&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;946&quot; data-start=&quot;943&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;973&quot; data-start=&quot;948&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;✅ &lt;b&gt;5. 후처리 + 시각화 개선&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1079&quot; data-start=&quot;974&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1044&quot; data-start=&quot;974&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예측값의 &lt;b&gt;direction (상승/하락)&lt;/b&gt; 일치율 분석&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;rarr; 실제 가격 방향성과 모델 예측이 얼마나 맞는지 확인&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1079&quot; data-start=&quot;1045&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예측 변동률을 바탕으로 &lt;b&gt;가상 수익률 계산 시뮬레이션&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1084&quot; data-start=&quot;1081&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1103&quot; data-start=&quot;1086&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;추천 우선순위 TOP 3&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우선순위내용이유&lt;/span&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1307&quot; data-start=&quot;1104&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1307&quot; data-start=&quot;1150&quot;&gt;
&lt;tr data-end=&quot;1213&quot; data-start=&quot;1150&quot;&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;라벨 불균형 보정&lt;/b&gt; (윈도우 길이, class weight 등)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;분류 성능 크게 개선 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1267&quot; data-start=&quot;1214&quot;&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;Conv1D + Transformer 구조&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;성능과 연산 효율 동시 확보&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1307&quot; data-start=&quot;1268&quot;&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;가상 수익률 분석&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실전 적용 가능성 평가 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>게임취업하고싶은 사람</author>
      <guid isPermaLink="true">https://floatboy91.tistory.com/80</guid>
      <comments>https://floatboy91.tistory.com/80#entry80comment</comments>
      <pubDate>Mon, 7 Apr 2025 21:01:36 +0900</pubDate>
    </item>
  </channel>
</rss>