공포탐욕지수, 신호로 쓸 것인가 참고로 쓸 것인가 — 실전 운영자의 관찰

자동매매를 시작하고 초기에 가장 먼저 매달렸던 외부 지표 중 하나가 공포탐욕지수였습니다. 숫자 하나가 시장 전체의 감정을 요약해준다는 개념이 직관적으로 매력적이었습니다. 그런데 실제 운영을 몇 달 쌓다 보니, 이 지수를 ‘신호’로 쓰는 것과 ‘맥락’으로 쓰는 것 사이에 엄청난 차이가 있다는 걸 느끼게 됐습니다. 이번 칼럼에서는 제가 공포탐욕지수를 어떻게 실전 운영에 연결시켰는지, 그리고 어떤 방식으로 쓰면 오히려 독이 되는지를 솔직하게 정리해보겠습니다.

공포탐욕지수가 실제로 무엇을 측정하는지 먼저 뜯어봤습니다

많은 사람들이 공포탐욕지수를 Alternative.me에서 제공하는 숫자 하나로만 알고 있습니다. 그런데 이 지수는 단일 데이터가 아닙니다. 내부적으로 변동성(Volatility) 25%, 시장 모멘텀/거래량(Market Momentum/Volume) 25%, 소셜 미디어 감성(Social Media) 15%, 설문조사(Surveys) 15%, 비트코인 도미넌스(Bitcoin Dominance) 10%, 구글 트렌드(Google Trends) 10%의 가중치로 구성됩니다. 제가 처음 이 구성을 파악했을 때 두 가지 문제를 바로 느꼈습니다. 첫째, 소셜미디어 감성과 구글 트렌드는 후행성이 강합니다. 가격이 이미 움직인 후에 사람들이 검색하고 트윗을 올립니다. 즉, 지수가 극단 공포를 가리킬 때는 이미 큰 하락이 진행된 이후인 경우가 많습니다. 둘째, 비트코인 도미넌스 항목은 알트코인 시장의 개별 페어를 매매하는 제 시스템과는 연관성이 다소 다릅니다. SOL이나 ETH 페어를 4시간봉으로 매매할 때 BTC 도미넌스가 10% 가중치로 들어간 지수를 그대로 신호로 쓰는 건 맞지 않다는 결론이었습니다. 그래서 저는 이 지수를 ‘오늘 시장이 어느 방향으로 치우쳐 있는지’를 빠르게 파악하는 체온계 정도로 재정의했습니다.

극단값에서만 의미가 생긴다 — 0~20, 80~100 구간 집중 관찰

제가 관찰한 결과, 공포탐욕지수가 30~70 사이에 있을 때 이 숫자를 매매 판단에 끌어들이는 건 노이즈를 추가하는 것과 같았습니다. 시장이 ‘중립’일 때 지수도 중립이니 별다른 인사이트가 없습니다. 의미가 생기는 건 극단값입니다. 지수가 15 이하로 떨어질 때, 저는 시스템이 발생시키는 롱 시그널에 대해 필터를 한 단계 완화하는 방식을 실험했습니다. 반대로 지수가 85 이상일 때는 숏 시그널보다 신규 롱 진입에 추가 확인 조건을 붙이는 방식으로 운영해봤습니다. 중요한 건 이걸 자동화에 직접 연결하는 방식입니다. Alternative.me는 API를 무료로 제공합니다. 엔드포인트는 https://api.alternative.me/fng/ 이고, limit 파라미터로 과거 데이터도 가져올 수 있습니다. 저는 Python requests로 이 값을 매 4시간마다 가져와서 Jesse 전략 파일의 외부 조건 변수로 넣는 방식을 테스트해봤습니다. 다만 이 방식에는 함정이 있습니다. 지수가 극단값을 가리켜도 시장이 계속 같은 방향으로 흘러가는 경우가 존재합니다. 2022년 하락장에서 지수는 수개월간 20 이하를 유지했고, 그 구간에서 역추세 접근은 계속 손실을 냈습니다. 극단값은 반전의 ‘가능성 증가’를 뜻하지, ‘반전 확정’을 뜻하지 않습니다.

자동화 파이프라인에 어떻게 연결할 것인가 — 실험 중인 구조

현재 제가 실험 중인 방식은 공포탐욕지수를 직접 매매 신호로 쓰는 게 아니라, 포지션 사이즈 조절 레이어에 녹이는 것입니다. 구체적으로는 매 4시간마다 스케줄러(cron)가 Alternative.me API를 호출해서 값을 가져오고, 이 값을 Flask API 서버의 전역 변수로 저장합니다. TradingView 웹훅이 들어오면 Flask가 현재 공포탐욕 값을 조회해서 진입 사이즈를 세 단계로 나눕니다. 지수 0~25(극단 공포)면 기본 사이즈의 120%, 26~74(중립)면 100%, 75~100(탐욕~극단 탐욕)면 80%로 조정하는 구조입니다. 이 방식의 장점은 시그널 자체를 바꾸지 않는다는 점입니다. 기존 TradingView 전략 로직은 그대로 두고, 외부 심리 지표가 사이즈에만 영향을 줍니다. 신호 로직이 복잡해지지 않아서 디버깅이 훨씬 쉽습니다. 코드로 보면 Flask route 안에서 fear_value = get_fng_cached() 를 호출하고, size_multiplier를 if-elif로 분기하는 방식입니다. cron은 0 */4 * * * python3 /home/user/fng_update.py 형태로 설정했습니다. 아직 충분한 운영 데이터를 쌓는 중이라 이 방식이 유효한지는 검증 중이라고 밝히는 게 솔직한 표현입니다. 다만 지수를 ‘보조 필터’로 쓰는 방향성 자체는 지금도 유지할 생각입니다.

💬 운영자 한마디

저는 공포탐욕지수를 믿지 않는다기보다, 맹신하지 않는 방향으로 자리를 잡았습니다. 숫자 하나가 시장 전체를 설명할 수는 없습니다. 다만 극단값에서 ‘지금 모두가 같은 방향을 보고 있구나’라는 맥락을 빠르게 파악하는 데는 충분히 유용합니다. 저는 이 지수를 판단의 근거가 아니라 판단의 환경 정보로 씁니다.

— J_River · autoprofit 운영자

✅ 이번 주 체크리스트

  • Alternative.me FNG API(https://api.alternative.me/fng/)를 직접 호출해서 응답 구조를 확인해본다
  • 지수 0~25, 25~75, 75~100 세 구간을 각각 어떻게 해석할지 본인 기준을 먼저 문서화한다
  • 과거 1년치 FNG 데이터를 limit=365 파라미터로 받아서 BTC 가격과 나란히 차트로 그려본다
  • 극단 공포 구간(20 이하)과 극단 탐욕 구간(80 이상)에서 본인 시스템이 어떤 포지션을 냈는지 백테스트로 확인한다
  • FNG 값을 Flask 또는 FastAPI 전역 캐시로 저장하고 웹훅 처리 시 참조하는 구조를 로컬에서 먼저 실험한다
  • cron으로 FNG 값을 4시간마다 자동 갱신하는 스크립트를 작성하고 VPS에 배포한다
  • FNG를 신호로 쓰지 않고 사이즈 조절 변수로만 쓰는 방식과 신호 필터로 쓰는 방식을 각각 별도 로그로 기록해 비교한다

공포탐욕지수는 도구입니다. 도구가 나쁜 게 아니라 쓰임새를 잘못 설정하면 나쁜 결과가 납니다. 이번 주 하나의 액션만 고른다면, 직접 API를 호출해서 숫자를 눈으로 확인해보는 것부터 시작하시길 권합니다.

※ 본 콘텐츠는 운영자 개인의 경험과 연구를 바탕으로 한 정보 제공 목적이며, 특정 종목에 대한 투자 권유나 매매 시그널이 아닙니다. 암호화폐 및 자동매매는 원금 손실 가능성이 있는 고위험 활동이며, 모든 투자 판단과 그 결과에 대한 책임은 투자자 본인에게 있습니다.