LabHub

블로그

증권사 리스크관리와 컴플라이언스 직무: 빠른 시장 속도를 통제하는 일

한국어English日本語

이 글을 읽으면 좋은 사람

증권사 리스크관리, 준법감시, 내부통제, 운영리스크, 신용관리 직무를 준비하는 사람을 위한 글이다. 단순히 채용공고의 키워드를 외우는 대신, 그 단어가 실제 산출물(VaR 리포트, ECL 계산서, 한도 초과 알림, SAR 보고서)로 어떻게 바뀌는지 이해하는 데 초점을 둔다. JD에 적힌 "시장위험 모니터링", "Basel III 대응", "내부자거래 탐지"가 실제로 책상 위에서 어떤 엑셀, 어떤 SQL, 어떤 회의로 나타나는지 한 번에 정리한다. FRM/CFA를 따고 싶은데 진로가 모호한 사람, 거래소나 금감원으로 가는 길을 보고 싶은 사람에게도 맞다.

왜 리스크/컴플라이언스가 "통제하는 일"인가

증권사의 다른 직무가 돈을 만드는 일이라면 리스크와 컴플라이언스는 돈이 잘못 새지 않게 막는 일이다. 트레이더는 1초에 1억을 벌 수도, 잃을 수도 있다. PB는 고객 자산을 운용하지만 이해상충에 빠지면 회사 전체가 흔들린다. IB는 큰 딜을 성사시키지만 기재오류 하나로 손해배상에 휘말릴 수 있다. 통제 부서는 이 모든 직무 뒤에서 한도, 절차, 증적, 보고를 만든다.

"통제"라는 단어가 답답하게 들릴 수 있지만 실제로는 회사가 망하지 않게 하는 마지막 안전벨트다. Barings Bank가 1995년에 닉 리슨 한 명 때문에 233년 역사를 끝낸 것도, MF Global이 2011년에 유럽 국채 베팅으로 무너진 것도, Archegos가 2021년 3월에 단 며칠 만에 100억 달러를 날린 것도 결국 한도 관리와 통제 실패의 이야기다. 리스크/컴플라이언스 직무는 이 사건들이 우리 회사에서 일어나지 않도록 매일 데이터를 보고, 한도를 조정하고, 거래를 검증한다.

4 종류 리스크: Market / Credit / Operational / Liquidity

리스크를 4가지로 나누는 것은 Basel 문서의 분류와 같다. 각각 측정 방법과 통제 도구가 다르다.

면접에서 "4가지 리스크를 설명하라"는 질문이 나오면 정의보다 예시를 같이 말해야 한다. 정의만 외우면 책에서 가져온 답이 되고, 예시를 붙이면 현장을 본 답이 된다.

Market Risk: VaR (Historical/Parametric/MC), Expected Shortfall, FRTB

시장위험의 핵심 지표는 VaR(Value at Risk)다. "내일 95% 확률로 손실이 X원을 넘지 않는다"는 의미다. 측정 방법은 3가지로 나뉜다.

VaR의 약점은 꼬리 너머는 안 본다는 점이다. 그래서 ES(Expected Shortfall, CVaR)를 같이 본다. ES는 "95% VaR을 넘는 손실의 평균"이다. Basel의 FRTB(Fundamental Review of the Trading Book)는 2023년부터 VaR 대신 ES를 표준 지표로 쓰도록 바꿨고, 유동성 horizon을 자산군별로 다르게 적용한다. 한국은 2025년부터 단계 적용 중이다.

실무에서는 일일 VaR 한도, 월간 ES 한도, 위기 시나리오 시 stressed VaR를 같이 본다. 한도 초과가 나면 리스크 부서가 트레이더에게 포지션 축소를 요구하거나 헤지 추가를 요청한다.

Credit Risk: PD/LGD/EAD, IFRS 9 Stage 1/2/3, Basel III/IV

신용위험은 3가지 파라미터로 분해한다.

ECL(Expected Credit Loss) = PD × LGD × EAD. 이게 IFRS 9의 핵심 공식이다.

IFRS 9는 자산을 3개 Stage로 나눈다.

Basel III/IV는 자기자본비율(CAR)을 8% 이상 유지하라고 한다. RWA(Risk-Weighted Assets) 계산 시 표준방법 또는 IRB(Internal Ratings-Based) 모형을 쓴다. Basel IV는 IRB 모형의 floor를 표준방법의 72.5%로 묶었다. 한국은 2023년부터 적용, 일본은 2024년부터 단계적 적용 중이다.

Operational + Liquidity Risk: KRI, RCSA + LCR + NSFR

운영리스크는 사고가 터지기 전에 신호를 본다.

유동성위험은 Basel III가 만든 2개 지표로 본다.

증권사는 은행보다 단기 RP(환매조건부채권), 콜, CP에 의존도가 높아서 유동성 위기가 빠르게 온다. 2020년 3월 미국 증권사들이 머니마켓 펀드 환매에 시달리며 LCR이 흔들렸던 게 대표적이다.

실제 하루: 7am→9am Risk Committee→11am stress test→2pm trade review→4pm reg report

리스크/컴플라이언스 실무자의 평범한 하루는 이렇다.

실제 회사마다 차이는 있지만 모니터링 → 위원회 → 시나리오 → 검토 → 보고의 사이클은 비슷하다.

Compliance: KYC/eKYC/AML/CTR/SAR/Sanctions/Market Surveillance

컴플라이언스는 거래 자체를 막는 부서가 아니라 거래가 합법적이고 윤리적으로 일어나는지 확인하는 부서다.

KYC가 처음 한 번이라면 ongoing monitoring은 평생 한다. 고객의 거래 패턴이 KYC 단계에서 적은 직업/소득과 안 맞으면 알람이 뜬다.

규제 frameworks: Basel III/IV, MiFID II, Dodd-Frank, Volcker, FATCA, CRS

글로벌 증권사가 따라야 하는 주요 규제 프레임워크다.

이 규제들은 "한국 회사니까 상관없다"가 안 통한다. 미국 시민이 한국 증권 계좌를 열면 FATCA, EU 거주자가 한국 ETF를 사면 MiFID II 영향이 일부 들어온다. 글로벌 IB는 4-5개 규제를 동시에 본다.

한국 규제 (FSS/FSC/KOFIU/KRX) + 일본 (SESC/FSA/JPX) + 글로벌 (SEC/FINRA/FCA)

한국:

일본:

글로벌:

면접에서 "지원 직무와 관련된 규제 3개를 말해보라"는 질문에 자본시장법, Basel III, AML 정도로 답할 수 있으면 평균 이상이다.

내부통제 (COSO/SOX-K/J-SOX/Three Lines of Defense)

내부통제 프레임워크는 COSO ERM이 사실상 표준이다. 통제 환경, 위험 평가, 통제 활동, 정보와 의사소통, 모니터링의 5개 요소.

SOX(Sarbanes-Oxley Act)는 2002년 엔론 사태 후 미국 의회가 만들었다. Section 404가 핵심으로, 경영진이 내부통제의 효과성을 평가하고 회계법인이 검증한다. 한국은 외부감사법으로 K-SOX, 일본은 금융상품거래법(金融商品取引法)으로 J-SOX가 있다.

Three Lines of Defense 모델:

이 모델을 면접에서 설명할 수 있으면 "통제 직무가 왜 여러 부서로 나뉘는지" 답할 수 있다.

Tools 스택: Bloomberg PORT, MSCI RiskMetrics, Numerix, Murex, NICE Actimize

리스크/컴플라이언스 실무에서 자주 쓰는 도구다.

신입은 모든 도구를 다 알 필요는 없지만 Bloomberg와 SQL은 면접에서 자주 물어본다.

실패 사례: Barings, MF Global, SocGen Kerviel, Archegos, 옵티머스/라임

리스크 통제 실패의 고전적 사례들이다.

면접에서 "최근 리스크 사건 하나를 골라 분석해보라"는 질문이 자주 나온다. Archegos는 2021년 사건이지만 카운터파티/집중리스크/TRS 등 교과서 주제가 다 들어 있어서 좋은 답변 소재다.

KPI: RWA, CAR, VaR limit breach, compliance training, 사고 수

리스크/컴플라이언스 부서의 KPI는 회사마다 다르지만 자주 보는 것은 다음과 같다.

KPI를 어떻게 설정하는지에 따라 부서 행동이 바뀐다. 너무 보수적이면 영업 발목을 잡고, 너무 느슨하면 사고를 못 막는다.

인터뷰 질문 20개 (가장 무서운 리스크, KRI 5개, Archegos 의견)

질문은 정답이 정해진 것이 아니라 사고 구조를 보는 것이다. 결론 한 문장, 근거 2-3개, 현장 적용 1개를 묶어서 답하면 점수가 잘 나온다.

연봉: 한국 신입 5-7천만→1.5억+, 일본 700-1300만엔, 美 $150K-180K

대략적인 수준이다. 회사와 연차에 따라 편차가 크다.

일본:

미국:

런던/홍콩/싱가포르는 미국과 비슷하거나 약간 낮은 수준. 컴플라이언스보다 quant risk가 보너스가 좀 더 높은 경향.

커리어 패스: Risk Analyst→Senior→VP→Director→CRO

전형적인 경로다.

대안 경로:

리스크/컴플라이언스는 한 번 들어가면 산업 안에서 이동하기 좋은 직무다. 데이터, 규제, 상품 지식이 회사가 바뀌어도 그대로 쓰인다.

자격증: FRM, CFA, PRM, CAIA, CIA, CAMS

가장 추천되는 자격증 순서.

신입은 FRM Part 1 또는 투자자산운용사를 가장 먼저 보는 게 좋다. 둘 다 6개월 안에 가능하고 면접에서 신호가 된다.

90일 학습 루틴

루틴의 목표는 자료를 다 읽는 것이 아니라 내 언어의 답변을 만드는 것이다. 일주일에 산출물 하나(분석 글, 엑셀, 차트)를 남기면 90일 후 12개의 근거가 생긴다.

References

# VaR 계산 예시
# Historical VaR과 Monte Carlo VaR 두 가지

import numpy as np
import pandas as pd

# 가정: KOSPI200 5년치 일별 수익률 (1,250 거래일)
np.random.seed(42)
returns = np.random.normal(0.0005, 0.015, 1250)  # 평균 0.05%, std 1.5%
portfolio_value = 10_000_000_000  # 100억 KRW

# 1. Historical VaR (95% 1-day)
sorted_returns = np.sort(returns)
percentile_5 = sorted_returns[int(0.05 * len(sorted_returns))]
historical_var = -percentile_5 * portfolio_value
print(f"Historical 1-day 95% VaR: {historical_var:,.0f} KRW")

# 2. Expected Shortfall (CVaR)
tail_returns = sorted_returns[:int(0.05 * len(sorted_returns))]
expected_shortfall = -np.mean(tail_returns) * portfolio_value
print(f"95% Expected Shortfall: {expected_shortfall:,.0f} KRW")

# 3. Monte Carlo VaR (정규분포 가정)
mu = np.mean(returns)
sigma = np.std(returns)
n_simulations = 100_000
mc_returns = np.random.normal(mu, sigma, n_simulations)
mc_var = -np.percentile(mc_returns, 5) * portfolio_value
print(f"Monte Carlo 1-day 95% VaR: {mc_var:,.0f} KRW")
# IFRS 9 ECL 계산 예시
# Expected Credit Loss = PD x LGD x EAD

import pandas as pd

# 채권 포트폴리오
portfolio = pd.DataFrame({
    "bond_id": ["B001", "B002", "B003", "B004"],
    "rating": ["AAA", "BBB", "BB", "B"],
    "pd_1y": [0.0002, 0.003, 0.015, 0.05],   # 1년 부도 확률
    "lgd": [0.45, 0.60, 0.70, 0.75],          # 손실률
    "ead": [10_000_000_000, 5_000_000_000, 2_000_000_000, 1_000_000_000],
    "stage": [1, 1, 2, 3],                     # IFRS 9 Stage
})

# Stage별 ECL 계산
# Stage 1: 12개월 ECL
# Stage 2/3: Lifetime ECL (3년 가정)
def calc_ecl(row):
    if row["stage"] == 1:
        return row["pd_1y"] * row["lgd"] * row["ead"]
    else:
        # 단순화: 3년 누적 PD = 1 - (1 - PD_1y)^3
        pd_lifetime = 1 - (1 - row["pd_1y"]) ** 3
        return pd_lifetime * row["lgd"] * row["ead"]

portfolio["ecl"] = portfolio.apply(calc_ecl, axis=1)
print(portfolio)
print(f"Total ECL: {portfolio['ecl'].sum():,.0f} KRW")
-- 한도 초과 거래 탐지 쿼리
-- 일일 트레이딩 한도와 실제 거래 비교

WITH daily_position AS (
    SELECT
        trader_id,
        trade_date,
        instrument_type,
        SUM(notional_amount) AS gross_notional,
        SUM(CASE WHEN side = 'BUY' THEN notional_amount ELSE -notional_amount END) AS net_notional
    FROM trades
    WHERE trade_date = CURRENT_DATE
    GROUP BY trader_id, trade_date, instrument_type
),
limits AS (
    SELECT trader_id, instrument_type, daily_limit
    FROM trader_limits
    WHERE effective_date <= CURRENT_DATE
      AND (expiry_date IS NULL OR expiry_date > CURRENT_DATE)
)
SELECT
    p.trader_id,
    p.instrument_type,
    p.gross_notional,
    l.daily_limit,
    ROUND(p.gross_notional / l.daily_limit * 100, 2) AS utilization_pct,
    CASE
        WHEN p.gross_notional > l.daily_limit THEN 'BREACH'
        WHEN p.gross_notional > l.daily_limit * 0.9 THEN 'WARNING'
        ELSE 'OK'
    END AS status
FROM daily_position p
JOIN limits l
  ON p.trader_id = l.trader_id
 AND p.instrument_type = l.instrument_type
WHERE p.gross_notional > l.daily_limit * 0.8
ORDER BY utilization_pct DESC;

참고 자료:

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다