이번엔 “세션을 직접 자르는” 지표다
이번 회차는 STPO(Session Time Price Opportunity)다. 이름에 이미 힌트가 있다. 그냥 TPO가 아니라 “세션” TPO다. 트레이딩뷰 분류로는 프로파일 계열이고, 배정된 코인은 라이트코인(LTC)이다.
먼저 성격을 밝힌다. 이번에도 시세를 받지 않았다. 이 글은 시세를 받아 성과를 검증한 글이 아니라 규칙 자체를 해부한 글이다. 승률이나 수익률은 한 줄도 안 나온다. 아래 나오는 그림 네 장은 전부 실제 시세가 아니라 규칙의 동작을 보여주기 위한 모식도이고, 숫자는 손으로 만든 예시 값이다.
일반 TPO는 하루 전체를 통으로 잘라 프로파일 하나를 만든다. STPO는 그 하루 안에서 어느 구간을 프로파일로 만들지를 사용자가 고른다. 겉보기엔 옵션 하나 늘어난 것뿐인데, 이 옵션이 24시간 도는 코인 시장에 얹히면 생각보다 까다로운 질문을 만든다. “구간을 어디서 끊을 것인가"라는 질문이다.
TPO 자체는 짧게만 다시 짚는다
TPO의 정의는 짧게만 다시 짚는다. 세션을 일정 간격(흔히 30분)으로 잘라 A, B, C… 알파벳을 순서대로 매기고, 그 구간 동안 가격이 지나간 모든 칸에 알파벳을 하나씩 적는다. 세션이 끝나면 각 가격 칸에 쌓인 알파벳 개수가 그 가격에 시장이 머문 시간의 총량이다. 거래량이 아니라 시간을 세는 지표라는 점이 핵심이다. 얇은 호가창에서 30분 동안 체결이 뜸해도 그 구간이 그 칸을 지나갔다면 알파벳이 똑같이 하나 찍힌다.
여기서 가장 두꺼운 행이 POC(Point of Control), 즉 시장이 가장 오래 머문 가격이다. POC에서 시작해 위아래로 더 두꺼운 쪽을 번갈아 편입하면서 전체 알파벳의 70%를 채운 구간이 Value Area이고, 그 위 경계가 VAH, 아래 경계가 VAL이다. 70%라는 숫자는 마켓 프로파일 도구 대부분이 공유하는 기본값이고 시세와 무관하다. 아래 모식도는 이 절차를 손으로 만든 예시 프로파일에 적용한 결과다. 전체 알파벳 26개 중 POC 행에서 시작해 20개를 채운 지점(약 77%)에서 VAH·VAL을 확정했다.

일반 TPO와 다른 점은 여기부터다. 이 프로파일이 “하루 전체"가 아니라 “내가 지정한 구간 하나"에서만 나왔다는 것이다. STPO는 이 구간을 사용자가 정의하게 만든다.
세션을 어떻게 자르나 — All / Each / Custom
STPO는 세션을 잘라내는 방식으로 몇 가지 모드를 둔다. 기본값은 “All"이다. 프리마켓·마켓·포스트마켓을 구분하지 않고 하루 전체를 한 세션으로 묶어 프로파일 하나를 만든다. “Each"는 하루를 프리마켓·마켓·포스트마켓 세 구간으로 나눠 구간마다 별도 프로파일을 만든다. “Custom"은 시작·종료 시각과 타임존을 사용자가 직접 입력해, 하루 안의 임의 구간만 떼어 프로파일을 만든다.

세 모드의 전제를 나란히 보면 문제가 드러난다. All은 전제가 필요 없다. 하루라는 단위만 있으면 된다. 하지만 Each는 그 하루 안에 “장이 열리기 전"과 “장이 열린 뒤"와 “장이 닫힌 뒤"가 서로 다른 성격을 가진다는 전제를 깔고 있다. 주식시장처럼 특정 시각에 문을 열고 특정 시각에 문을 닫는 시장에서만 의미가 있는 구분이다. Custom은 그 중간이다. 구간의 경계를 사용자가 정하게 두지만, “어디서 끊어야 맞는 경계인지"에 대한 답은 주지 않는다.
Block Size — 프로파일의 해상도
세션을 골랐다고 끝이 아니다. STPO에는 Block Size라는 파라미터가 하나 더 있다. 세션 하나를 다시 몇 개의 작은 시간 블록으로 나눠 알파벳을 매길지 정하는 값이다. 이 블록 하나가 TPO의 “글자” 하나에 대응한다. RSI의 14일, 볼린저 밴드의 20일 같은 고정 기본값이 아니라, 차트에 걸어둔 타임프레임과 세션 길이에 따라 사실상 사용자가 결정하는 값이라 이 지표에는 시세와 무관한 단일 기본값이 없다.

Block Size를 크게 잡으면 세션 하나가 몇 개의 굵은 블록으로만 쪼개져 프로파일이 뭉툭해진다. 알파벳 종류가 적으니 POC 행과 그 옆 행의 개수 차이가 크게 벌어지고, Value Area 경계도 성긴 계단처럼 움직인다. 작게 잡으면 같은 세션이 훨씬 촘촘한 계단으로 나뉘어 POC가 더 정밀한 자리에 찍힌다. 다만 블록을 지나치게 작게 잡으면 그만큼 계산량이 늘고, 짧은 순간의 노이즈까지 알파벳 하나로 취급하게 된다. 정의로 주어지는 숫자가 없으니 이 트레이드오프를 사용자가 직접 감당해야 한다.
코인시장의 함정 (1) — Each 모드가 전제하는 개장·폐장
Each 모드부터 본다. 프리마켓·마켓·포스트마켓이라는 구분은 장이 특정 시각에 열리고 닫힌다는 전제 위에 서 있다. 폐장 뒤 쌓인 미체결 주문과 밤새 나온 뉴스가 다음 개장과 함께 한꺼번에 반영되는 순간이 있어야 “마켓 세션"이 프리마켓과 구별되는 의미를 가진다.
라이트코인은 이 전제가 성립하지 않는다. 장이 닫힌 적이 없다. 어느 시각을 “개장"이라고 표시해도 그 앞뒤로 유동성이 뚝 끊기는 순간이 없으니, Each 모드가 만들어내는 세 개의 프로파일은 서로 성격이 다른 세 구간이 아니라 그냥 같은 흐름을 임의로 세 토막 낸 것에 가깝다. 이 지표를 코인에 쓸 때 첫 번째로 걸리는 함정은 여기다 — 옵션은 있는데 그 옵션이 가정하는 시장 구조 자체가 없다.
코인시장의 함정 (2) — 거래소가 다르면 프로파일도 다르다
두 번째 함정은 Custom 모드를 써서 세션 경계를 잘 골랐다고 가정해도 남는다. TPO든 STPO든 계산 재료는 캔들이다. 그런데 라이트코인은 국내외 여러 대형 거래소에 두루 상장돼 있고, 거래소마다 별도의 호가창과 캔들을 갖는다. 값이 서로 크게 벌어지진 않아도 완전히 같지도 않다. 같은 시각 구간을 같은 Block Size로 잘라도, 어느 거래소의 캔들을 먹여서 프로파일을 만드느냐에 따라 알파벳이 쌓이는 자리가 미세하게 달라진다.

위 모식도는 같은 시각 구간을 두 개의 가상 거래소 캔들로 각각 프로파일링한 예시다. 두 프로파일의 모양은 비슷하지만 POC가 찍히는 행이 한 칸 어긋난다. 손으로 지어낸 값이라 실제 격차의 크기를 말할 수는 없다. 다만 방향은 분명하다 — 세션 경계를 완벽하게 통일해도, 어느 거래소의 데이터를 기준으로 볼지를 정하지 않으면 “이 세션의 POC"라는 말 자체가 거래소 이름 없이는 완결되지 않는다.
밈코인이나 신규 상장 코인이라면 대표 거래소 하나에 유동성이 몰려 이 문제가 덜할 수 있다. 라이트코인처럼 2011년부터 거래돼 온, 오래되고 유동성이 여러 거래소에 넓게 퍼진 자산일수록 오히려 이 프래그멘테이션이 선명하게 드러난다. 유동성이 화면 밖 기관 채널에 숨어 있어서 생기는 문제가 아니라, 화면에 다 보이는데 화면이 거래소마다 여러 장이라서 생기는 문제라는 점이 다르다.
라이트코인이라는 무대
배정된 라이트코인은 비트코인 코드베이스를 기반으로 2011년에 찰리 리가 만든, 코인 시장에서 가장 오래 살아남은 알트코인 중 하나다. 최대 발행량은 8,400만 개로 비트코인의 2,100만 개보다 네 배 크고, 블록 생성 목표 시간도 비트코인의 10분보다 짧은 2.5분으로 설계됐다. 반감기 구조도 비트코인과 같은 방식을 쓴다. 초기에는 Scrypt 알고리즘을 채택해 비트코인과 채굴 경쟁을 분리했고, 이후 선택적 프라이버시 기능인 MWEB(MimbleWimble Extension Blocks)을 얹었다. “디지털 은"이라는 별칭도 이런 맥락에서 붙었다.
이 성격이 STPO와 만나는 지점은 명확하다. 밈코인처럼 뉴스 한 방에 방향이 뒤집히는 자산이 아니라, 오래 거래돼 온 만큼 유동성이 여러 거래소에 골고루 분산된 자산이다. 그래서 이 글에서 짚은 두 번째 함정, 즉 “거래소마다 프로파일이 갈린다"는 문제가 라이트코인 위에서 유독 잘 보인다. 다만 이건 상장이 널리 퍼져 있다는 구조에서 나온 추론이고, 특정 거래소의 실제 점유율이나 최근 유동성 분포를 확인한 결과는 아니다.
내 봇에 넣을 것인가
넣지 않는다. 이유는 두 함정이 겹쳐서다.
첫째, Each 모드는 우리 봇이 다루는 시장 구조와 안 맞는다. 개장·폐장 구분이 없는데 그 구분을 흉내 낸 프로파일 세 장을 만들어봐야 해석할 근거가 없다. 쓴다면 All이나 Custom인데, Custom을 쓰려면 세션 경계를 하나 정해야 하고, 그 경계는 코인 시장 어디에도 “정답"이 없다. 내 봇은 이미 하루 경계를 KST 자정으로 통일해서 쓰는 다른 로직들이 있으니 STPO를 붙인다면 그 기준을 그대로 물려받는 게 최소한의 일관성이겠지만, 그 기준이 “옳다"는 근거는 여전히 없다.
둘째, 어느 거래소 캔들을 먹일지의 문제가 남는다. 내 봇은 특정 한 거래소의 캔들로 동작한다. STPO를 그 캔들에 얹으면 나오는 POC는 “그 거래소 안에서의 POC"일 뿐, 라이트코인 시장 전체의 POC라고 부를 수는 없다. 이 지표를 게이트로 쓰려면 최소한 “이 값은 특정 거래소 관점의 근사치"라는 전제를 코드 어딘가에 명시적으로 남겨야 하는데, 지금 그 장치가 없다.
버리는 결론은 아니다. 세션 경계 기준과 “이건 단일 거래소 관점"이라는 주석을 코드에 못 박아두고 나면, POC를 지지·저항의 참고선 정도로 얹어보는 건 다음 후보로 남긴다. 다만 그때도 진입 신호로는 쓰지 않을 생각이다. 프로파일은 세션이 끝나야 완성되는 후행 지표이고, 진입 판단은 세션이 끝나기 전에 일어나야 하니 애초에 방향이 안 맞는다.
이 글은 특정 자산의 매매를 권유하지 않는다. 기록은 개인 개발 로그다.
약어 풀이
- STPO (Session Time Price Opportunity) — 세션 시간 가격 기회. 사용자가 지정한 세션 구간마다 별도의 TPO 프로파일을 만드는 지표.
- TPO (Time Price Opportunity) — 일정 시간 간격의 알파벳으로 가격이 시간을 얼마나 오래 붙잡았는지 세는 마켓 프로파일 기법.
- POC (Point of Control) — 알파벳이 가장 많이 쌓인 가격, 시장이 가장 오래 머문 자리.
- VAH (Value Area High) — Value Area의 위쪽 경계.
- VAL (Value Area Low) — Value Area의 아래쪽 경계.
- RSI (Relative Strength Index) — 상대강도지수. 평균 상승폭과 평균 하락폭의 비율로 과매수·과매도를 재는 모멘텀 오실레이터.
- LTC (Litecoin) — 라이트코인.
- BTC (Bitcoin) — 비트코인.
- MWEB (MimbleWimble Extension Blocks) — 라이트코인에 얹힌 선택적 프라이버시 확장 블록.
- KST (Korea Standard Time) — 한국 표준시.