랜덤워크는 동전을 던져 앞면이면 +1, 뒷면이면 −1을 계속 더해 가는 무작위 걸음이다. 이 랜덤워크로 그린 차트는 실제 주가 차트와 구별이 안 될 만큼 닮았다. 추세·박스권·지지선 같은 패턴이 아무 정보가 없는 동전 던지기에서도 그대로 나타난다.
차트 여섯 장, 진짜 주가는 몇 장일까

아래 차트 여섯 장 가운데 진짜 주가는 몇 장일까. 답을 읽기 전에 눈으로 먼저 골라 두면 좋다.
정답은 0장이다. 그림 1의 여섯 장은 전부 동전을 던져 만든 랜덤워크다. 만드는 방법은 단순하다 — 동전을 한 번 던져 앞면이 나오면 선을 한 칸 올리고, 뒷면이 나오면 한 칸 내린다. 250번 반복하면 거래일 1년치 길이의 선 한 장이 나오고, 그 선을 확대해 놓으면 저 패널이 된다.
여섯 장을 나란히 놓으면 눈은 저절로 이름을 붙인다. 차트를 읽는 사람들이 쓰는 이름은 대체로 정해져 있다. 한 방향으로 꾸준히 밀려 가면 추세, 위아래 일정한 폭 안에서만 오르내리면 박스권, 어떤 높이까지 내려갔다가 번번이 되올라오면 그 높이를 지지선이라고 부른다. 여섯 패널 중에는 반년 내내 한 방향으로 밀린 것도 있고, 좁은 띠를 벗어나지 못한 것도 있고, 바닥을 두 번 찍고 올라온 것도 있다. 그런데 이 선들을 만든 동전은 직전에 무엇이 나왔는지 기억하지 못한다. 추세도 박스권도 지지선도 재료에 들어간 적이 없다.
이 실험은 새것이 아니다. Harry Roberts가 1959년 『The Journal of Finance』에 실은 글에서, 난수로 만든 가짜 주가 차트를 실제 차트와 나란히 놓고 육안으로는 둘을 가를 수 없다는 것을 보였다. 60년이 넘었는데도 이 그림은 여전히 통한다. 왜 통하는지가 이 글의 나머지다.
동전 던지기가 랜덤워크가 되는 순간
랜덤워크는 이름 그대로 무작위로 걷는 걸음이다. 지금 서 있는 자리에서 동전을 던져 앞면이면 한 칸 앞으로, 뒷면이면 한 칸 뒤로 간다. 그 결과를 계속 더해 가며 자리를 기록하면 선이 된다. 던진 횟수를 가로축에, 그때까지 더한 값을 세로축에 놓으면 그게 그림 1의 한 패널이다.
250이라는 횟수에는 이유가 있다. 주식 시장이 1년에 여는 날이 대략 250일이라, 250번 던진 선 한 장은 하루에 한 점씩 찍은 1년치 차트와 같은 길이가 된다. 이 글의 모든 수치는 그 길이를 20,000번 새로 만들어 재 본 결과다. 한 장씩 보면 제각각이지만 20,000장을 모으면 규칙이 드러난다.
여기서 중요한 성질은 하나뿐이다. 다음 칸이 어디로 갈지는 지금까지 걸어온 경로와 아무 상관이 없다. 열 번 연속 올라온 뒤라도 다음 던지기가 앞면일 확률은 여전히 절반이다. 그 열 번을 보고 열한 번째를 맞힐 방법은 없고, 반대로 이제 내려갈 차례라고 볼 근거도 없다. 걸음에는 기억이 없고, 따라서 선에는 방향을 이어 갈 이유도 꺾일 이유도 없다.
주가를 이 모형에 견주는 이유는 정보의 흐름 때문이다. 오늘 가격에는 오늘까지 알려진 것이 이미 반영돼 있고, 내일 가격을 움직이는 것은 아직 아무도 모르는 새 소식이다. 새 소식은 정의상 예측할 수 없으므로 내일의 변화도 예측할 수 없다. 이 논리를 끝까지 밀면 가격 변화는 동전 던지기와 같은 모양이 된다.
실제 주가가 랜덤워크와 똑같다는 뜻은 아니다. 가격의 출렁임(변동성)이 몰려 다니는 성질, 아주 큰 하락이 정규분포보다 자주 나오는 성질처럼 단순 랜덤워크로 설명되지 않는 부분이 있다. 이 글이 쓰는 것은 "주가가 랜덤워크다"가 아니라 "랜덤워크만으로도 차트에서 보이는 패턴이 다 나온다"는 훨씬 약한 주장이다.
답을 먼저 말해 두겠다. 랜덤워크의 끝 위치는 평균이 정확히 0인데, 어디쯤 있을지의 폭은 던진 횟수의 제곱근에 따라 넓어진다. 게다가 한쪽에 오래 머무르는 경우가 예외가 아니라 흔한 경우다. 이 두 가지가 겹치면 아무 정보가 없는 선도 방향을 가진 것처럼 보인다. 뒤에 나오는 수치는 전부 이 문장의 근거이지 새로운 결론이 아니다.
퍼짐은 예측 가능하다 — √n의 법칙
동전 250번의 결과를 더한 끝 위치를 20,000번 시행해 모아 봤다. 평균은 0 근처이고, 흩어진 정도를 나타내는 표준편차는 15.87칸이 나왔다. 표준편차는 값들이 평균에서 평균적으로 얼마나 떨어져 있는지를 재는 값이다. 그런데 이 15.87이라는 숫자는 시뮬레이션을 돌리지 않아도 미리 알 수 있다. 한 걸음의 크기가 ±1이면 n번 걸은 뒤 위치의 표준편차는 n의 제곱근이 된다.
식 1에 250을 넣으면 15.81이고, 실측 15.87과 0.1칸 안쪽에서 맞는다. 1년을 걸은 뒤 제자리 부근에 있을 이유는 없고, ±16칸은 평범하며, ±32칸 밖으로 나가는 일도 스무 번에 한 번쯤 있다.
그림 2의 부채꼴이 이 절의 요지다. 선이 출발선에서 멀어지는 것은 무언가가 밀어서가 아니라, 시간이 지나면 폭이 넓어지는 것 말고 다른 수가 없기 때문이다.
방향이 오래 이어진다 — 최장 연속과 출발선 복귀
퍼짐만으로는 "추세"라는 인상이 다 설명되지 않는다. 추세로 읽히려면 같은 방향이 눈에 띄게 이어져야 한다. 그래서 시행마다 같은 부호가 몇 번까지 연달아 나왔는지, 그 최댓값을 재 봤다.
20,000회 시행에서 최장 연속의 평균은 8.3일이었다. 8일 이상 이어진 시행은 20,000회 중 약 12,480회로 62.4%다. 10일 이상도 20,000회 중 약 4,230회로 21.2%다. 열 해를 놓고 보면 여섯 해쯤은 여드레 내리 같은 방향으로 가는 구간을 품고, 다섯 해 중 한 해는 열흘짜리를 품는다는 뜻이다. 차트에서 그 구간만 잘라 보면 누구라도 추세라고 부를 모양이다.
되돌아오는 쪽도 마찬가지다. 250칸을 걷는 동안 출발선인 0을 몇 번이나 다시 밟는지 세어 보면 평균은 11.6번이지만 분포가 넓다. 두 번 이하로만 밟은 시행이 20,000회 중 약 3,050회, 15.3%였다. 일곱 장에 한 장꼴로, 1년 동안 출발선을 거의 건너지 않고 한 편에 머문다는 뜻이다. 이런 선을 보고 "한 번도 안 꺾였다"고 말하는 것은 자연스럽지만, 꺾일 이유가 애초에 없었다.
반반이 오히려 드물다 — 역정현 법칙
여기서 직관이 가장 크게 어긋난다. 앞면과 뒷면이 반반이니 걷는 시간도 0 위와 0 아래에 반반씩 나뉠 것 같다. 실제로는 정반대다. 이 사실은 역정현 법칙(arcsine law)이라는 이름이 붙을 만큼 잘 알려져 있다.
20,000회 시행에서 0 위에 머문 시간의 비율을 재 보면, 10% 미만이거나 90% 초과인 시행이 20,000회 중 약 8,240회로 41.2%다. 반면 40~60% 사이, 곧 반반에 가까운 시행은 20,000회 중 약 2,700회로 13.5%에 그친다. 한쪽에 거의 붙어 지낸 경우가 반반인 경우보다 세 배 흔하다.
그림 3의 U자를 차트로 옮기면 이렇다. 1년의 열에 아홉 날을 출발선 위에서 지낸 선은 강세로, 아래에서 지낸 선은 약세로 읽힌다. 두 모양을 합치면 전체의 41.2%다. 강세도 약세도 아닌 어중간한 선이 오히려 소수파다.
사람은 무작위에서도 구조를 찾는다
지금까지의 세 절은 전부 수학 쪽 이야기였다. 나머지 절반은 보는 쪽에 있다. 무작위한 자극에서 의미 있는 구조를 읽어 내는 경향을 아포페니아(apophenia)라고 부른다. 구름에서 얼굴을 보고 잡음에서 멜로디를 듣는 것과 같은 작용이다.
차트는 이 경향이 특히 잘 작동하는 재료다. 선은 이미 연결돼 있고, 고점과 저점은 눈에 띄며, 이름 붙일 모양의 목록도 이미 준비돼 있다. Burton Malkiel의 『A Random Walk Down Wall Street』에는 동전 던지기로 만든 차트를 차트 분석가에게 보였더니 매수 신호로 읽었다는 일화가 나온다. 그 일화가 오래 회자되는 것은 분석가가 어리석어서가 아니라, 그 자리에 있던 누구라도 같은 모양을 봤을 것이기 때문이다.
내가 본 패턴이 진짜인지 확인하는 법
그렇다면 차트에서 본 것을 어떻게 다뤄야 할까. 눈이 본 모양을 부정할 필요는 없다. 필요한 것은 그 모양이 무작위에서도 나오는지 옆에 놓고 재 보는 절차다.
방법은 셔플이다. 자기 데이터의 일별 수익률을 순서만 뒤섞는다. 값의 집합은 그대로이고 순서만 사라지므로, 셔플한 계열은 원래 데이터와 같은 재료로 만든 무작위 대조군이 된다. 이렇게 100장을 만들어 놓고, 원본에서 관찰한 값이 그 100장 안에서 몇 번째쯤인지 본다. 아래는 같은 방향으로 연속한 최장 일수를 그 값으로 삼은 예다.
import random
random.seed(20260820)
rets = [random.choice([1, -1]) for _ in range(250)] # 합성 일별 수익률 부호
def longest_run(xs):
best = run = 1
for a, b in zip(xs, xs[1:]):
run = run + 1 if a == b else 1
best = max(best, run)
return best
obs = longest_run(rets)
null = [longest_run(random.sample(rets, len(rets))) for _ in range(100)]
shorter = sum(v < obs for v in null)
print(f"관찰 최장 런 {obs}일")
print(f"대조군 100장 중 더 짧은 것 {shorter}장, 같거나 긴 것 {100 - shorter}장")관찰 최장 런 9일
대조군 100장 중 더 짧은 것 69장, 같거나 긴 것 31장읽는 법은 마지막 줄에 있다. 같은 방향 9일 연속이라는 관찰값보다 길거나 같은 대조군이 100장 중 31장이니, 이 정도 연속은 순서를 지운 세계에서도 세 번에 한 번꼴로 나온다. 이 값은 정보가 아니다. 만약 100장 중 한두 장에서만 나왔다면 그때부터 이야기가 달라진다.
위 코드는 합성 데이터로 돌렸지만, 자기 데이터에 옮기는 데 필요한 것은 종가 목록 하나뿐이다. 공개된 일별 종가를 받아 앞뒤 값의 비로 일별 수익률을 만들고, 위 코드의 rets 자리에 그 목록을 넣으면 된다. 부호만 보고 싶으면 수익률의 양음만 남긴다. 크기까지 보고 싶으면 값을 그대로 둔다. 셔플은 값을 바꾸지 않고 순서만 지우므로, 평균도 변동성도 원본과 똑같은 대조군이 나온다. 원본에만 있고 대조군에는 없는 것은 순서, 곧 우리가 패턴이라고 부르는 바로 그것뿐이다.
같은 틀은 최장 연속 말고 다른 것에도 그대로 쓴다. 고점 대비 하락의 최댓값, 어떤 신호를 따랐을 때의 수익, 지지선을 몇 번 튕겼는지 — 무엇을 세든 셔플한 100장에서 같은 방식으로 세어 옆에 놓으면 된다. 코드가 열 줄이 안 되고, 한 번 짜 두면 다른 지표에도 재사용된다.
이 블로그의 앞선 퀀트 편은 백테스트에서 데이터가 정직한지를 다뤘다. 데이터를 정직하게 만든 다음에 오는 질문은 이것이다 — 그 데이터를 보는 눈은 정직한가. 무작위 대조군 100장을 옆에 놓아 보는 한 번이 그 질문에 답을 낸다. 차트를 그만 보라는 말이 아니라, 본 것을 한 번 더 재 보라는 말이다.
이 글은 검증 기록이며, 특정 종목이나 상품의 매수·매도 권유가 아니다.
더 읽기
- Harry V. Roberts, "Stock-Market ‘Patterns’ and Financial Analysis: Methodological Suggestions", The Journal of Finance 14(1), 1959, pp. 1–10. https://doi.org/10.1111/j.1540-6261.1959.tb00481.x
- William Feller, An Introduction to Probability Theory and Its Applications Vol. 1, Ch. III — 역정현 법칙의 표준 서술.
- Burton Malkiel, A Random Walk Down Wall Street — 동전 던지기 차트 일화가 실린 대중서.
- 교정할 때마다 수익이 줄었다 — 백테스트 CAGR 6.4% → 5.9% → 1.0% — 이 시리즈의 앞 편.