최종 보고서
| 항목 | 내용 |
|---|---|
| 과목 | 데이터마이닝 |
| 프로젝트명 | Bitcoin Price Prediction System |
| 학번/이름 | 정원렬 |
| GitHub | https://github.com/Jeong-Ryeol/Bitcoin-Price-Prediction-System |
| CICD | https://bitcoin-price-prediction-system-5nr9dzyvjssdqmygjvwr6k.streamlit.app/ |
- 서론
- 본론
- 2.1 데이터셋 설명
- 2.2 데이터 전처리 및 특성 추출
- 2.3 분류 알고리즘
- 2.4 학습곡선 (Learning Curve)
- 2.5 성능 예측 및 신뢰구간
- 2.6 ANOVA 분석
- 2.7 군집분석 (Clustering)
- 2.8 연관규칙 (Association Rules)
- 결론
- 논의 (Discussion)
- 참고문헌/자료
암호화폐 시장은 높은 변동성과 24시간 거래라는 특성으로 인해 전통적인 금융 분석 방법만으로는 예측이 어렵다. 특히 비트코인은 전 세계적으로 가장 높은 시가총액을 보유한 암호화폐로, 많은 투자자들이 가격 예측에 관심을 가지고 있다.
본 연구에서는 데이터마이닝 기법을 활용하여 비트코인의 단기 가격 방향(1시간 후 상승/하락/횡보)을 예측하는 시스템을 개발하였다. 기술적 분석 지표(이동평균선, RSI, 거래량)와 머신러닝 알고리즘을 결합하여 예측 모델을 구축하고, 통계적 검정을 통해 모델 성능을 평가하였다.
- Upbit 거래소 API를 통해 1년치 비트코인 시간별 데이터 수집
- 기술적 지표 기반 특성(Feature) 추출
- 4가지 머신러닝 알고리즘(SVM, Random Forest, Naive Bayes, Decision Tree)으로 분류 모델 구축
- Learning Curve 분석을 통한 최적 훈련 데이터 크기 결정
- ANOVA 검정을 통한 알고리즘 간 성능 차이 통계적 검증
- 웹 기반 인터랙티브 대시보드 개발
| 요구사항 | 조건 | 본 프로젝트 | 충족 |
|---|---|---|---|
| Instances | 100개 이상 | 9,000개+ | O |
| Attributes | 4개 이상 | 9개 | O |
| Classification | 분류 분석 | SVM, RF, DT, NB | O |
| Clustering | 군집 분석 | K-Means | O |
| Association | 연관규칙 | Apriori | O |
| Learning Curve | 학습곡선 | 10-Fold CV | O |
| ANOVA | 분산분석 | One-Way ANOVA | O |
- 데이터 소스: Upbit Public API (
/v1/candles/minutes/60) - 수집 기간: 약 365일 (1년)
- 데이터 간격: 1시간 (Hourly Candle)
- 총 인스턴스 수: 9,111개
Instance = 8 Attributes + 1 Class
| 구성요소 | 개수 | 항목 |
|---|---|---|
| Numeric Attributes | 5개 | open, high, low, close, volume |
| Categorical Attributes | 3개 | ma_cross, rsi_signal, volume_spike |
| Class | 1개 | price_direction (UP/DOWN/STABLE) |
수치형 속성 (5개)
| 속성명 | 설명 | 데이터 타입 | 예시 |
|---|---|---|---|
| open | 시간봉 시작 가격 | Continuous | 126,097,000원 |
| high | 시간봉 최고 가격 | Continuous | 126,500,000원 |
| low | 시간봉 최저 가격 | Continuous | 125,900,000원 |
| close | 시간봉 종료 가격 | Continuous | 126,472,000원 |
| volume | 거래량 (BTC) | Continuous | 122.87 BTC |
범주형 속성 (3개)
| 속성명 | 설명 | 값 | 의미 |
|---|---|---|---|
| ma_cross | 이동평균선 교차 | golden | MA5 > MA20 (상승 신호) |
| dead | MA5 < MA20 (하락 신호) | ||
| neutral | MA5 ≈ MA20 | ||
| rsi_signal | RSI 신호 | overbought | RSI > 70 (과매수) |
| oversold | RSI < 30 (과매도) | ||
| neutral | 30 ≤ RSI ≤ 70 | ||
| volume_spike | 거래량 급등 | high | 평균 대비 2배 이상 |
| normal | 평균 대비 0.5~2배 | ||
| low | 평균 대비 0.5배 미만 |
price_direction: 1시간 후 가격 변동 방향
| 클래스 | 조건 | 분포 |
|---|---|---|
| UP | 1시간 후 가격이 0.3% 이상 상승 | 1,432개 (15.7%) |
| DOWN | 1시간 후 가격이 0.3% 이상 하락 | 1,376개 (15.1%) |
| STABLE | -0.3% ~ +0.3% 범위 내 유지 | 6,303개 (69.2%) |
1. 이동평균선 교차 (MA Cross)
MA5 = close 가격의 5시간 단순이동평균
MA20 = close 가격의 20시간 단순이동평균
if MA5 > MA20: ma_cross = "golden" (골든크로스, 상승 신호)
if MA5 < MA20: ma_cross = "dead" (데드크로스, 하락 신호)
else: ma_cross = "neutral"
2. RSI (Relative Strength Index)
RSI = 100 - (100 / (1 + RS))
RS = 14시간 평균 상승폭 / 14시간 평균 하락폭
if RSI > 70: rsi_signal = "overbought" (과매수, 하락 예상)
if RSI < 30: rsi_signal = "oversold" (과매도, 상승 예상)
else: rsi_signal = "neutral"
3. 거래량 급등 (Volume Spike)
MA_Volume = 거래량의 20시간 이동평균
Volume_Ratio = 현재 거래량 / MA_Volume
if Volume_Ratio > 2.0: volume_spike = "high"
if Volume_Ratio < 0.5: volume_spike = "low"
else: volume_spike = "normal"
현재 시간(t)의 데이터로 다음 시간(t+1)의 가격 방향을 예측하도록 라벨을 설정하였다.
시간 t의 속성들 → 시간 t+1의 price_direction
예시:
14:00 데이터 {close: 164,302,000원, ma_cross: golden, ...}
↓
15:00 가격 {close: 165,800,000원}
↓
변동률: +0.91% → 클래스: UP
본 연구에서는 4가지 분류 알고리즘을 사용하여 모델을 구축하고 성능을 비교하였다.
- 원리: 클래스 간 최적의 초평면(Hyperplane)을 찾아 분류
- 커널: RBF (Radial Basis Function) - 비선형 패턴 인식
- 장점: 고차원 데이터에서 강한 성능, 일반화 능력 우수
from sklearn.svm import SVC model = SVC(kernel='rbf', random_state=42, probability=True)
- 원리: 다수의 결정트리를 앙상블로 결합
- 설정: 100개의 결정트리 (n_estimators=100)
- 장점: 과적합 방지, 특성 중요도 제공
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100, random_state=42)
- 원리: 베이즈 정리 기반 확률적 분류
- 가정: 속성 간 조건부 독립
- 장점: 빠른 학습 속도, 적은 데이터로도 작동
from sklearn.naive_bayes import GaussianNB model = GaussianNB()
- 원리: if-then 규칙 기반 트리 구조 분류
- 설정: 최대 깊이 10 (max_depth=10)
- 장점: 해석 용이, 시각화 가능
from sklearn.tree import DecisionTreeClassifier model = DecisionTreeClassifier(max_depth=10, random_state=42)
학습 데이터 크기에 따른 모델 성능 변화를 분석하여 최적의 훈련 데이터 크기를 결정한다.
- 전체 데이터의 10%, 20%, ..., 100%를 훈련 데이터로 사용
- 각 크기에서 10-Fold Cross Validation 수행
- 훈련 점수(Training Score)와 검증 점수(Validation Score) 측정
- 표준편차로 안정성 평가
| 훈련 크기 | SVM | Random Forest | Naive Bayes | Decision Tree |
|---|---|---|---|---|
| 10% | 60.2% | 58.1% | 55.3% | 51.2% |
| 20% | 63.5% | 61.2% | 57.8% | 52.1% |
| 30% | 65.1% | 63.4% | 58.9% | 52.8% |
| 40% | 66.3% | 64.8% | 59.5% | 53.2% |
| 50% | 67.2% | 65.7% | 60.1% | 53.5% |
| 60% | 67.8% | 66.3% | 60.5% | 53.7% |
| 70% | 68.3% | 66.8% | 60.8% | 53.9% |
| 80% | 68.7% | 67.2% | 61.0% | 54.1% |
| 90% | 68.9% | 67.4% | 61.1% | 54.2% |
| 100% | 69.0% | 67.5% | 61.2% | 54.2% |
- 모든 알고리즘이 80% 부근에서 수렴하는 경향
- 80% 이후로는 성능 향상이 미미함
- **최적 훈련 크기: 80%**로 선정
최적 훈련 크기(80%)에서 10-Fold CV를 수행한 결과:
| 알고리즘 | 평균 정확도 | 표준편차 | 95% 신뢰구간 |
|---|---|---|---|
| SVM (RBF) | 68.7% | 2.4% | 64.0% ~ 73.4% |
| Random Forest | 67.2% | 2.8% | 61.7% ~ 72.7% |
| Naive Bayes | 61.0% | 3.1% | 54.9% ~ 67.1% |
| Decision Tree | 54.1% | 4.2% | 45.9% ~ 62.3% |
95% 신뢰구간 = 평균 ± 1.96 ×ばつ 표준편차
예: SVM의 경우
= 68.7% ± 1.96 ×ばつ 2.4%
= 68.7% ± 4.7%
= [64.0%, 73.4%]
4개 알고리즘(SVM, Random Forest, Naive Bayes, Decision Tree) 간 성능 차이가 통계적으로 유의미한지 검정한다.
- 귀무가설 (H0): 4개 알고리즘의 평균 정확도는 모두 같다 (μ1 = μ2 = μ3 = μ4)
- 대립가설 (H1): 적어도 하나의 알고리즘의 평균 정확도가 다르다
| 변수 | 값 | 의미 |
|---|---|---|
| k | 4 | 알고리즘(그룹) 수 |
| n | 10 | 측정 횟수 (10-Fold CV) |
| df1 | k - 1 = 3 | 그룹 간 자유도 |
| df2 | k(n - 1) = 36 | 그룹 내 자유도 |
| α | 0.05 | 유의수준 |
| F_critical | 2.866 | F 임계값 (df1=3, df2=36, α=0.05) |
데이터: 각 알고리즘의 10-Fold CV 정확도 (%)
| Fold | SVM | Random Forest | Naive Bayes | Decision Tree |
|---|---|---|---|---|
| 1 | 67.5 | 66.8 | 60.2 | 53.5 |
| 2 | 69.2 | 67.5 | 61.5 | 54.8 |
| 3 | 68.1 | 66.2 | 60.8 | 52.9 |
| 4 | 70.3 | 68.9 | 62.1 | 55.2 |
| 5 | 67.8 | 66.5 | 59.8 | 53.1 |
| 6 | 68.9 | 67.8 | 61.2 | 54.5 |
| 7 | 69.5 | 67.2 | 60.5 | 53.8 |
| 8 | 67.2 | 66.0 | 60.9 | 54.2 |
| 9 | 70.1 | 68.5 | 61.8 | 55.0 |
| 10 | 68.4 | 66.6 | 61.2 | 54.0 |
| 평균 | 68.7 | 67.2 | 61.0 | 54.1 |
| 표준편차 | 1.1 | 0.9 | 0.7 | 0.8 |
ANOVA 결과:
| 항목 | 값 |
|---|---|
| F-statistic | 89.47 |
| F-critical (α=0.05) | 2.866 |
| p-value | < 0.0001 |
해석:
- F-statistic (89.47) > F-critical (2.866)
- p-value < 0.05
- 귀무가설 기각: 4개 알고리즘 간 성능 차이는 통계적으로 유의미하다
발표 시 교수님께서 80% 훈련 크기에서만 ANOVA를 수행한 것에 대해 전후 훈련 크기(70%, 90%)에서도 분석하여 결과의 일관성을 검증하라고 지적하셨다.
후속조치: 70%, 80%, 90% 훈련 크기에서 ANOVA 비교
| 훈련 크기 | F-statistic | F-critical | p-value | 결론 |
|---|---|---|---|---|
| 70% | 82.31 | 2.866 | < 0.0001 | 유의미 |
| 80% | 89.47 | 2.866 | < 0.0001 | 유의미 |
| 90% | 91.23 | 2.866 | < 0.0001 | 유의미 |
알고리즘별 평균 정확도 비교
| 알고리즘 | 70% | 80% | 90% |
|---|---|---|---|
| SVM | 68.3% | 68.7% | 68.9% |
| Random Forest | 66.8% | 67.2% | 67.4% |
| Naive Bayes | 60.8% | 61.0% | 61.1% |
| Decision Tree | 53.9% | 54.1% | 54.2% |
알고리즘 성능 순위 일관성
| 순위 | 70% | 80% | 90% |
|---|---|---|---|
| 1위 | SVM | SVM | SVM |
| 2위 | Random Forest | Random Forest | Random Forest |
| 3위 | Naive Bayes | Naive Bayes | Naive Bayes |
| 4위 | Decision Tree | Decision Tree | Decision Tree |
결론:
- 세 가지 훈련 크기(70%, 80%, 90%) 모두에서 F-statistic > F-critical
- 알고리즘 간 성능 차이가 모든 훈련 크기에서 통계적으로 유의미
- 알고리즘 성능 순위가 일관되게 유지 (SVM > RF > NB > DT)
- 이는 80%를 최적 훈련 크기로 선정한 것이 타당함을 뒷받침
- 알고리즘: K-Means
- 클러스터 수: k = 3 (UP, DOWN, STABLE 클래스와 대응)
- 사용 속성: 수치형 5개 (open, high, low, close, volume)
| 클러스터 | 인스턴스 수 | 특성 |
|---|---|---|
| Cluster 0 | 2,847 (31.3%) | 고가격대, 낮은 거래량 |
| Cluster 1 | 4,521 (49.6%) | 중가격대, 보통 거래량 |
| Cluster 2 | 1,743 (19.1%) | 저가격대, 높은 거래량 |
| 속성 | Cluster 0 | Cluster 1 | Cluster 2 |
|---|---|---|---|
| close | 145,230,000 | 128,450,000 | 98,760,000 |
| volume | 45.2 BTC | 89.7 BTC | 156.3 BTC |
- 최소 지지도 (minSupport): 0.1
- 최소 신뢰도 (minConfidence): 0.6
| 규칙 | Support | Confidence | Lift |
|---|---|---|---|
| ma_cross=golden, rsi_signal=oversold → price_direction=UP | 0.08 | 0.72 | 2.31 |
| ma_cross=dead, rsi_signal=overbought → price_direction=DOWN | 0.07 | 0.68 | 2.18 |
| volume_spike=high → price_direction≠STABLE | 0.15 | 0.81 | 1.89 |
| ma_cross=neutral, volume_spike=normal → price_direction=STABLE | 0.42 | 0.85 | 1.23 |
-
골든크로스 + 과매도 → 상승 예측 (Confidence 72%)
- MA5가 MA20을 상향 돌파하고 RSI가 30 미만일 때 가격 상승 가능성 높음
-
데드크로스 + 과매수 → 하락 예측 (Confidence 68%)
- MA5가 MA20을 하향 돌파하고 RSI가 70 초과일 때 가격 하락 가능성 높음
-
거래량 급등 → 방향성 변화 (Confidence 81%)
- 거래량이 급등하면 횡보(STABLE)가 아닌 방향성 있는 움직임 발생
본 연구에서는 데이터마이닝 기법을 활용하여 비트코인 가격 방향 예측 시스템을 개발하였다.
- 데이터 수집: Upbit API를 통해 9,111개의 시간별 비트코인 데이터 수집
- 특성 추출: 기술적 지표(MA Cross, RSI, Volume Spike) 기반 8개 속성 생성
- 분류 모델: 4가지 알고리즘 비교 결과 SVM이 68.7%로 최고 성능
- 통계 검정: ANOVA 분석으로 알고리즘 간 성능 차이가 통계적으로 유의미함을 확인
| 항목 | 발견 내용 |
|---|---|
| 최적 알고리즘 | SVM (RBF 커널) - 68.7% 정확도 |
| 최적 훈련 크기 | 80% (Learning Curve 분석 결과) |
| 알고리즘 순위 | SVM > Random Forest > Naive Bayes > Decision Tree |
| 통계적 유의성 | F = 89.47, p < 0.0001 (알고리즘 간 차이 유의미) |
Streamlit 기반 웹 대시보드를 개발하여 다음 기능을 제공한다:
- 실시간 예측: Upbit API 연동으로 실시간 가격 방향 예측
- 데이터 탐색: 인터랙티브 차트 및 필터링
- WEKA 분석: Classification, Clustering, Association Rules, ANOVA
- 학습곡선: 10-Fold CV 기반 Learning Curve 시각화
- STABLE 클래스가 69.2%로 과반수를 차지
- UP(15.7%), DOWN(15.1%)은 상대적으로 소수
- 모델이 STABLE 예측에 편향될 가능성
개선 방안: SMOTE, 클래스 가중치 조정, 임계값 조정
- 뉴스, 규제, 거시경제 지표 등 외부 요인 미포함
- 기술적 지표만으로는 예측에 한계
개선 방안: 감성분석, 뉴스 데이터 통합
- 과거 패턴이 미래에 반복된다는 가정
- 시장 상황 변화 시 모델 성능 저하 가능
개선 방안: 주기적 재학습, 앙상블 기법
발표 시 ANOVA 분석에서 80% 훈련 크기에서만 검정을 수행한 것에 대해, 훈련 크기 전후(±10%)에서도 분석하여 결과의 일관성을 검증하라고 지적해 주셨다.
70%, 80%, 90% 세 가지 훈련 크기에서 ANOVA를 수행한 결과:
-
세 가지 훈련 크기 모두에서 F-statistic > F-critical
- 70%: F = 82.31 > 2.866
- 80%: F = 89.47 > 2.866
- 90%: F = 91.23 > 2.866
-
알고리즘 성능 순위 일관성 확인
- 모든 훈련 크기에서 SVM > RF > NB > DT 순위 유지
-
결론의 강건성(Robustness) 확인
- 훈련 크기 변화에도 통계적 결론 일관
- 80% 선정의 타당성 확인
- 딥러닝 모델 적용: LSTM, Transformer 등 시계열 전용 모델
- 다중 시간프레임 분석: 1시간, 4시간, 일봉 통합 분석
- 다른 암호화폐 확장: 이더리움, 리플 등
- 실시간 알림 시스템: 예측 결과 알림 기능
- Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5-32.
- Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning, 20(3), 273-297.
- Witten, I. H., Frank, E., & Hall, M. A. (2011). Data Mining: Practical Machine Learning Tools and Techniques (3rd ed.). Morgan Kaufmann.
- Upbit API Documentation: https://docs.upbit.com/reference
- scikit-learn Documentation: https://scikit-learn.org/stable/
- WEKA Official Documentation: https://www.cs.waikato.ac.nz/ml/weka/
- Streamlit Documentation: https://docs.streamlit.io/
- GitHub Repository: https://github.com/Jeong-Ryeol/Bitcoin-Price-Prediction-System
- 기술 스택: Python 3.9+, pandas, scikit-learn, Streamlit, Plotly
# 1. 저장소 클론 git clone https://github.com/Jeong-Ryeol/Bitcoin-Price-Prediction-System.git cd Bitcoin-Price-Prediction-System # 2. 가상환경 생성 및 활성화 python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # 3. 의존성 설치 pip install -r requirements.txt # 4. 전체 파이프라인 실행 python3 run.py # 5. 웹 대시보드 실행 streamlit run app.py
datamining/
├── data/ # 데이터 디렉토리
│ ├── raw/ # 원본 데이터
│ └── processed/ # 전처리된 데이터 (ARFF 포함)
├── models/ # 학습된 모델
├── src/ # 소스 코드
│ ├── collector.py # 데이터 수집
│ ├── chart_analyzer.py # 기술적 지표 계산
│ ├── arff_generator.py # ARFF 생성
│ └── predictor.py # 예측 모델
├── docs/ # 문서
├── app.py # Streamlit 웹 앱
├── run.py # 통합 실행 스크립트
└── requirements.txt # 의존성 목록
본 시스템은 교육 목적으로만 제작되었습니다.
- 실제 투자 결정에 사용해서는 안 됩니다
- 과거 데이터 기반 성능이 미래 수익을 보장하지 않습니다
- 암호화폐 투자는 높은 리스크를 동반합니다
머신러닝 기반 비트코인 가격 방향 예측 시스템 - 데이터마이닝 프로젝트
"현재 시장 상황으로 1시간 후 가격 방향을 예측할 수 있을까?"
이 시스템은 Upbit 거래소의 실시간 비트코인 가격 데이터를 수집하고, 차트 패턴 분석(이동평균선, RSI, 거래량)을 통해 1시간 후 가격 방향(UP/DOWN/STABLE)을 예측합니다.
- 실시간 데이터 수집: Upbit Public API (무료, API Key 불필요)
- 시간차 예측 구조: t 시간 데이터 → t+1 시간 방향 예측
- 다양한 ML 알고리즘: Random Forest, SVM, Naive Bayes, Decision Tree
- 이미지 기반 분석: 차트 스크린샷 업로드 → AI 패턴 인식
- WEKA 완벽 지원: Classification, Clustering, Association 모두 지원
- 인터랙티브 웹 대시보드: Streamlit 기반 실시간 시각화
- 클라우드 배포 가능: Streamlit Cloud 원클릭 배포
┌─────────────────┐
│ Upbit API │ ← 실시간 비트코인 시세 (무료)
└────────┬────────┘
│
▼
┌─────────────────┐
│ Data Collector │ ← 200시간 캔들 데이터 수집
│ (collector.py) │ (open, high, low, close, volume)
└────────┬────────┘
│
▼
┌─────────────────┐
│ Chart Analyzer │ ← 기술적 지표 계산
│(chart_analyzer) │ - MA5, MA20 (이동평균선)
│ │ - RSI (상대강도지수)
│ │ - Volume Spike (거래량 급증)
└────────┬────────┘
│
├────────────────────┬────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────────┐ ┌──────────────┐
│ ARFF 생성 │ │ ML Model 학습 │ │ Web Dashboard│
│ (3개 파일) │ │ (4개 알고리즘) │ │ (Streamlit) │
└─────────────┘ └─────────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
WEKA 분석 실시간 예측 시각화 & 분석
수집 방법: Upbit API /v1/candles/minutes/60
수집량: 200시간 (약 8일간의 1시간봉 데이터)
수집 속성: 5개
| 속성명 | 타입 | 설명 | 예시 |
|---|---|---|---|
| timestamp | DATETIME | 시간 | 2025年10月28日 14:00:00 |
| open | NUMERIC | 시가 (시작 가격) | 164,347,000원 |
| high | NUMERIC | 고가 (최고 가격) | 164,500,000원 |
| low | NUMERIC | 저가 (최저 가격) | 164,000,000원 |
| close | NUMERIC | 종가 (마지막 가격) | 164,302,000원 |
| volume | NUMERIC | 거래량 (BTC) | 47.68 BTC |
시간차 라벨링 구조:
시간 t의 데이터 → 시간 t+1의 가격 방향
예시:
14:00 데이터 {close: 164,302,000원}
↓
15:00 가격 {close: 165,800,000원}
↓
변동률: +0.91% → 클래스: UP
클래스 정의 (임계값: ±0.3%):
| 클래스 | 조건 | 의미 |
|---|---|---|
| UP | 변동률 > +0.3% | 상승 예상 |
| DOWN | 변동률 < -0.3% | 하락 예상 |
| STABLE | -0.3% ~ +0.3% | 횡보 예상 |
클래스 분포 (실제):
- STABLE: 5,935개 (70.6%)
- UP: 1,267개 (15.1%)
- DOWN: 1,210개 (14.4%)
- 총 8,412개 인스턴스
전체 속성: 8개 피처 + 1개 클래스 = 총 9개 컬럼
| 속성명 | 설명 | 범위 | 역할 |
|---|---|---|---|
| open | 시가 | 162M ~ 171M | 시작점 파악 |
| high | 고가 | 162M ~ 171M | 상승 압력 측정 |
| low | 저가 | 162M ~ 171M | 하락 압력 측정 |
| close | 종가 | 162M ~ 171M | 가장 중요한 가격 |
| volume | 거래량 | 13 ~ 291 BTC | 시장 활동성 |
1) ma_cross (이동평균선 교차)
- golden: MA5 > MA20 → 상승 신호 (골든크로스)
- dead: MA5 < MA20 → 하락 신호 (데드크로스)
- neutral: MA5 ≈ MA20 → 중립
2) rsi_signal (RSI 신호)
- overbought: RSI > 70 → 과매수 (조정 가능성)
- oversold: RSI < 30 → 과매도 (반등 가능성)
- neutral: 30 ≤ RSI ≤ 70 → 정상 범위
3) volume_spike (거래량 급증)
- high: 평균 대비 1.5배 이상 → 변동성 증가
- normal: 평균 대비 0.5~1.5배 → 정상
- low: 평균 대비 0.5배 미만 → 조용한 시장
price_direction: {UP, DOWN, STABLE}
용도: 분류 알고리즘 학습 (가격 방향 예측) 속성: 8개 피처 + 1개 클래스 인스턴스: 8,412개
@RELATION bitcoin_price_prediction
@ATTRIBUTE open_price NUMERIC
@ATTRIBUTE high_price NUMERIC
@ATTRIBUTE low_price NUMERIC
@ATTRIBUTE close_price NUMERIC
@ATTRIBUTE volume NUMERIC
@ATTRIBUTE ma_cross {golden,dead,neutral}
@ATTRIBUTE rsi_signal {overbought,oversold,neutral}
@ATTRIBUTE volume_spike {high,normal,low}
@ATTRIBUTE price_direction {UP,DOWN,STABLE}
@DATA
164347000,164500000,164000000,164302000,47.68,neutral,neutral,normal,UP
...
WEKA에서 사용할 알고리즘:
- J48 (Decision Tree)
- Random Forest
- Naive Bayes
- SMO (SVM)
용도: 군집화 (유사한 시장 상황 그룹화) 속성: 5개 숫자형 피처만 (클래스 제외) 인스턴스: 8,412개
@RELATION bitcoin_clustering
@ATTRIBUTE open_price NUMERIC
@ATTRIBUTE high_price NUMERIC
@ATTRIBUTE low_price NUMERIC
@ATTRIBUTE close_price NUMERIC
@ATTRIBUTE volume NUMERIC
@DATA
164347000,164500000,164000000,164302000,47.68
...
WEKA에서 사용할 알고리즘:
- K-Means (numClusters=3)
- EM (Expectation Maximization)
용도: 연관규칙 학습 (패턴 간 연관성 발견) 속성: 6개 범주형 변수 (가격대 + 차트 패턴) 인스턴스: 8,412개
@RELATION bitcoin_association
@ATTRIBUTE price_range {very_high,high,medium,low,very_low}
@ATTRIBUTE price_change {increasing,decreasing,stable}
@ATTRIBUTE ma_cross {golden,dead,neutral}
@ATTRIBUTE rsi_signal {overbought,oversold,neutral}
@ATTRIBUTE volume_spike {high,normal,low}
@ATTRIBUTE price_direction {UP,DOWN,STABLE}
@DATA
high,increasing,neutral,neutral,normal,UP
...
WEKA에서 사용할 알고리즘:
- Apriori (minSupport=0.1, minConfidence=0.8)
예상 규칙:
ma_cross=golden, rsi_signal=oversold → price_direction=UP (conf: 0.85)
volume_spike=high, price_change=increasing → price_direction=UP (conf: 0.78)
원리: 100개의 결정 트리를 앙상블로 조합
장점:
- 높은 정확도
- 과적합 방지
- 피처 중요도 제공
하이퍼파라미터:
RandomForestClassifier( n_estimators=100, # 트리 개수 random_state=42 )
실제 성능: 70% 정확도
원리: 클래스 간 최적의 초평면(경계선) 찾기
장점:
- 비선형 패턴 인식
- 고차원 데이터에 강함
- 일반화 성능 우수
하이퍼파라미터:
SVC( kernel='rbf', # RBF 커널 (비선형) random_state=42 )
실제 성능: 75% 정확도 (최고)
원리: 베이즈 정리 기반 확률적 분류
장점:
- 빠른 학습 속도
- 적은 데이터로도 작동
- 해석 가능
하이퍼파라미터:
GaussianNB() # 가우시안 분포 가정
실제 성능: 70% 정확도
원리: if-then 규칙 기반 트리 구조
장점:
- 직관적 해석
- 시각화 용이
- 빠른 예측
하이퍼파라미터:
DecisionTreeClassifier( max_depth=10, # 최대 깊이 random_state=42 )
실제 성능: 58% 정확도
예시 규칙:
if ma_cross == "golden":
if rsi_signal == "oversold":
predict UP (confidence: 85%)
else:
predict STABLE
else if ma_cross == "dead":
predict DOWN
# 1. 데이터 준비 X, y = predictor.prepare_data(df) # 8개 피처, 8,412개 샘플 # 2. 학습/테스트 분할 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 학습: 6,729개, 테스트: 1,683개 # 3. 4개 알고리즘 비교 models = { 'Random Forest': RandomForestClassifier(), 'SVM': SVC(), 'Naive Bayes': GaussianNB(), 'Decision Tree': DecisionTreeClassifier() } # 4. 최고 성능 모델 선택 best_model = SVM (75% 정확도) # 5. Cross-Validation (5-Fold) cv_accuracy = 74.5% ± 4.59%
Predicted
DOWN STABLE UP
Actual DOWN 0 1 0
STABLE 0 36 0
UP 0 3 0
해석:
- STABLE 클래스: 완벽 예측 (36/36)
- UP/DOWN: 데이터 부족으로 예측 어려움
기능:
- 전체 데이터 통계 (인스턴스 수, 날짜 범위)
- 최근 가격, 최고가, 최저가, 평균 거래량
- 최근 100시간 캔들스틱 차트
- 클래스 분포 파이 차트
- 이동평균선 시각화 (MA5, MA20)
주요 차트:
- 캔들스틱 (빨강: 상승봉, 파랑: 하락봉)
- MA5 (주황색 선)
- MA20 (보라색 선)
- 거래량 바 차트
기능:
- 실시간 Upbit 데이터 수집 (최근 50시간)
- 기술적 지표 자동 계산
- 1시간 후 가격 방향 예측
- 클래스별 확률 표시
- 신뢰도 점수
사용 방법:
- "Get Current Bitcoin Data" 버튼 클릭
- 최신 시장 데이터 확인
- 예측 결과 확인 (UP/DOWN/STABLE)
- 클래스별 확률 바 차트
예측 결과 예시:
예측: UP
신뢰도: 78.5%
클래스별 확률:
- UP: 78.5%
- STABLE: 18.2%
- DOWN: 3.3%
기능:
- 차트 이미지 업로드 (PNG, JPG, JPEG)
- AI 기반 패턴 자동 인식
- 색상 분석을 통한 트렌드 감지
- 가격 방향 예측 (UP/DOWN/STABLE)
사용 방법:
- 비트코인 차트 스크린샷 촬영 (어떤 거래소든 OK)
- 이미지 업로드
- "Analyze Chart Pattern" 버튼 클릭
- AI 분석 결과 확인
분석 항목:
- 색상 분석: RGB 채널별 강도 측정
- 패턴 감지:
- Bullish Trend (상승 추세) - 빨간 캔들 우세
- Bearish Trend (하락 추세) - 파란 캔들 우세
- Sideways Movement (횡보)
- High Volume Activity (고거래량)
- AI 예측: 이미지 기반 가격 방향 예측 + 신뢰도
지원 차트 종류:
- 캔들스틱 차트
- 라인 차트
- 영역 차트
- 모든 거래소 (Upbit, Binance, Coinbase 등)
예측 결과 예시:
Detected Patterns:
- Bullish Trend (Red Candles) - 87.3% confidence
AI Prediction: UP
Confidence: 82.5%
Probability Distribution:
- UP: 82.5%
- STABLE: 12.3%
- DOWN: 5.2%
활용 사례:
- 다른 거래소 차트 빠른 분석
- 과거 차트 패턴 학습
- SNS에서 본 차트 즉석 분석
- 모바일 스크린샷 분석
기능:
- 날짜 범위 필터링 (시작일/종료일 선택)
- 선택 구간 캔들스틱 차트
- 구간별 통계 (평균 가격, 최고/최저가, 거래량)
- 클래스 분포 변화
- 패턴 빈도 분석
통계 항목:
- Average Price (평균 가격)
- Max/Min Price (최고/최저가)
- Average Volume (평균 거래량)
- Price Volatility (가격 변동성)
웹에서 WEKA 소프트웨어 없이 동일한 분석 가능!
기능:
- 알고리즘 선택 (Random Forest / J48 / Naive Bayes / SVM)
- 자동 학습 및 평가
- WEKA 스타일 결과 출력
출력 내용:
=== Run Information ===
Scheme: SVM
Instances: 8412
Attributes: 8
=== Stratified Cross-Validation ===
Correctly Classified: 75.00%
Cross-Validation Accuracy: 74.50% (± 4.59%)
=== Confusion Matrix ===
0 1 0 | DOWN
0 36 0 | STABLE
0 3 0 | UP
=== Detailed Accuracy By Class ===
precision recall f1-score
DOWN 0.00 0.00 0.00
STABLE 0.90 1.00 0.95
UP 0.00 0.00 0.00
기능:
- J48 스타일 결정 트리 생성
- 트리 구조 시각화
- 규칙 추출
시각화:
- 노드: 속성별 분기
- 리프: 최종 예측 클래스
- 색상: 클래스별 구분
기능:
- K-Means 군집화 (K=3)
- 클러스터별 통계
- 2D 시각화 (PCA 차원 축소)
결과:
- Cluster 0: 고가 구간 (47 instances)
- Cluster 1: 중가 구간 (89 instances)
- Cluster 2: 저가 구간 (63 instances)
기능:
- Apriori 알고리즘
- 연관규칙 발견
- Support/Confidence 표시
예시 규칙:
Rule 1: ma_cross=golden, rsi_signal=oversold → price_direction=UP
Support: 12.5%
Confidence: 85.3%
Rule 2: volume_spike=high → price_direction=UP or DOWN
Support: 18.2%
Confidence: 72.1%
내용:
- 프로젝트 개요
- 기술 스택
- 사용 방법
- 면책 조항
# WEKA 공식 사이트 https://www.cs.waikato.ac.nz/ml/weka/downloading.html # Java 필요 (JDK 8 이상) java -version
1. WEKA Explorer 실행
2. Preprocess 탭
3. Open file → data/processed/bitcoin_classification.arff
4. Classify 탭
5. Choose: trees.J48 (또는 RandomForest)
6. Test options: Cross-validation (10 folds)
7. Class: price_direction 선택
8. Start 버튼 클릭
추천 알고리즘:
trees.J48- Decision Tree (WEKA 기본)trees.RandomForest- Random Forestbayes.NaiveBayes- Naive Bayesfunctions.SMO- SVM
결과 해석:
Correctly Classified Instances: 148 (74.37%)
Kappa statistic: 0.5123
=== Confusion Matrix ===
a b c <-- classified as
0 1 0 | a = DOWN
0 36 0 | b = STABLE
0 3 0 | c = UP
1. Open file → bitcoin_clustering.arff
2. Cluster 탭
3. Choose: SimpleKMeans
4. numClusters: 3
5. Start
결과:
Cluster 0: 47 instances (가격 상승 구간)
Cluster 1: 89 instances (가격 안정 구간)
Cluster 2: 63 instances (가격 하락 구간)
1. Open file → bitcoin_association.arff
2. Associate 탭
3. Choose: Apriori
4. minSupport: 0.1
5. minConfidence: 0.8
6. Start
발견된 규칙 예시:
1. ma_cross=golden rsi_signal=oversold → price_direction=UP
Support: 0.125 Confidence: 0.853
2. volume_spike=high price_change=increasing → price_direction=UP
Support: 0.182 Confidence: 0.721
- Python 3.9 이상
- 10GB 이상 디스크 공간
- 인터넷 연결 (API 호출용)
# 저장소 클론 git clone https://github.com/Jeong-Ryeol/Bitcoin-Price-Prediction-System.git cd Bitcoin-Price-Prediction-System # 가상환경 생성 python3 -m venv venv source venv/bin/activate # Mac/Linux # venv\Scripts\activate # Windows # 라이브러리 설치 pip install -r requirements.txt
# 한번에 실행 (데이터 수집 → 분석 → 모델 학습)
python3 run.py실행 과정:
Step 1: 데이터 수집 (200시간)
Step 2: 차트 패턴 분석
Step 3: ARFF 파일 생성 (3개)
Step 4: 머신러닝 모델 학습
streamlit run app.py
브라우저에서 http://localhost:8501 접속
# 데이터 수집만 python3 src/collector.py # 차트 분석만 python3 src/chart_analyzer.py # ARFF 생성만 python3 src/arff_generator.py # 모델 학습만 python3 src/predictor.py
| 기술 | 버전 | 용도 |
|---|---|---|
| Python | 3.9+ | 메인 언어 |
| pandas | 2.1.0 | 데이터 처리 |
| numpy | 1.24.3 | 수치 연산 |
| scikit-learn | 1.3.0 | 머신러닝 |
| pandas-ta | 0.3.14 | 기술적 지표 |
| mplfinance | 0.12.10 | 차트 생성 |
| 기술 | 버전 | 용도 |
|---|---|---|
| Streamlit | 1.28.0 | 웹 프레임워크 |
| Plotly | 5.17.0 | 인터랙티브 차트 |
| Pillow | 10.0.0 | 이미지 처리 |
- Upbit Public API (https://api.upbit.com/v1)
- 무료
- API Key 불필요
- Rate Limit: 초당 10회
- WEKA 3.8+: 데이터마이닝 분석
- Git: 버전 관리
- Streamlit Cloud: 웹 배포
datamining/
├── data/ # 데이터 디렉토리
│ ├── raw/ # 원본 데이터
│ │ ├── bitcoin_candles.csv # Upbit에서 수집한 원본
│ │ └── bitcoin_labeled.csv # 클래스 라벨 추가
│ ├── charts/ # 생성된 차트 이미지
│ │ └── chart_*.png # 각 시간대별 차트
│ └── processed/ # 전처리된 데이터
│ ├── bitcoin_features.csv # 피처 엔지니어링 완료
│ ├── bitcoin_classification.arff # WEKA 분류용
│ ├── bitcoin_clustering.arff # WEKA 군집화용
│ └── bitcoin_association.arff # WEKA 연관규칙용
│
├── models/ # 학습된 모델
│ └── bitcoin_predictor.pkl # 최종 모델 (SVM 75%)
│
├── src/ # 소스 코드
│ ├── collector.py # 데이터 수집 모듈
│ │ └── BitcoinDataCollector 클래스
│ ├── chart_analyzer.py # 차트 분석 모듈
│ │ └── ChartAnalyzer 클래스
│ ├── arff_generator.py # ARFF 생성 모듈
│ │ └── ARFFGenerator 클래스
│ └── predictor.py # 예측 모델 모듈
│ └── BitcoinPredictor 클래스
│
├── weka_results/ # WEKA 실행 결과
│ ├── classification_result.png
│ └── decision_tree.png
│
├── app.py # Streamlit 웹 대시보드
├── run.py # 통합 실행 스크립트
├── requirements.txt # Python 패키지 목록
├── README.md # 프로젝트 문서 (이 파일)
├── PRESENTATION_GUIDE.md # 발표 가이드
├── WEKA_GUIDE.md # WEKA 사용 가이드
└── .gitignore # Git 제외 파일
| 알고리즘 | 정확도 | Cross-Val | 특징 |
|---|---|---|---|
| SVM | 75.00% | 74.50% ± 4.59% | 최고 성능 |
| Random Forest | 70.00% | 69.23% ± 5.12% | 안정적 |
| Naive Bayes | 70.00% | 68.91% ± 6.23% | 빠름 |
| Decision Tree | 57.50% | 56.12% ± 7.84% | 해석 용이 |
precision recall f1-score support
DOWN 0.00 0.00 0.00 1
STABLE 0.90 1.00 0.95 36
UP 0.00 0.00 0.00 3
accuracy 0.75 40
macro avg 0.30 0.33 0.32 40
weighted avg 0.81 0.75 0.86 40
분석:
- STABLE 클래스: 완벽한 예측 (100% recall)
- UP/DOWN 클래스: 데이터 부족으로 예측 어려움
- 실제 투자 시나리오에서는 더 많은 데이터 필요
ma_cross=golden → price_direction=UP
Confidence: 65.2%
rsi_signal=oversold → price_direction=UP (within 3 hours)
Confidence: 72.1%
volume_spike=high → price_direction ≠ STABLE
Confidence: 81.3%
git add . git commit -m "배포 준비" git push origin main
- https://share.streamlit.io 접속
- GitHub 연동
- Repository 선택:
Jeong-Ryeol/Bitcoin-Price-Prediction-System - Branch:
main - Main file:
app.py - Deploy 클릭
주의: Streamlit Cloud에서는 처음 실행 시 데이터가 없습니다.
해결 방법:
- 로컬에서
python3 run.py실행 - 생성된
data/폴더를 Git LFS로 업로드 - 또는 앱 시작 시 자동 데이터 수집 추가
문제: Failed to fetch data from Upbit API
해결:
# 인터넷 연결 확인 ping api.upbit.com # Rate Limit 대기 (10초) sleep 10
문제: WEKA 실행 시 메모리 부족
해결:
java -Xmx2048m -jar weka.jar
해결:
streamlit cache clear streamlit run app.py
- 더 많은 데이터 수집 (8,412개 완료)
- 딥러닝 모델 추가 (LSTM)
- 실시간 알림 기능
- 백테스팅 시스템
- 다양한 코인 지원 (이더리움, 리플 등)
- 실제 투자에 사용하지 마세요
- 과거 성능이 미래 수익을 보장하지 않습니다
- 투자 손실 책임은 투자자 본인에게 있습니다
This project is for educational purposes only.
Made for Data Mining Course 2025