01
문제 정의
차트의 지지·저항선은 단순히 두 점을 연결하는 것으로 끝나지 않습니다. 많은 피벗 중 의미 있는 조합을 찾고, 가격 움직임과 얼마나 잘 맞는지 평가하며, 선정 이유를 사용자가 확인할 수 있어야 합니다.
- 후보 조합이 많아질수록 계산과 검증 기준이 복잡해집니다.
- 데이터와 조건이 같다면 결과도 같아야 합니다.
- 선만 표시하는 것이 아니라 선정 근거를 설명해야 합니다.
02
Algorithm Pipeline
OHLC Data
↓
Pivot Extraction
↓
Clustering
↓
Linear Regression
↓
Candidate Scoring
↓
Filter & Select
↓
Chart Layer Rendering- Pivot Extraction — 국소 고점과 저점을 후보 피벗으로 추출합니다.
- Clustering — 시간·가격상 가까운 피벗을 군집화합니다.
- Linear Regression — 군집별로 추세를 설명하는 후보선을 생성합니다.
- Candidate Scoring — 접촉, 가격 반응, 오차, 돌파 기준으로 후보를 평가합니다.
- Filter & Select — 기준을 통과한 후보만 지지·저항선으로 선택합니다.
- Visualization — 선택된 선과 평가 근거를 별도 차트 레이어에 표시합니다.
03
Candidate Generation
모든 점의 조합을 직접 선으로 만드는 대신, 먼저 피벗을 추출하고 유사한 피벗을 군집화해 후보 공간을 줄였습니다. 각 군집에 선형회귀를 적용해 여러 피벗의 전체 경향을 반영하는 후보선을 생성했습니다.
type Pivot = {
index: number
price: number
kind: 'high' | 'low'
}
type CandidateLine = {
slope: number
intercept: number
pivots: Pivot[]
}04
Candidate Scoring
| 평가 기준 | 의미 |
|---|---|
| 접촉 | 가격이 후보선과 의미 있게 만난 횟수 |
| 가격 반응 | 후보선 접촉 후 반등·반락이 발생한 정도 |
| 오차 | 피벗과 회귀선 사이의 거리 |
| 돌파 | 가격이 후보선을 무효화한 횟수와 강도 |
score = contactWeight
+ reactionWeight
- errorPenalty
- breakoutPenalty생성 단계와 평가 단계를 분리해 평가 기준의 변경이 후보 생성 로직에 영향을 주지 않도록 구성했습니다.
05
재현성과 설명 가능성
- 후보 생성과 검증 단계를 분리했습니다.
- 동일한 입력 데이터와 조건에서는 같은 결과가 나오도록 결정적 흐름을 유지했습니다.
- 선택된 선뿐 아니라 접촉·오차·돌파 등 평가 근거를 함께 보관했습니다.
- 평가 결과를 별도 차트 레이어에 표시해 사용자가 선정 이유를 확인할 수 있게 했습니다.
알고리즘 결과의 정확도만큼, 사용자가 결과를 검증할 수 있는 설명 가능성이 중요했습니다.
06
결과
- 피벗 군집과 회귀를 통해 후보 생성 범위를 구조화했습니다.
- 여러 평가 기준을 조합해 후보선의 품질을 비교했습니다.
- 선정 결과와 근거를 차트에서 함께 확인할 수 있습니다.