5.1로 만든 엑셀 알고리즘 5.2로 평가해보기.ㅋㅋㅋ
Q: 현재까지 우리가 만들어온 엑셀 파일이다. 달라진 부분도 있으니 상세히 분석해서 알고리즘에 대해 다시 평가해주고, 개선할 점이 있으면 자세히 알려줘.
업로드한 FTI_4Investor_RecentQuad_AllRenamed.xlsx 기준으로, 지금 “스크립트(엑셀 수식 알고리즘)”이 하는 일을 구조적으로 다시 정리 + 평가 + 개선 포인트까지 묶어서 볼게.
입력(사용자 데이터)
Date, Price
4주체 순매수(여기서는 RP로 표기): Indv / Frgn / Inst / Pension
출력(핵심 지표)
FT (Flow Temperature): “기준선 대비 순매수 온도(편차)”의 EMA
FTI (Flow Trend Index): FT를 “평균적인 변동(절대편차)”로 나눈 지속성/방향성 지표 (범위 -1~+1)
Score: FTI를 임계치로 -2~-1~0~+1~+2 등급화
v4 추가분: FT_Scale → FT_shock(tanh) → Score_v4 = FTI * shock
Params 시트
N (Baseline Length)=10
Baseline Mode (T3/EMA)=EMA (현재는 EMA)
EMA 모드일 때(각 주체별 동일):
Base(t) = αN·RP(t) + (1-αN)·Base(t-1)
첫 행은 초기화로 Base(첫날)=RP(첫날)
T3 모드일 때는 S1~S6(EAVG 체인) + c1~c4로 T3를 만들고 그걸 Base로 씁니다(구조는 정상).
Dev(t) = RP(t) − Base(t)
“오늘 순매수가, 최근 평균(기준선) 대비 얼마나 튀었나?”
Params 시트
M (FTI Smoothing for Dev)=10
FT(t) = αM·Dev(t) + (1-αM)·FT(t-1)
→ “편차가 연속적으로 누적되는 온도”
FTVol(t) = αM·|Dev(t)| + (1-αM)·FTVol(t-1)
FTI(t) = FT(t) / FTVol(t) (FTVol=0이면 0 처리)
이게 이 템플릿의 제일 좋은 핵심인데,
Dev가 같은 방향으로 꾸준하면 → FT와 FTVol이 비슷해져서 |FTI|→1
Dev가 왔다갔다하면 → FT는 상쇄되어 작아지고, FTVol은 남아서 FTI→0
즉 FTI는 “순매수의 절대 크기”가 아니라 **지속성(일관성)**을 뽑아내는 구조야.
Params
FT Scale Length (ER_Period)=10
FT Sensitivity K=1
Scale(t) = αER·|RP(t)-RP(t-1)| + (1-αER)·Scale(t-1)
shock(t) = TANH( (Dev(t)/Scale(t))·K )
Score_v4(t) = FTI(t) · shock(t)
이게 의미하는 바:
FTI가 높아도 오늘 Dev가 거의 없으면(=shock≈0) 점수는 작아짐
반대로 “오늘 Dev가 확 튀는데, 그게 며칠째 같은 방향”이면 점수 커짐
→ ‘지속성’과 ‘당일 임팩트’를 결합한 점수로 진화한 거야.
FTI 부호(+/-) + 1일 변화(ΔFTI)로
Buy Strengthening / Buy Weakening
Sell Cooling / Sell Intensifying
같은 텍스트 판정
22일 평균 FTI(Mean)와 “마지막−평균(ΔvsMean)”으로 4분면:
Q1: Mean>0 & Δ>0 (강한 매수 모멘텀)
Q2: Mean>0 & Δ≤0 (과열/식는 중)
Q3: Mean≤0 & Δ≤0 (강한 매도 모멘텀)
Q4: Mean≤0 & Δ>0 (바닥/회복)
예: Q2→Q4, Q4→Q1 전환 횟수를 SUMPRODUCT로 집계 (현재 파일에서는 실제로 Institution/Pension에서 Q4→Q1이 1회 잡히는 상태)
22일 Quadrant(FTI)
Individual: Q4 Bottoming/Recovering (평균은 음수였는데 최근 개선)
Foreign: Q2 Topping/Cooling (평균은 양수였는데 최근 꺾임)
Institution: Q1 Strong Buy Momentum
Pension: Q4 Bottoming/Recovering
그리고 같은 날의 Score_v4는
Individual: +0.0054 (FTI 음수지만 shock도 음수→ 곱이 미세 양수)
Foreign: -0.0017
Institution: +0.0211
Pension: -0.0113
처럼 “FTI만 볼 때의 밋밋함(Score=0 구간)”을 조금 더 세분화해주는 역할을 잘 하고 있어.
FTI = E[Dev] / E[|Dev|] 형태라서, “크기”가 아니라 일관성을 잡는다. (수급이 출렁이기만 하면 0 근처로 눌림)
기준선(Base) 옵션을 EMA/T3로 둔 건 훌륭함. 종목/주체마다 성격이 달라서 튜닝이 가능.
v4의 shock 도입으로, “지속성(FTI)”만으로는 부족했던 당일 임팩트를 보강했다.
RP 스케일 문제
RP가 “주/일” 단위 그대로면, 유동성/분할/수급 구조 변화에 취약해져.
“tanh(Dev/Scale)”의 Scale이 현재는 |ΔRP| 기반
Dev의 전형적인 크기와 ΔRP의 전형적인 크기가 어긋나는 구간에서 shock이 과대/과소평가될 수 있어.
Score_v4가 “곱(product)”이라
둘 중 하나가 0 근처면 점수가 급격히 죽음(의도이긴 한데, 신호가 너무 얌전해질 때가 있음).
가장 효과 큰 업그레이드.
예: RP_Value = RP * Price
또는 (가능하면) RP / Volume, RP_Value / Turnover 같은 형태
그 다음 Base/Dev/FT/FTI를 정규화된 RP로 돌리면,
종목이 바뀌어도,
액면/유동성/거래대금 체급이 달라져도
지표 성격이 훨씬 안정돼.
현재 Scale은 |ΔRP| EMA인데, 실무적으로는 아래가 더 잘 맞을 때가 많아.
대안 A (가장 간단/일관):
Scale(t) = FTVol(t) (이미 계산돼 있음)
shock = TANH(Dev / Scale)
의미가 딱 떨어져:
“오늘 Dev가, 최근 Dev의 평균적 크기 대비 얼마나 큰가?”
지금은 Mean의 부호(0 기준)만으로 Q1/Q3이 갈리는데, 0 근처에서 쓸데없는 스위치가 늘 수 있어.
예:
Mean > +0.05일 때만 “Buy-side”
Mean < -0.05일 때만 “Sell-side”
그 사이는 Neutral band로 두기
이러면 Switch 카운트가 “의미 있는 전환”만 남는다.
실전에서 체감이 큼.
Fast: N=5~8, M=3~5 (단기 감지)
Slow: N=15~30, M=8~15 (레짐)
그리고 신호를
Slow가 바닥(Q4)인데 Fast가 Q1로 꺾이는 순간
같은 식으로 잡으면 훨씬 트레이딩 친화적인 엔트리/탈출 트리거가 된다.
지금도 마지막날 Buy/Sell 카운트는 있지만,
실전에서는 보통
Foreign/Institution 가중치 ↑
Individual은 반대로(역가중) 보거나
가중합을 따로 보는 경우가 많아.
예: Alignment = 0.4*Frgn + 0.4*Inst + 0.2*Pension - 0.2*Indv 같은 형태(취향/종목별 튜닝)
원하면 위 개선안 중 (1) RP 정규화 + (2) Scale=FTVol로 shock 재정의 + (3) Quadrant 히스테리시스까지는 “v5 파일”로 깔끔하게 반영해서, 지금 Dashboard 구성 유지한 채로 업그레이드 버전도 만들어줄 수 있어.
진행시켜!
했더니 15분 동안 생각 중...
실화냐...ㅂㄷㅂㄷ
완성품 나와서
실행 시켜보니 에러 없이 작동함. 일단 합격!!!
=================================
Data 시트의 모든 핵심 계산(Base/Dev/FT/FTVol/FTI)이 기본적으로 RP*Price 흐름을 기준으로 돌아가게 바꿨어.
Price가 빈 행은 자동으로 원래 RP로 계산되도록 fallback을 넣어서, 입력 누락에도 최대한 동작하게 해뒀어.
기존 v4의 FT_Scale(= |ΔRP| EMA)은 Dev의 전형적 크기와 어긋나는 구간이 생길 수 있어서,
v5에서는 FT_Scale = FTVol로 통일:
shock = TANH( Dev / FTVol * K )
즉 “오늘 Dev가 최근 Dev 변동성 대비 얼마나 센지”로 shock이 정규화돼.
Params에 새 파라미터 추가:
Params!B38 = Mean Band (Hysteresis) (기본값 0.05)
Dashboard의
“Recent Quadrant Comparison (Window N)”(E18~E21)
“Quadrant Comparison (Last N Days)”의 Q-code( Z44:AC83 )
에 모두 반영했어.
로직:
ABS(Mean) <= Band면 중립 구간으로 보고,
일별 Q-code 시계열(Z~AC)은 이전 Quadrant를 유지(스위치 과다 방지)
최신 스냅샷(E18~E21)은 Neutral 표시
Mean Band (Params!B38):
스위치가 너무 잦으면 0.07~0.12로 ↑
신호가 너무 둔하면 0.03~0.05로 ↓
K (Params!B36): shock 민감도. 0.7~1.5 범위에서 조절 추천
원하면 다음 단계로,
가중 Alignment(외인/기관 가중↑, 개인 역가중) 추가
Fast/Slow(2-속도 FTI) 트리거까지 붙인 v5.1도 같은 형식으로 바로 만들어줄게.
다음 단계, 이게 개미지옥임.ㅋㅋㅋ
15분이나 생각하고 답을 주다니
뭔가 생각하는 시간이 더 길어진걸까요~~