로고스/루트 레거시를 제거하고 deepcoin 패키지·scripts 01~05 CLI·docs/reference로 데이터·GT·분석·매칭·운영 단계를 정리했다. config와 .env 기반 설정, trade_anaysis.html 동기화 포함. Co-authored-by: Cursor <cursoragent@cursor.com>
155 lines
4.8 KiB
Python
155 lines
4.8 KiB
Python
"""
|
|
general_analysis 전체 파이프라인 (지표·캔들·한 봉 특징).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pandas as pd
|
|
|
|
from deepcoin.common.candle_features import compute_bar_features
|
|
from deepcoin.analysis.general_analysis_candles import (
|
|
general_analysis_apply_candles,
|
|
general_analysis_candle_columns,
|
|
)
|
|
from deepcoin.analysis.general_analysis_chart import (
|
|
general_analysis_apply_chart_bars,
|
|
general_analysis_chart_columns,
|
|
general_analysis_chart_metrics,
|
|
)
|
|
from deepcoin.analysis.general_analysis_context import general_analysis_apply_context_features
|
|
from deepcoin.analysis.general_analysis_harmonic import (
|
|
general_analysis_harmonic_columns,
|
|
general_analysis_harmonic_snapshot,
|
|
)
|
|
from deepcoin.analysis.general_analysis_volume import (
|
|
general_analysis_volume_columns,
|
|
general_analysis_volume_snapshot,
|
|
)
|
|
from deepcoin.analysis.general_analysis_core import ga_col, lookback_slice
|
|
from deepcoin.analysis.general_analysis_indicators import (
|
|
general_analysis_apply_indicators,
|
|
general_analysis_indicator_columns,
|
|
)
|
|
from deepcoin.analysis.general_analysis_patterns import (
|
|
general_analysis_pattern_columns,
|
|
general_analysis_pattern_snapshot,
|
|
)
|
|
from deepcoin.analysis.general_analysis_wave import (
|
|
general_analysis_wave_columns,
|
|
general_analysis_wave_snapshot,
|
|
)
|
|
|
|
|
|
def general_analysis_enrich_bars(
|
|
df: pd.DataFrame,
|
|
interval: int | None = None,
|
|
*,
|
|
full_context: bool = True,
|
|
) -> pd.DataFrame:
|
|
"""
|
|
OHLCV → candle_features + ga 지표 + 캔들 + 차트 + (선택) lookback 컨텍스트.
|
|
|
|
Args:
|
|
df: raw OHLCV.
|
|
interval: 분봉 간격. full_context=True일 때 필수.
|
|
full_context: 패턴·VP·파동·하모닉 롤링 적용.
|
|
|
|
Returns:
|
|
전체 특징 컬럼 DataFrame.
|
|
"""
|
|
base = compute_bar_features(df)
|
|
out = general_analysis_apply_indicators(base)
|
|
out = general_analysis_apply_candles(out)
|
|
out = general_analysis_apply_chart_bars(out)
|
|
if full_context and interval is not None:
|
|
out = general_analysis_apply_context_features(out, interval)
|
|
return out
|
|
|
|
|
|
def general_analysis_snapshot_at_bar(
|
|
enriched: pd.DataFrame,
|
|
ts: pd.Timestamp,
|
|
interval: int,
|
|
) -> dict[str, object]:
|
|
"""
|
|
타점 시각 직전 완성봉 + lookback 패턴·파동·차트 메타.
|
|
|
|
Args:
|
|
enriched: general_analysis_enrich_bars 결과.
|
|
ts: 타점 시각.
|
|
interval: 분봉 간격.
|
|
|
|
Returns:
|
|
flat dict (ga_ 키 + legacy bb/rsi where present).
|
|
"""
|
|
win = lookback_slice(enriched, interval, ts)
|
|
snap: dict[str, object] = {}
|
|
if win.empty:
|
|
return snap
|
|
|
|
row = win.iloc[-1]
|
|
|
|
legacy_cols = [
|
|
"bb_pos",
|
|
"RSI",
|
|
"macd_hist",
|
|
"stoch_k",
|
|
"stoch_d",
|
|
"macd_line",
|
|
"macd_signal",
|
|
"BB_Width",
|
|
]
|
|
for c in legacy_cols:
|
|
if c in row.index and not pd.isna(row[c]):
|
|
snap[c] = float(row[c]) if isinstance(row[c], (int, float)) else row[c]
|
|
|
|
for c in general_analysis_indicator_columns():
|
|
col = ga_col(c)
|
|
if col in row.index:
|
|
v = row[col]
|
|
snap[col] = None if pd.isna(v) else v
|
|
|
|
for c in general_analysis_candle_columns():
|
|
col = ga_col(c)
|
|
if col in row.index:
|
|
snap[col] = int(row[col]) if not pd.isna(row[col]) else 0
|
|
|
|
pat_cols = [ga_col(c) for c in general_analysis_pattern_columns()]
|
|
if pat_cols and pat_cols[0] in enriched.columns:
|
|
for col in pat_cols:
|
|
if col in row.index:
|
|
snap[col] = row[col]
|
|
else:
|
|
snap.update(general_analysis_pattern_snapshot(win))
|
|
|
|
wave_cols = [ga_col(c) for c in general_analysis_wave_columns()]
|
|
if wave_cols and wave_cols[0] in enriched.columns:
|
|
for col in wave_cols:
|
|
if col in row.index:
|
|
snap[col] = row[col]
|
|
else:
|
|
snap.update(general_analysis_wave_snapshot(win))
|
|
|
|
snap.update(general_analysis_volume_snapshot(win))
|
|
snap.update(general_analysis_harmonic_snapshot(win))
|
|
snap.update(general_analysis_chart_metrics(win))
|
|
|
|
return snap
|
|
|
|
|
|
def general_analysis_all_snapshot_keys() -> list[str]:
|
|
"""CSV 헤더용 전체 키 목록 (간격 접두사 제외)."""
|
|
keys = list(legacy_snapshot_keys())
|
|
keys += [ga_col(c) for c in general_analysis_indicator_columns()]
|
|
keys += [ga_col(c) for c in general_analysis_candle_columns()]
|
|
keys += [ga_col(c) for c in general_analysis_pattern_columns()]
|
|
keys += [ga_col(c) for c in general_analysis_wave_columns()]
|
|
keys += [ga_col(c) for c in general_analysis_chart_columns()]
|
|
keys += [ga_col(c) for c in general_analysis_volume_columns()]
|
|
keys += [ga_col(c) for c in general_analysis_harmonic_columns()]
|
|
return keys
|
|
|
|
|
|
def legacy_snapshot_keys() -> list[str]:
|
|
return ["bb_pos", "RSI", "macd_hist", "stoch_k", "stoch_d"]
|