최근 X에서 꽤 흥미로운 글을 하나 봤습니다.
작성자는 자신이这些年어떻게 하나의 '플라이휠'을 천천히 굴려왔는지 이야기하는데, 세 개의 바퀴——현금흐름, 핵심 자산, 알파——가 서로 피드백을 주고받는 구조였습니다. 가장 핵심을 파고들면 결국 한 문장으로 요약됩니다: 일단 어떻게든 살아남고, 충분히 오래 버텨야 복리가 작동한다는 것.
이 체계는 작성자가 직접 수동으로 실전을 통해 만들어낸 것이며, 개인 경험과 시장 감각에 의존합니다. 하지만 읽고 나서 한 가지 생각이 들었습니다: 이는 결국 일종의 규율인데, 규율이라는 것은 바로 사람이 가장 쉽게 무너뜨리고 프로그램이 가장 쉽게 지키는 것이니까요. 퀀트 관점에서 이것을 재현할 수 있을까?
재현의 접근 방식은 처음부터 새로운 전략을 발명하는 것이 아니라, 기존에 이미 만들어두고 돌려봤던 몇 가지 전략——DCA 적립식 투자 전략, 롤링 포지션 전략, 코인 선별 엔진(harness)——중에서 어떤 전략의 본질적인 행동이 특정 바퀴가 요구하는 행동과 정확히 일치하는지 찾는 것입니다. 일치하면 그대로 가져와 채우고, 자금 흐름을 통해 하나의 폐쇄 루프로 연결하는 겁니다.
이 글의 핵심은 "왜 이 세 가지를 선택했는지, 각각의 논리는 무엇이며, 어떻게 그 바퀴와 일치하는지"를 설명하는 데 있습니다.
| 원문 개념 | 요구되는 행동 | 대응 전략 |
|---|---|---|
| 현금흐름 | 극단적 시장 상황에서 강제 매도되지 않음 | 준비금 메커니즘 |
| 핵심 자산 | 매수만 하고 매도하지 않음, 시간의 친구가 됨 | DCA 적립식 투자 전략 |
| 알파 | 극소 비용으로 극대 이익을 얻고, 이익을 핵심으로 전달 | 코인 선별 엔진으로 목표 찾기 + 롤링 포지션 전략으로 거래 |
바퀴 2: 핵심 자산 ← DCA 적립식 투자 전략
개념이 요구하는 것
원문에서 핵심 자산의 역할은: 복리를 위해, 시간의 친구가 되고, 극단적 시장 상황에서도 강제 매도되지 않는 것입니다. '거래'를 위한 것이 아니라 '보유하며 기다리는' 것입니다. 함축된 행동은 단 하나——지속적으로 매수하고, 능동적으로 절대 매도하지 않는 것입니다.
DCA란 무엇인가
DCA는 Dollar Cost Averaging의 약자로, 일정 금액을 정기적으로 투자하는 방식, 즉 흔히 말하는 '적립식 투자'입니다. 논리는 매우 간단합니다: 일정 시간 간격(예: 7일마다)마다 현재 가격이 높든 낮든 상관없이 정해진 금액만큼 자산을 매수합니다.
이 전략의 진짜 힘은 시장이 하락할 때 발휘됩니다: 똑같은 200달러라도 가격이 낮을 때는 더 많은 수량을 살 수 있고, 가격이 높을 때는 적게 삽니다. 장기간 실행하면 자연스럽게 평균 단가가 합리적인 수준으로 낮아집니다. 고점과 저점을 판단할 필요도 없고, 타이밍을 잡을 필요도 없으며, 꾸준히 실행하기만 하면 됩니다.
더 중요한 것은, DCA는 설계상 능동적인 매도 행동이 없다는 점입니다——본질적으로 매수만 하고, 매수한 후에는 그냥 보유합니다. 따라서 이는 기본적으로 '들어오기만 하고 나가지 않으며, 천천히 축적하는' 기계입니다.
왜 이것인가: 행동 동등성
'시간의 친구가 된다'는 것을 기계가 실행할 수 있는 명령어로 번역하면 '정해진 시간에 매수하고, 절대 매도하지 않는다'가 됩니다. 이는 DCA에서 매도 로직을 삭제한 후 남은 모든 내용과 행동이 동등합니다. 추가적인 설계가 전혀 필요 없으며, 기존 DCA의 이익 실현 매도 기능을 제거하기만 하면 바로 핵심 자산 바퀴의 구현체가 됩니다.
해당 코드:
javascript
// N일마다 정액으로 핵심 자산 매수, 매수만 하고 매도는 절대 안 함
if (now - lastDca >= DcaIntervalDays * 86400000) {
var amount = sizeByCash(CoreSymbol, DcaAmount, CoreLeverage, price);
marketOrder(CoreSymbol, "buy", amount);
coreInvested += DcaAmount; // 누적 비용 기록, 이에 해당하는 뺄셈은 절대 등장하지 않음
}
전체 전략에서 핵심 자산을 매도하는 로직은 어디에도 찾을 수 없습니다——이는 의도적인 것이며, '극단적 시장 상황에서도 강제 매도되지 않는다'는 조건에 대응합니다.
바퀴 1: 현금흐름 ← 준비금 메커니즘
개념이 요구하는 것
원문은 현금흐름을 첫 번째 순위로 두지만, 그 의미는 돈을 버는 것이 아니라 '가장 타야 할 순간에 억지로 내리지 않도록' 하는 데 있습니다. 쉽게 말해: 안정적인 현금 유입이 있으면, 비록 시장이 폭락하고 장부상 자산이 크게 줄어들더라도, 생활을 유지하기 위해 자산을 매도할 필요가 없다는 것입니다——버티고, 복리가 발생하기를 기다리는 겁니다.
이는 전체 시스템이 작동할 수 있는 전제 조건입니다. 이 보호 장치가 없으면, 아무리 핵심 자산을 잘 선택했더라도 큰 폭락을 만나면 어쩔 수 없이 손절해야 하므로 모든 것이 헛수고가 됩니다.
퀀트에서 어떻게 동등하게 구현할까
현금흐름은 본질적으로 계좌 외부의 것입니다——월급, 부업, IPO 청약 수익. 코드가 공짜로 수익을 만들어낼 수는 없습니다.
하지만 코드는 그 핵심 효과를 재현할 수 있습니다: 핵심 자산을 절대 강제 매도하지 않는다. 방법은 계좌에 하나의 준비금 라인을 설정하는 것입니다——계좌에 항상 일정 비율의 완충 자금을 유지하여, 어떤 주문 작업도 이 자금을 건드리지 못하게 합니다. 적립식 투자 리듬 자체에 이 라인을 추가하면, '현금흐름이 끊임없이 들어와서 결코 공급이 중단되지 않는' 상태를 시뮬레이션합니다.
실전에서 이 라인의 충분한 정도는 실제로 외부 현금흐름이 안정적인지에 달려 있습니다. 이 부분은 세 가지 중에서 가장 간접적으로 재현되는 부분입니다——우리는 현금흐름 자체가 아니라 그 효과를 재현하는 것입니다.
javascript
// 매 주문 전 확인: 잔고에서 이번 금액을 차감한 후 준비금보다 낮으면 안 됨
var reserve = equity * ReserveFloorRatio; // 예: 자기자본의 10% 유지
if (balance - DcaAmount < reserve) return; // 라인에 닿으면 건너뛰고, 마지막 완충재를 지킴
바퀴 3: 알파 ← 코인 선별 엔진 + 롤링 포지션 전략
알파 바퀴는 가장 복잡하며, 두 부분으로 나누어 살펴봐야 합니다: 목표물을 어디서 찾을 것인가, 목표물을 찾은 후 어떻게 거래할 것인가. 이 두 가지는 각각 다른 전략에 해당합니다.
개념이 요구하는 것
원문에서 알파의 의미는 '극소 비용으로 극대 이익을 얻는 것'이며, 벌어들인 돈을 쓰지 말고 모두 핵심 자산으로 전달하여 원금을 키우는 데 사용해야 한다고 강조합니다.
두 가지 핵심 키워드: '극소 비용'——즉, 각 거래의 손실 상한선을 반드시 설정하여 한 번의 실수로 시스템이 큰 타격을 입지 않도록 해야 합니다; '극대 이익'——즉, 한 번 맞았을 때는 이익을 최대한 키우도록 해야 하며, 작은 이익에 만족하며 바로 팔면 안 됩니다. 이는 본질적으로 비대칭 구조입니다: 나쁜 경우 손실은 작고, 좋은 경우 이익은 큽니다.
상반부: 코인 선별 엔진(harness)——올바른 목표 찾기
암호화폐 시장에는 수백, 수천 개의 무기한 선물 종목이 있습니다. 무작위로 하나를 골라 전략을 적용하면 결과는 시간 낭비거나 심지어 손실일 가능성이 높습니다. 코인 선별 엔진은 바로 '어떤 코인에서 거래해야 하는지'를 결정합니다.
첫 번째 단계——거래량 필터
모든 USDT 무기한 선물을 달러 거래량(가격 × 거래량) 기준 내림차순으로 정렬하여 상위 120개를 유지합니다.
왜 거래량을 첫 번째 필터로 사용할까요? 거래량이 많은 코인은 두 가지 장점이 있습니다: 첫째, 유동성이 충분하여 주문 시 매수-매도 스프레드가 커서 비용이 많이 먹히지 않습니다; 둘째, 충분히 많은 참가자가 거래하고 있어 포착 가능한 추세가 형성될 가능성이 높습니다. 거래량이 적은 알트코인은 가격이 조작되기 쉬우므로 아무리 좋은 전략도 무용지물입니다.
두 번째 단계——이동평균선 백테스트 점수
각 선정된 코인에 대해 여러 이동평균선 파라미터 조합(예: MA5/20, MA10/30, MA20/60)으로 과거 데이터를 백테스트하고, 각 파라미터 조합의 핵심 지표(승률, 손익비, 최대 낙폭, 신호 횟수)를 계산합니다. 그런 다음 결과를 가중 종합 점수로 만듭니다.
이 단계의 목적은 '이동평균선 전략이 이 코인에서 과거에 실제로 효과적이었는지'를 확인하는 것입니다. 모든 코인이 명확한 추세를 보이는 것은 아니며, 어떤 코인은 장기간 횡보하여 이동평균선 신호가 모두 가짜 돌파인 경우도 있습니다——이런 코인은 미리 제외하여 탄약을 낭비하지 않습니다.
세 번째 단계——폭발 가능성 가산점
점수에 두 가지 동적 요소를 추가합니다:
- 변동성 백분위: 현재 ATR(평균 실제 변동폭, 가격 변동성을 측정하는 지표)이 과거 데이터에서 차지하는 백분위입니다. 높은 값에 가까울수록 현재 변동성이 역사적 변동성에 비해 크며, 큰 움직임이 나타날 가능성이 높습니다.
- 거래량 폭발 계수: 최근 5개 캔들의 평균 거래량 ÷ 최근 50개 캔들의 평균 거래량. 이 값이 1보다 현저히 크면, 최근 거래량이 과거에 비해 비정상적으로 증가한 것이며, 자금 유입이 발생하고 있을 가능성이 높아 '폭발 가능성'의 초기 신호입니다.
이 두 가지 요소를 추가하는 이유는 정적 과거 성과 외에도 '현재 이상 움직임을 보이는' 목표물에 추가 가점을 주기 위해서입니다.
최종적으로 백색 목록이 출력되며, 보통 현재 단계에서 종합 점수가 가장 높은 3~5개의 코인입니다.
javascript
// 코인 선별 엔진: 거래량 필터 → 백테스트 점수 → 폭발 요소 → 백색 목록
var pool = tickers
.filter(t => t.Symbol.endsWith("USDT.swap"))
.sort(byQuoteVolumeDesc)
.slice(0, TopVolumeN);
for (var coin of pool) {
var volPct = calcVolPct(records); // 변동성 역사 백분위
var surge = calcVolumeSurge(records); // 최근 거래량 폭발 계수
var bt = bestBacktestScore(records, maParamsList); // 이동평균선 백테스트 종합 점수
var score = bt * 0.56 + volPct * VolSurgeBonus + surge * VolSurgeBonus;
if (score >= threshold) whitelist.push(coin);
}
하반부: 롤링 포지션 전략——작은 것으로 큰 것을 노리다
백색 목록이 준비되었으니, 이제 거래 방법이 필요합니다. 여기서는 이전에 작성했던 롤링 포지션 전략을 사용합니다. 이 전략의 메커니즘은 알파의 비대칭 요구와 매우 잘 맞습니다.
롤링 포지션 전략이란 무엇인가
이는 이동평균선 교차 신호를 기반으로 하는 선물 추세 추종 전략입니다.
먼저 이동평균선을 이해해야 합니다: 과거 N개 캔들의 종가를 가중 평균한 것이 EMA(지수 이동평균선)입니다. EMA는 최근 가격에 더 높은 가중치를 부여하여 일반 이동평균선보다 반응이 빠릅니다. 교차 신호는 다음과 같습니다: 단기 EMA(예: EMA5)가 장기 EMA(예: EMA10)를 아래에서 위로 돌파하는 것을 '골든 크로스'라고 하며, 단기 상승세가 장기보다 강하다는 의미로 매수 신호입니다; 반대는 '데드 크로스'라고 하며 매도 신호입니다.
'롤링 포지션'이란: 이익 실현 후에도 이동평균선 방향이 여전히 유지되면(즉, 추세가 지속 중이면) 즉시 다시 포지션을 열어 추세를 계속 따라잡는 것을 의미합니다. 강한 추세 구간에서 이 방법은 이익을 여러 번 롤링 복리로 만들어내며, 한 번에 그치지 않습니다.
모든 거래에는 하드 스탑로스가 있습니다: 가격이 반대 방향으로 설정된 폭(예: -8%) 이상 움직이면 강제 청산됩니다. 이 스탑로스는 각 거래의 최대 손실을 제한합니다. 아무리 시장이 나빠도 단일 거래 손실은 이 숫자를 넘지 않습니다. 이것이 "극소 비용" 메커니즘의 근원입니다.
왜 이것인가: 비대칭 구조의 매칭
Alpha는 "비용이 극소화되고 상한이 있으며 + 수익은 최대한 크게"라는 비대칭 수익 구조를 요구합니다. 롤링(Rolling) 전략은 자연스럽게 이 구조를 갖습니다:
- 하드 스탑로스 = 매 베팅의 "입장료", 져도 이만큼만 손실, 더 이상은 없음
- 이동식 이익 실현(Trailing Take Profit) + 롤링 포지션 연장 = 예측이 맞다면 수익이 추세를 따라 달리도록 하여 이론적으로 무제한 상한
둘은 구조적으로 같은 것을 다르게 표현한 것입니다. 구체적인 코드:
javascript
// 비용 상한: 하드 스탑로스에 닿으면 즉시 청산 – 이것이 매 베팅의 입장료 상한
if (pnlPct <= -AlphaStopPct) close("하드 스탑로스");
// 수익을 달리게 하기: 피크가 높을수록 허용되는 하락 폭이 커져 큰 승자에게 충분한 호흡 공간 제공
var giveback = Math.max(15, maxPnl * 0.3);
if (maxPnl - pnlPct >= giveback) close("이동식 이익 실현");
// 이익 실현 후에도 추세가 지속되면 롤링하여 보유 지속 – 수익을 복리로 만듦
if (shouldRoll(records, direction)) openAlpha(direction, price);
유기적 통합: Alpha의 수익을 코어로 되돌리기
코인 선택 엔진이 종목을 찾고, 롤링 전략이 수익을 창출하지만, 이것만으로는 충분하지 않습니다. 원문으로 돌아가면, Alpha의 진정한 가치는 "코어 자산에 원금을 공급하는 것"입니다. 따라서 자금 라인이 반드시 있어야 합니다: Alpha가 번 돈은 단방향으로 코어 자산을 매수하고; 손실이 발생할 때는 절대 코어 원금을 건드리지 않습니다.
javascript
// Alpha의 실현 이익이 일정 금액에 도달하면 코어 자산을 매수
if (alphaPnlBank >= AlphaSweepMin) {
var amt = sizeByCash(CoreSymbol, alphaPnlBank, 1, price);
marketOrder(CoreSymbol, "buy", amt); // 수익이 코어로 흘러 원금 기반 확대
coreInvested += alphaPnlBank;
alphaPnlBank = 0;
}
바로 이 라인 덕분에 세 개의 독립된 기존 전략이 "각자 돌아가던 것"에서 "서로를 보충하는 하나의 바퀴"로 변했습니다: 적립식 투자는 계속해서 코어에 공급하고, 코인 선택 엔진은 후보를 선별하며, 롤링 전략이 작은 것으로 큰 것을 노려 수익을 내고, 그 수익을 다시 코어에 공급하여 코어는 점점 커지고, 이후 필요한 배수는 점점 작아집니다.
퀀트가 여기서 실제로 한 일
한마디로 요약하자면: 재현의 가치는 "더 똑똑해진 것"이 아니라 "더 규율을 지킨 것"에 있습니다.
원문의 그 방법이 어려운 이유는 논리가 이해하기 어려워서가 아니라, 사람이 실행하기 너무 어렵기 때문입니다: 폭락 때 손이 근질거려 팔고 싶고, 크게 수익 났을 때 FOMO로 추격 매수하고, 조금 손해 보면 멈추고 싶고, 급전이 필요할 때 원래 보유해야 할 코어 자산을 억지로 팔아버리는 실수. 이런 실수는 이치를 몰라서가 아니라 감정 때문입니다.
코드는 강제로 팔리지 않으며(비축선이 하방을 보호), FOMO하지 않으며(화이트리스트와 신호에만 따라 움직임), 멈추지 않습니다(Alpha의 작은 비용을 잃으면 다음 거래를 기다릴 뿐, 절대 코어를 건드리지 않음). 우리는 이 이론을 더 강력하게 만든 것이 아니라, 인간의 본성에 가장 반하는 몇 가지 규칙을 감정 없는 실행자에게 맡겼을 뿐입니다.
이것은 비교적 얕은 시도일 뿐입니다
분명히 말하자면, 이것은 종착점과는 거리가 멀고, 한 고리는 분명히 다른 경로의 구현 방식입니다.
원문의 진정한 Alpha – 신규 상장(ICO/IDO), 프리세일, 초기 구조적 기회 – 는 정보와 자원을 활용하여 작은 것으로 큰 것을 노리는 것입니다. 반면에 롤링 + 이동평균선 코인 선택은 작은 것으로 큰 것을 노리는 또 다른 구현 형태로, 추세 장세에 의존하여 수익을 얻습니다. 두 경로는 다르지만 내부 논리는 완전히 통합니다. 횡보 장세에서는 이 추세 전략이 필연적으로 잦은 작은 손절 손실을 겪게 됩니다. 이는 원천적 기회와 상호 보완 관계를 이루며 함께 Alpha 수익원을 구성합니다. 진정한 희소 기회는 여전히 사람이 판단해야 하며, 수익을 낸 후 수동으로 같은 라인을 따라 코어에 다시 공급해야 합니다.
또한, 백테스트 결과가 좋다고 해서 실전에서 수익이 나는 것은 아닙니다. 수수료, 자금 조달 비용, 슬리피지는 백테스트에서 간과되기 쉬우나 실전에서는 조금씩 마진을 잡아먹습니다. 코드는 규율을 지키지만, 보수적으로 행동해야 할 때 본능적으로 브레이크를 밟지는 않습니다.
따라서 다음으로 해야 할 일은 서둘러 큰 자금을 투입하는 것이 아니라, 먼저 모의 계좌와 소액 포지션으로 장기간 운용해 보는 것입니다: 그 여러 바퀴가 서로를 보충하고 있는지, Alpha 부분이 실제로 플러스 요인이 되고 있는지, 아니면 헛수고인지 확인해야 합니다. 그런 다음 실제 데이터를 바탕으로 한 바퀴씩 수정해 나가야 합니다.
원문의 그 말은 이 시스템을 다듬는 데에도 동일하게 적용됩니다 – 느릴 수는 있지만, 멈춰서는 안 됩니다.
(위 내용은 하나의 사고 기록일 뿐이며, 투자 조언을 구성하지 않습니다.)
원문 링크: 내가 제로에서 천만까지 만든 플라이휠 시스템: 현금흐름 · 코어 자산 · Alpha
전략 소스 코드: 플라이휠 퀀트 시스템
- 1



