플랫폼과
포트폴리오 제출
제출 버튼을 누른 순간부터 리더보드에 점수가 찍히기까지, 한 건의 제출은 어떤 관문들을 지나는가. 그리고 유니버스·비중 상한·총노출·회전 비용이라는 규칙들은 각각 무엇을 걸러 내는가. 이 부록은 강의 실습 플랫폼(FAIP) 사용자를 위한 운영 안내다 — 규칙을 외우는 대신, 규칙 뒤의 논리를 이해하는 것이 목표다.
"제출 성공"인데 왜 점수가 없지?
제출과 채점은 서로 다른 두 사건이다. 그 사이에서 무슨 일이 일어나는지 알면, 플랫폼의 모든 규칙이 하나의 논리로 꿰어진다.
마감 1분 전의 제출, 그리고 비어 있는 리더보드
2026년 가을 학기의 어느 금요일 오후 4시 59분. 주간 제출 마감 1분 전, 한 수강생이 이번 주 포트폴리오 비중표를 올리고 "제출 성공" 배지를 확인한다. 그런데 리더보드를 새로고침해도 점수가 없다. 무언가 잘못된 걸까.
잘못된 것이 아니다. 그 제출은 지금 여행 중이다. 인터넷 가장자리의 검문소에서 토큰을 확인받고, 서버가 미리 파 둔 지하통로를 지나, 접수창구에서 번호표를 받고, 대기줄에 서 있다. 채점은 실행자가 자기 속도로 진행하고, 결과는 그다음에야 게시판에 붙는다. "제출 성공"과 "채점 완료"는 서로 다른 두 사건이다.
이 부록은 그 여행의 경로를 따라간다. 왜 관문이 여러 개인지(§1), 왜 서버에서 연습하면 안 되는지(§2), 왜 비중에 상한이 있고 현금 도피는 안 되는지(§3), 그리고 그 모든 것이 어떤 점수로 환산되는지(§4). 규칙마다 "무엇을 걸러 내려는 장치인가"라는 질문 하나를 붙들고 가면, 암기할 것은 거의 없다.
이 부록의 내용은 두 층으로 읽을 수 있다. 표면은 이 강의의 실습 플랫폼(FAIP)이라는 특정 시스템의 사용 안내다. 그러나 한 층 아래에는 어디서나 다시 만날 일반 원리가 깔려 있다 — 역할 분리, 공용 자원의 예절, 대회 규칙의 설계 논리. 대학원 연구실의 GPU 서버든, 회사의 계산 클러스터든, 캐글 같은 외부 대회든, 여기서 이해한 논리가 그대로 통한다. 플랫폼은 바뀌어도 논리는 남는다.
생각해 볼 질문
"제출 성공" 응답이 채점 완료를 의미하도록 시스템을 만들면 무엇이 잘못될까. §1을 읽고 나면 마감 직전 제출 폭주 상황을 근거로 답할 수 있어야 한다.
제출의 여행 — 시스템은 어떻게 생겼나
택배가 물류센터 몇 곳을 거치듯 제출도 관문 몇 개를 지난다. 각 관문은 저마다 하나의 문제만 풀고, 그래서 고장 지점을 짚을 수 있다.
경비실, 지하통로, 번호표 — 관문마다 푸는 문제가 다르다
하나의 프로그램이 인증도 하고 보안도 지키고 계산도 하면 안 될까. 기술적으로는 가능하지만, 그런 프로그램은 한 군데가 고장 나면 전부 멈춘다. 시스템 설계의 오래된 원칙은 "한 구성요소는 한 가지 문제만 풀게 하라"다.
| 관문 | 하는 일 | 없으면 생기는 사고 |
|---|---|---|
| 게이트웨이 | 토큰 검사(인증) + 속도 제한. 전 세계에 분산된 엣지 서버에서 실행 | 아무나, 무한정 요청을 보내 서버 자원을 소모한다 |
| 터널 | 서버가 먼저 바깥 중계 서버로 "나가는" 연결을 맺고, 외부 요청은 그 연결로만 진입 | 방화벽 포트를 여는 순간 자동 스캐너의 표적이 된다 |
| 큐(대기줄) | 접수창구가 번호표만 주고 즉시 응답, 실행자가 한 건씩 처리 | 채점이 밀리는 순간 접수 자체가 마비된다 |
| 게시판 | 채점 결과를 저장해 누구나 조회 | 결과가 요청자에게만 보여 비교·검증이 어렵다 |
검문을 서버 본체가 아니라 앞단에서 하는 이유는 단순하다 — 잘못된 요청도 서버까지 도달하면 그만큼 시간과 메모리를 쓴다. 초대장 없는 손님은 파티장 입구가 아니라 단지 정문에서 돌려보내는 편이 낫다. 그리고 접수와 실행의 분리가 바로 도입 장면의 답이다. 접수창구가 채점까지 끝내고서야 응답한다면, 마감 직전 제출이 몰리는 순간 접수가 통째로 마비된다. "제출 성공"과 "채점 완료"가 다른 사건인 것은 버그가 아니라 생존 설계다.
속도 제한이 필요한 규모를 손으로 셈해 보자. 참가자 500명이 각자 분당 최대 6회씩 제출하면 최악의 경우 분당 500 × 6 = 3,000회, 초당 약 50회다. 채점 한 건에 2초가 걸린다면 초당 50건을 그대로 실행할 수 없다 — 실행 중인 작업이 눈덩이처럼 쌓인다. 속도 제한이 입구에서 유량을 조절하고, 큐가 남는 요청을 줄 세워 주기에 시스템이 버틴다.
터널의 발상은 방향의 역전이다. 방화벽은 보통 "밖에서 들어오는" 연결은 막아도 "안에서 나가는" 연결은 허용한다(그래야 웹서핑이 되므로). 터널 프로그램은 이 성질을 이용해 서버 쪽에서 중계 서버로 먼저 전화를 걸어 놓고 끊지 않는다. 서버는 들어오는 문을 하나도 열지 않았는데 외부 서비스가 가능해진다. "내 서버 주소는 아무도 모르니 괜찮다"는 생각은 통하지 않는다 — IPv4 주소 공간은 약 43억 개뿐이라 자동화된 스캐너가 전체 인터넷을 몇 시간이면 훑고, 공개 IP에 포트를 열면 대개 몇 분 안에 정체불명의 접속 시도가 기록되기 시작한다. 숨겨서 지키는 보안은 보안이 아니다.
토큰과 비밀번호의 차이도 짚어 두자. 비밀번호는 사람이 외워서 로그인할 때 쓰고, 토큰은 프로그램이 요청마다 자동으로 붙여 보내는 기계용 열쇠다. 그래서 토큰은 길고 무작위해도 되고(외울 필요가 없으므로), 유출되면 그 토큰만 폐기하고 새로 발급하면 된다.
엔진이 두 개인 이유 — 두 채점자가 서로의 실수를 잡는다
플랫폼의 백테스트 엔진은 둘이다. 직접구현 엔진은 체결·비용·룩어헤드 차단의 모든 계산이 눈에 보이는 코드라 연필 계산과 대조할 수 있고, 고속 라이브러리 엔진(vectorbt)은 종목과 파라미터가 많을 때 쓰는 검증된 기성품이다.
둘의 강점은 정확히 반대다. 직접구현은 느리지만 투명하고, 라이브러리는 빠르지만 불투명하다. 빠른 이유는 벡터화 — 날짜를 하루씩 도는 반복문 대신 전체 기간의 가격 배열을 통째로 한 번에 연산한다. 파이썬처럼 반복문이 느린 언어에서 이 차이는 수십~수백 배로 벌어진다. 둘 다 같은 목표비중 인터페이스를 받으므로, 같은 전략을 양쪽에서 돌려 결과가 일치하는지 교차검증할 수 있다 — 시험 답안을 두 명이 따로 채점해 보는 것과 같다.
"두 엔진의 결과가 일치하면 그 전략의 성적은 믿어도 된다."
교차검증이 잡는 것은 구현의 버그뿐이다. 두 엔진 모두에게 같은 잘못된 데이터나 같은 잘못된 가정을 먹이면 둘은 사이좋게 같은 오답을 낸다. 반대 방향의 함정도 있다 — 자릿수까지의 완전한 일치를 기대하는 것. 두 엔진은 내부 연산 순서가 달라 소수점 아래 미세한 차이가 나는 게 정상이며, 검증의 목적은 허용 오차 안의 일치다.
허용 오차의 감각은 숫자로 잡아 두자. 1년 수익률이 12.34%와 12.36%로 나왔다면 차이 0.02%p는 부동소수점 연산 순서 차이로 흔히 생기는 수준이라 정상이다. 그런데 12.34%와 15.80%처럼 3%p 이상 벌어졌다면 이야기가 다르다 — 하루 수수료 0.1%를 한쪽만 빠뜨렸다면 연 250거래일 × 0.1% ≈ 25%p까지도 벌어질 수 있으니, 거래비용 설정부터, 다음으로 체결 시점(당일 종가 대 익일 시가)을 대조하는 식으로 큰 항목부터 좁혀 간다.
중요한 계산을 독립된 구현 두 벌로 만들어 대조하는 기법은 항공우주·의료기기 같은 안전-필수 소프트웨어 분야에서 N-버전 프로그래밍이라는 이름으로 오래 연구되어 왔다. 서로 다른 팀이 같은 명세로 따로 개발하면 같은 버그를 공유할 확률이 낮아진다는 발상이다. 다만 고전적 실험 연구에 따르면, 사람들은 명세의 같은 애매한 대목에서 같은 오해를 하는 경향이 있어 완전한 독립성은 생각보다 달성하기 어렵다. 백테스트에서도 마찬가지다 — "배당은 어떻게 처리하는가" 같은 명세의 빈틈은 두 엔진이 똑같이 놓칠 수 있으므로, 교차검증과 별개로 명세 자체를 명확히 적어 두는 습관이 중요하다.
출처 Knight, J. & Leveson, N. (1986). "An Experimental Evaluation of the Assumption of Independence in Multiversion Programming." IEEE Transactions on Software Engineering SE-12(1). — N-버전 프로그래밍의 독립성 가정에 대한 고전적 실험.
코드 제출에서 비중 제출로 — 그림이 단순해진 이유
위 구조는 참가자의 코드를 서버에서 재실행해 검증하던 초기 설계(v1)다. 현재의 공식 평가는 전향 평가 모듈에서 배우는 방식(v2)으로 바뀌었다 — 참가자는 코드 대신 비중표만 제출하고, 서버는 접수·규칙검사·미래 수익률 채점만 한다.
| 항목 | v1 (코드 제출) | v2 (비중 제출) |
|---|---|---|
| 참가자가 내는 것 | 전략 코드 전체 | 날짜별 목표 비중표 |
| 서버가 하는 일 | 코드 실행·백테스트 재현 | 형식 검사·미래 수익률 채점 |
| 필요한 장비 | GPU·큐·격리 샌드박스 | 가벼운 웹 서버면 충분 |
| 주된 위험 | 타인 코드 실행(보안) | 비중표 규칙 위반(검사로 해결) |
코드를 받지 않아도 평가가 되는 이유는 채점 기준의 이동에 있다. v1은 "과거 데이터에서 이 코드가 정말 그 성적을 냈는가"를 재현으로 확인했다. v2의 전향 평가는 제출 시점 이후의 미래로 채점하므로, 코드가 무엇을 했는지는 중요하지 않고 결과물인 비중표만 있으면 된다. 미래는 아무도 미리 볼 수 없으므로 재현 검증 자체가 필요 없어진 것이다.
v1이 감수했던 위험의 정체를 들여다보면 전환의 값어치가 보인다. 참가자의 코드는 선의라도 무한 반복문으로 자원을 독점할 수 있고, 악의라면 서버의 파일을 읽거나 다른 참가자의 전략을 훔쳐볼 수도 있다. 그래서 남의 코드를 실행하는 시스템은 반드시 격리(샌드박스) 장치를 갖춘다 — 코드마다 독방을 주어 파일·네트워크·메모리 접근을 제한하고 시간과 자원의 상한을 거는 것이다. v2 전환은 이 가장 어려운 문제를 "더 잘 푸는" 대신 문제 자체가 없는 설계로 옮겨서 없애 버렸다. 보안의 제1원칙은 공격 표면을 줄이는 것이며, 받지 않는 코드는 공격할 수 없다.
"그럼 v1 인프라를 만든 노력은 낭비였나"라는 질문에는 두 가지 답이 있다. 첫째, 터널·큐·엔진은 여전히 개발과 학습의 실험대로 쓰인다. 둘째, 처음부터 v2를 그릴 수 있었던 것이 아니라 v1을 운영해 보았기에 무엇을 덜어낼 수 있는지 알게 된 것이다. 요구가 바뀌면 설계는 진화한다 — 처음부터 완벽한 설계란 없다.
서버는 경기장이다
연습은 각자의 컴퓨터에서, 서버는 공인 기록 측정 전용으로. 이 원칙 하나에서 자원 규칙 전체가 따라 나온다.
동네 공원에서 잰 100m 기록은 공인되지 않는다
100m 기록이 공인되려면 규격 트랙, 전자 계시, 그리고 뒷바람 초속 2.0m 이하라는 조건이 필요하다. 조건이 제각각이면 서울의 9초 95와 부산의 9초 98을 비교할 수 없기 때문이다. 검증 서버가 바로 그 공인 경기장이다.
기록이란 "조건이 통제된 상태에서의 측정값"이고, 조건 통제가 무너지면 숫자는 남지만 의미는 사라진다. 전략의 검증 점수도 같은 성질의 숫자다 — 같은 코드, 같은 데이터, 그리고 같은 자원 조건에서 잰 값이어야 비교할 수 있다. 이 강의의 검증 서버(GB10)는 CPU 20코어, GPU 1장, 128GB 통합 메모리를 가진 한 대의 장비인데, 이 GPU에는 하드웨어 분할 기능이 없다. 두 작업이 같은 GPU에 올라가면 계산 유닛과 메모리 대역폭을 뺏고 뺏기며 뒤엉키고, 40분 걸리던 검증이 70분이 되기도 하며, 최악의 경우 연산 순서가 달라져 소수점 아래 수치까지 흔들릴 수 있다. 그래서 원칙은 하나다. 연습(GPU 학습)은 각자 자기 컴퓨터에서, 서버는 공인 기록 측정 전용으로.
CPU와 GPU의 차이는 이렇게 붙잡아 두면 오래 간다. CPU는 박사급 전문가 20명, GPU는 단순 계산만 하는 아르바이트생 수천 명이다. 복잡한 서류 심사(분기문, 순차 논리)는 전문가가 빠르지만, "덧셈 10억 번" 같은 단순 반복은 수천 명이 나눠 드는 쪽이 압도적이다. 딥러닝 계산의 주식(主食)이 바로 그 단순 반복인 행렬 곱셈이라서 GPU가 필수 장비가 된 것이다. 규모를 셈해 보면 — 1,000×1,000 행렬 두 개를 곱하면 결과 원소 100만 개, 원소마다 곱셈-덧셈 1,000번씩, 총 약 20억 번의 연산이다. CPU 코어 하나가 초당 10억 번 연산하면 약 2초, GPU가 초당 10조 번이면 0.0002초 — 이 연산 하나만 보면 만 배 차이다. 데이터 이동과 준비 작업이 섞이는 실제 학습 전체에서는 격차가 그보다 줄지만, CPU로 몇 달 걸릴 학습이 GPU로 수일 단위가 되는 그림은 여기서 나온다.
통합 메모리라는 말도 풀어 두자. 보통 컴퓨터는 CPU용 메모리(RAM)와 GPU용 메모리(VRAM)가 분리되어 서로 데이터를 복사해 줘야 한다. 통합 메모리는 한 덩어리를 CPU와 GPU가 공유한다 — 복사가 없어 편하지만, 한 작업이 다 차지하면 모두가 굶는다. "결과 숫자만 같으면 실행 시간은 좀 늘어나도 되지 않나"라는 생각은 두 가지 이유로 틀렸다. 검증에는 시간 제한이 있어 실행 시간 자체가 채점 조건의 일부이고, 간섭은 시간만 늘리는 게 아니라 다음 카드의 메모리 사고로 결과 자체를 날릴 수 있다.
느리지만 공정하다 — 줄 세우기의 산수
검증 요청이 동시에 여러 개 들어와도 플랫폼은 한 번에 하나씩만 실행한다. 이유는 두 가지 — 메모리 사고(OOM) 방지와 측정 간섭 제거다.
OOM(Out Of Memory)은 메모리가 부족할 때 운영체제가 프로세스를 강제 종료하는 사고다. 무서운 점은 예고가 없다는 것 — 메모리가 90% 찼을 때는 아무 경고도 없다가, 한도를 넘는 순간 운영체제가 가장 큰 프로세스를 골라 즉사시킨다(리눅스에서는 실제로 이 장치를 OOM killer라 부른다). 죽는 쪽은 메모리를 많이 쓴 작업이지 나중에 온 작업이 아니므로, 남의 무리한 작업 때문에 내 세 시간짜리 검증이 로그 한 줄 남기고 사라질 수 있다. 산수는 간단하다.
다만 모든 작업을 줄 세우지는 않는다. 데이터 전처리·리포트 생성·소량 조회처럼 GPU를 쓰지 않고 메모리도 몇 GB 수준인 작업은 CPU 20코어 중 일부씩 나눠 가져도 간섭이 미미하므로 두세 개까지 병렬을 허용한다. 반대로 GPU를 건드리는 순간 무조건 줄을 선다. 분할할 수 없는 자원은 독점적으로, 분할해도 안전한 자원은 효율적으로 — 이 비대칭이 규칙의 요점이다.
안전벨트는 줄 세우기 말고도 있다. 작업마다 격리된 상자(컨테이너)에 메모리 상한을 걸고, 데이터는 열 단위로 압축된 parquet 캐시에서 필요한 기간·종목만 잘라 읽는다. 절약의 효과는 손으로 셈이 된다 — 10년치 2,000종목 전체가 40GB일 때 실제로 쓰는 것이 최근 3년치 50종목뿐이라면, 필요한 양은 대략 40GB × (3/10) × (50/2000) = 0.3GB. 전체를 올리는 것보다 백 배 이상 가볍고, 메모리 상한이 걸린 컨테이너 안에서는 이 절약이 완주와 즉사를 가른다.
공유 자원에서 한 작업이 다른 작업의 성능을 흔드는 현상을 클라우드 업계에서는 "시끄러운 이웃(noisy neighbor)" 문제라 부른다. 데이터센터는 하드웨어 분할(예: NVIDIA MIG), 운영체제의 자원 통제(cgroup), 우선순위 정책으로 눌러 보려 하지만, 캐시와 메모리 대역폭처럼 나누기 어려운 자원이 남아 완전한 격리는 지금도 어렵다. 그래서 컴퓨터 성능 연구 논문들은 벤치마크 수치를 보고할 때 "다른 작업이 없는 단독 실행 환경"임을 명시하는 것이 관례다. 전략 검증도 본질은 벤치마크다 — 직렬 처리는 그 관례를 시스템 규칙으로 옮겨 놓은 것이다.
이 원칙은 이 플랫폼을 떠나도 그대로 따라온다. 연구실 GPU 서버에서는 실행 전에 자원 사용 현황을 확인하는 습관(예: nvidia-smi)이 예절이자 생존 기술이고, 회사의 야간 배치 작업이 정해진 순서로 줄을 서는 이유도, 클라우드에서 "필요한 만큼만 읽기"가 곧 비용 절감이 되는 것도 같은 논리다. 측정이나 안정성이 걸린 자원은 독점적으로, 그렇지 않은 자원은 효율적으로. 규칙이 아니라 이 판단 기준을 기억해 두면 처음 보는 환경에서도 스스로 올바른 결정을 내릴 수 있다.
포트폴리오 제출 규칙
유니버스 235종목(미국 대형주, S&P 100급), 종목당 |비중| ≤ 0.25, 총노출 0.25~1.0, 주 1회 제출에 회전당 10bp. 각 수치는 무언가를 걸러 내기 위해 존재한다.
여섯 개의 규칙, 여섯 개의 필터
공식 평가는 전향 평가다 — 비중을 먼저 제출하고, 그다음에 시장이 움직이고, 실현된 수익률로 채점받는다. 그 틀 위에 얹힌 세부 규칙들은 하나하나가 "무엇을 걸러 내려는 장치인가"라는 질문에 답을 갖고 있다.
| 규칙 | 수치 | 걸러 내는 것 |
|---|---|---|
| 유니버스 고정 | 미국 대형주 235종목 (S&P 100급) | "좋은 종목을 골랐나"와 "좋은 전략을 짰나"의 뒤섞임 — 같은 문제지를 받아야 성적을 비교할 수 있다 |
| 종목당 비중 상한 | |w| ≤ 0.25 | 한 종목 몰빵 도박. 산술적으로 최소 4종목 이상의 분산을 강제한다 |
| 총노출 범위 | 0.25 ≤ Σ|w| ≤ 1.0 | 하한: 전부 현금으로 도망가 순위를 방어하는 무전략. 상한: 빌려서 하는 확대 투자(레버리지) |
| 제출 주기 | 주 1회, 다음 주부터 적용 | 결과를 보고 답안을 고치는 문 — 마감 전 재제출은 자유이며 마지막 제출만 인정 |
| 회전 비용 | 비중 변화량 합 × 10bp(0.1%) | 잡음에 반응하는 과잉 매매. 신호가 비용을 이길 만큼 강한지까지 시험한다 |
| 과거 소급 없음 | 제출 이후 주차만 채점 | 늦게 참가해 "과거를 알고 낸 비중"을 끼워 넣는 뒷문 — 백테스트가 순위표에 스며드는 것을 막는다 |
"다음 주부터 적용"이라는 반 박자 지연이 전향성의 심장이다. 마감 시점에 아직 일어나지 않은 가격 움직임으로만 채점되므로, 제출 순간의 어떤 정보 우위도 미래를 맞히는 능력 없이는 점수가 되지 않는다. 총노출은 비중 절대값의 합이다 — 롱 50% + 숏 30%면 총노출 80%이고 나머지 20%는 현금이다.
회전 비용의 규모를 손으로 셈해 보자. 지난주 비중 (A 0.5, B 0.5)에서 이번 주 (A 0.2, B 0.8)로 바꾸면 변화량은 |0.5−0.2| + |0.5−0.8| = 0.6, 비용은 0.6 × 0.1% = 0.06%다. 사소해 보여도 매주 포트폴리오를 크게 뒤엎으면 연간 3%를 넘는다 — 주식 시장의 장기 평균 초과수익이 연 몇 % 수준임을 생각하면, 평범한 전략의 기대 수익을 통째로 삼킬 수 있는 크기다. 백테스트에서 근사해 보였던 고회전 전략이 비용을 넣는 순간 마이너스로 뒤집히는 것은 퀀트 실무에서 가장 흔한 좌절 중 하나다.
숏에 대한 직관 하나. 롱의 최대 손실은 투자금 전액(주가가 0이 될 때)이지만, 숏은 주가가 이론상 무한히 오를 수 있으므로 손실의 상한이 없다. 숏이 있으면 하락장에서도 전략을 짤 수 있지만, 위험 관리는 훨씬 까다로워진다. 레버리지도 마찬가지로 실력이 아니라 진폭을 키우는 장치다 — 자기 자본 100에 100을 빌려 200을 투자하면 시장 +10%에 내 돈 기준 +20%지만, −50%면 원금 전액이 사라진다.
왜 하필 25%인가 — 규칙 설계는 저울질이다
상한 25%는 100% ÷ 25% = 4, 즉 최소 4종목 보유를 강제한다. 한 종목 몰빵은 복권과 구조가 같아서, 참가자가 많으면 누군가는 반드시 대박을 내고 순위표 꼭대기에 앉는다 — 그것은 전략 평가가 아니라 추첨이다.
"비중 상한과 총노출 규칙은 실력 발휘를 막는 족쇄다."
반대다. 규칙이 없으면 순위표는 실력이 아니라 극단 베팅의 운이 지배한다. 분산을 강제하면 한 종목의 우연이 성적을 지배할 수 없게 되어 순위가 실력 쪽으로 수렴하고, 총노출 하한은 "아무 견해도 내지 않고 버티기"를 막아 참가자 전원이 최소한의 시장 견해를 내놓게 만든다. 규칙은 족쇄가 아니라, 운 좋은 도박꾼과 실력자를 구분해 주는 조명이다.
분산이 "공짜 점심"이라 불리는 이유도 여기서 짚자. 서로 독립인 종목 \(N\)개에 자본을 나누면 평균 수익은 그대로인데 변동성은 \( \tfrac{1}{\sqrt{N}} \)로 준다 — 변동성 20%인 독립 종목 1개면 20%, 4종목이면 10%, 16종목이면 5%다. 현실의 주식들은 공통요인으로 함께 움직이므로 그만큼 줄지는 않는다 — 상관이 ρ면 종목 수를 아무리 늘려도 변동성은 원래의 \( \sqrt{\rho} \) 아래로 내려가지 않는다(변동성 20%, 상관 0.5면 한계는 약 14.1%). 그래도 방향은 같다.
모든 규칙 수치는 저울질의 결과이지 정답 상수가 아니다. 상한을 25%가 아니라 10%로 낮추면 분산은 더 강해지지만, 소수 종목에 대한 강한 확신을 표현할 자유가 사라져 실력자 간 변별력이 떨어진다. 회전 비용을 너무 높이면 참신한 신호가 있어도 포트폴리오를 못 바꾸고, 너무 낮추면 잡음에 반응하는 과잉 매매가 이득이 된다. 즉 모든 수치는 "운 걸러내기"와 "실력 표현의 자유" 사이 어딘가의 균형점이다. 실제 운용업계의 투자 규정(종목당 한도, 레버리지 한도 등)도 같은 저울질의 산물이고, 이 플랫폼의 규칙은 그 축소판이다.
대형주 한정에는 실무적 이유도 있다. 거래가 활발한 종목은 가격 데이터가 깨끗하고, 소형주에서 흔한 극단적 급등락이 성적을 왜곡할 여지가 작다.
제출 검사기
서버가 제출을 받는 순간 돌리는 규칙 검사를 축소판으로 직접 조작해 본다. 어떤 비중표가 통과하고, 어떤 사유로 반려되는가.
내 비중표는 통과할까 — 3종목 미니 검사기
종목 3개의 비중을 움직여 통과/반려와 사유를 확인한다
목표 — 종목당 상한(|w| ≤ 0.25)과 총노출(0.25 ≤ Σ|w| ≤ 1.0) 검사가 실제로 어떻게 작동하는지, 그리고 지난주 비중 대비 회전 비용(10bp)이 어떻게 계산되는지 눈으로 확인한다. 지난주 제출분은 (A 0.20, B 0.10, C 0.00)으로 고정되어 있다.
조작 안내 — 슬라이더는 실제 규칙보다 넓은 −0.30~+0.30까지 움직인다. 일부러 규칙을 어겨 보라. 관찰 포인트 — ① A를 +0.26 이상으로 올리면 즉시 "상한 초과"로 반려된다 — 슬라이더가 ±0.25 경계선(점선)을 넘는 순간이다. ② 셋 다 0 근처로 내리면 총노출이 0.25 아래로 떨어져 "총노출 미달"로 반려된다 — 현금 도피는 제출로 인정되지 않는다. ③ C를 −0.25로 내려 숏을 섞어도, 총노출은 절대값의 합이므로 오히려 커진다. ④ 이 미니 검사기에서는 종목이 3개뿐이라 상한을 다 지키면 총노출이 최대 0.75 — "총노출 초과" 반려는 나올 수 없다. 실제 유니버스 30종목에서는 상한을 지키면서도 1.0을 넘길 수 있어 이 검사가 실제로 작동한다. ⑤ 통과 상태에서 비중을 조금씩 바꾸며 회전 비용이 변화량에 정비례해 커지는 것을 확인하라.
손검산 예시 하나를 따라가 보자. (A +0.25, B +0.25, C −0.25)로 맞추면 — 종목당 검사는 셋 다 |w| = 0.25 ≤ 0.25로 통과. 총노출은 0.25 + 0.25 + 0.25 = 0.75로 0.25~1.0 구간 안이라 통과. 미사용 자본은 1 − 0.75 = 0.25. 회전량은 지난주 (0.20, 0.10, 0.00) 대비 |0.25−0.20| + |0.25−0.10| + |−0.25−0.00| = 0.05 + 0.15 + 0.25 = 0.45이고, 회전 비용은 0.45 × 0.1% = 0.045%, 즉 4.5bp다. 화면의 readout이 이 값들과 정확히 일치하는지 대조해 보면, 검사기가 하는 일이 이 산수 전부라는 것을 알 수 있다.
실제 서버의 검사도 본질은 같다 — 다만 종목이 30개이고, 형식 검사(종목 코드 유효성, 결측값)가 앞에 붙으며, 마감 전 재제출이 있으면 마지막 제출로 덮어쓴다. 반려는 벌점이 아니다. 마감 전이라면 고쳐서 다시 내면 된다.
두 트랙과 채점 — IR, RPS, 그리고 듀애슬론
총수익만으로 채점하면 모두가 도박으로 몰리고, 안정성만으로 채점하면 모두가 현금에 숨는다. 지표 설계가 대회 설계의 절반이다.
IR — "얼마나 버나"가 아니라 "얼마나 꾸준히 버나"
투자 트랙은 IR(정보비율)로 채점한다 — 주간 수익률의 합을 그 표준편차로 나눈 값이다. 분모에 변동성이 있으므로 많이 버는 것만으로는 부족하고 꾸준히 벌어야 점수가 난다.
\[ \mathrm{IR} \;=\; \frac{\sum_{t} r_t}{\operatorname{sd}(r_t)} \qquad (r_t = \text{주간 수익률}) \]
| 참가자 | 주간 수익률 | 합계 | 표준편차 | IR |
|---|---|---|---|---|
| 꾸준한 A | +1%, +1%, +1%, +1% | 4% | 0 근처 | 매우 큼 |
| 안정된 C | +2%, 0%, +2%, 0% | 4% | 1% | 4.0 |
| 널뛰는 B | +8%, −4%, +7%, −7% | 4% | ≈6.6% | ≈0.61 |
같은 총수익 4%가 채점상 여섯 배 넘게 벌어진다. C의 계산을 손으로 따라가면 — 평균 1%, 각 주의 편차 +1, −1, +1, −1이므로 표준편차 1%, IR = 4 ÷ 1 = 4. B는 평균 1%, 편차 +7, −5, +6, −8 → 분산 (49+25+36+64) ÷ 4 = 43.5, 표준편차 ≈ 6.6% → IR ≈ 4 ÷ 6.6 ≈ 0.61이다.
왜 하필 표준편차로 나누는가. 두 가지 직관이 있다. 첫째, 같은 평균 수익이라면 변동성이 큰 쪽이 운의 개입 여지가 크다 — 널뛰는 성적은 "다음에도 그럴 것"이라는 믿음을 주지 못한다. 둘째, 변동성이 크면 복리 성장 자체가 갉아먹힌다 — 모듈 1의 변동성 드래그(기하 ≈ 산술 − σ²/2)를 떠올리면, 분모의 변동성은 "신뢰도"와 "실질 성장" 양쪽의 대리 지표임을 알 수 있다. IR은 샤프지수와 같은 계열의 위험조정 점수다.
RPS와 듀애슬론 — 점수가 아니라 순위를 섞는 이유
예측 트랙(선택 참가)은 각 종목이 다음 주 수익률 5분위 중 어디에 들지 확률로 제출해 RPS로 채점받는다. 종합 순위는 두 트랙 순위의 평균 — 두 종목을 모두 뛰는 듀애슬론 방식이다.
예측 트랙 제출물의 모양을 그려 보면 이렇다. 유니버스의 종목 각각에 대해 "다음 주 수익률이 전체 종목 중 하위 20%에 들 확률 10%, 그다음 구간 20%, …" 하는 식으로 다섯 확률(합계 1)을 적어 낸다. 정답을 하나 찍는 것이 아니라 불확실성의 분포를 적어 내는 것이 핵심이며, 자신 없는 종목에는 확률을 고르게 펴는 것이 정직한(그리고 채점상 유리한) 답이다. RPS의 계산은 M6 대회 모듈에서 손으로 직접 해 본다.
- 왜 점수를 직접 섞지 않는가 — IR과 RPS는 단위가 달라 점수를 더하면 한쪽이 계산을 지배한다. 표준화(평균 0, 표준편차 1)로 완화해도 극단값에는 여전히 취약하다 — 한 명이 도박으로 IR을 폭발시키면 표준화 점수도 함께 끌려간다
- 순위의 강건함 — 순위는 극단값을 "1위"라는 한 칸으로 눌러 담는다. 정보를 조금 버리는 대신 조작과 우연에 둔감해지는 거래이고, 대회 채점에서는 대개 남는 장사다
- 실증 근거 — M6 대회에서 예측 점수(RPS)와 투자 점수(IR) 순위의 상관이 약 0.04로 보고되었다. 즉 예측 실력과 투자 실력은 거의 별개의 능력이며, 각각 독립적으로 순위를 매겨 평균하는 것이 공정하다
듀애슬론 산수의 예 — 참가자 셋. 갑: 투자 1위·예측 3위 → 평균 2.0. 을: 투자 2위·예측 1위 → 평균 1.5. 병: 투자 3위·예측 2위 → 평균 2.5. 종합 우승은 을이다. 한 트랙의 압도적 1위보다 두 트랙의 고른 상위권이 유리한 구조다.
위 IR 서술은 평가 원리의 표준형이고, 현재 라이브 플랫폼은 이를 시즌제로 운영한다. 투자 트랙은 3주 시즌의 누적 순수익률로, 예측 트랙 RPS는 시즌 평균으로 집계해 두 순위의 평균(듀애슬론)으로 종합 순위를 만든다.
참가는 대회 페이지에서 닉네임 등록만 하면 된다(개인 제출 토큰 자동 발급). 포트폴리오 대회와 별도로 매일 10문제 차트 퀴즈도 운영된다.
예측과 투자가 거의 무관하다는 발견은 곱씹을수록 의미심장하다. 시장을 잘 맞히는 것과 그 예측을 수익으로 바꾸는 것 사이에는 포지션 크기 조절, 위험 관리, 비용 통제라는 별도의 기술이 놓여 있다. 예측이 조금 틀려도 위험 관리로 살아남는 참가자가, 예측은 좋은데 몰빵으로 무너지는 참가자를 이기는 일이 흔하다. M6가 남긴 또 하나의 교훈은 겸손이다 — 다수 참가팀이 단순한 시장 평균(벤치마크)을 이기지 못했다. 미래를 상대로 한 진짜 시험은 과거를 상대로 한 시험보다 훨씬 어렵다.
출처 Makridakis, S., Spiliotis, E. 외 (2023). "The M6 forecasting competition: Bridging the gap between forecasting and investment decisions." arXiv:2310.13357 — 듀애슬론 채점과 RPS·IR 순위 상관의 원 출처.
퀴즈와 정리
답을 보기 전에 먼저 스스로 답해 본다. 전부 이 부록 안에서 다룬 내용이다.
서버의 방화벽 포트를 직접 여는 대신 터널을 쓰는 이유는?
제출 직후 리더보드에 점수가 없는 것은 왜 정상인가?
최대 70GB를 쓰는 검증 작업 두 개를 128GB 서버에서 동시에 돌리면?
지난주 (A 1.0)에서 이번 주 (B 1.0)으로 전부 갈아탔다. 회전 비용은?
종목당 비중 상한이 25%일 때 포트폴리오에 담아야 하는 최소 종목 수는? 이 규칙의 목적은?
주간 수익률이 +3%, +1%, +3%, +1%인 참가자의 IR(합 ÷ 표준편차)은?
① 제출은 게이트웨이(인증·속도 제한) → 터널 → 큐 → 채점 → 게시판의 여행이다. 각 관문은 한 가지 문제만 풀고, 접수와 채점은 서로 다른 사건이다.
② 검증의 본질은 측정이다. 분할할 수 없는 자원(GPU)은 독점적으로, 분할해도 안전한 자원은 효율적으로 — 직렬 처리는 재현성을 지키는 장치다.
③ 제출 규칙(유니버스 30 · |w| ≤ 0.25 · 총노출 0.25~1.0 · 주 1회 마지막 제출 · 회전당 10bp · 소급 없음)은 운과 도박을 걸러 실력을 드러내는 필터이며, 모든 수치는 저울질의 산물이다.
④ 투자 트랙은 IR, 예측 트랙은 RPS로 채점하고 종합은 순위의 평균(듀애슬론)이다. 예측 실력과 투자 실력은 거의 별개(M6: 순위 상관 ≈ 0.04)이므로 트랙도 둘이다.
참고문헌
이 부록의 플랫폼 관련 서술은 FAIP 운영 정보이고, 아래는 일반 원리 쪽의 원문이다. 링크는 공개 원문이 확실한 것만 달았다.
대회 · 평가 설계
- Makridakis, S., Spiliotis, E., Hollyman, R., Petropoulos, F., Swanson, N. & Gaba, A. (2023). "The M6 forecasting competition: Bridging the gap between forecasting and investment decisions." arXiv:2310.13357 — 전향 방식 대회, RPS·IR 이중 채점, 두 순위의 낮은 상관.
시스템 · 검증
- Knight, J. & Leveson, N. (1986). "An Experimental Evaluation of the Assumption of Independence in Multiversion Programming." IEEE Transactions on Software Engineering SE-12(1). — 이중 구현(N-버전) 검증의 가능성과 한계에 대한 고전적 실험.
이 부록의 플랫폼 사양(서버 자원, 규칙 수치, v1→v2 전환 등)은 강의 실습 플랫폼(FAIP)의 운영 정보이며, 예시 수치(속도 제한·메모리·회전 비용 계산 등)는 손계산 예시다. 플랫폼의 백테스트·채점 실측치는 모두 합성데이터 실험 기준이고 실제 투자 성과를 시사하지 않는다. 인용 원칙: 연도는 발표 기준, 확신이 없는 서술은 "~로 보고되었다/~로 알려져 있다"로 구분했다.