<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>orca_orcinus.log</title>
        <link>https://velog.io/</link>
        <description>orca</description>
        <lastBuildDate>Wed, 14 Jan 2026 08:23:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. orca_orcinus.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/orca_orcinus" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[금융 시계열 분석 기법의 최신 동향 (중 일부)]]></title>
            <link>https://velog.io/@orca_orcinus/%EA%B8%88%EC%9C%B5-%EC%8B%9C%EA%B3%84%EC%97%B4-%EB%B6%84%EC%84%9D-%EA%B8%B0%EB%B2%95%EC%9D%98-%EC%B5%9C%EC%8B%A0-%EB%8F%99%ED%96%A5-%EC%A4%91-%EC%9D%BC%EB%B6%80</link>
            <guid>https://velog.io/@orca_orcinus/%EA%B8%88%EC%9C%B5-%EC%8B%9C%EA%B3%84%EC%97%B4-%EB%B6%84%EC%84%9D-%EA%B8%B0%EB%B2%95%EC%9D%98-%EC%B5%9C%EC%8B%A0-%EB%8F%99%ED%96%A5-%EC%A4%91-%EC%9D%BC%EB%B6%80</guid>
            <pubDate>Wed, 14 Jan 2026 08:23:33 GMT</pubDate>
            <description><![CDATA[<h1 id="이론---실무">이론 &lt;-&gt; 실무</h1>
<h1 id="과거-표준---현재-트렌드">과거 표준 &lt;-&gt; 현재 트렌드</h1>
<p>.
.
.
.
.
.</p>
<h1 id="1-분수-차분">1. 분수 차분</h1>
<h3 id="왜-만들었나">왜 만들었나?</h3>
<p>원본 데이터(d=0): 가격 패턴(추세)이 살아잇지만 통계적으로 불안정(정상성 X)
1차 차분 데이터(d=1): 통계적으로 안정(정상성 O)이지만,
어제 가격이 1,000원이었는지 1,000,000원이었는지 기억-memory-이 삭제된 상태.</p>
<p>정보-memory-를 최대한 살리면서 통계적 안정성(정상성)도 확보할 방법이 필요함.</p>
<h3 id="어떻게-하냐면">어떻게 하냐면</h3>
<p>처음 접하고 날짜는 정수 단위인데 어떻게 분수로 쪼개는지 궁금했음.
과거 데이터에 곱하는 가중치를 소수점 단위(d)로 조절하는 방식이다.</p>
<p>L -&gt; 지연 연산자
<img src="https://velog.velcdn.com/images/orca_orcinus/post/cb9d5106-7afa-49b7-9824-7c7e7d7b754f/image.png" alt="">
이렇게 나타낼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/e2605c86-5224-4996-b004-96ca66304638/image.png" alt="">
1차 차분 수식</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/0b8da55e-0b16-4142-9098-d4466b4a6bb3/image.png" alt="">
대입해서 정리했다. 정리된 1차 차분 수식이다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/1de40cd8-f66d-45d2-af6c-7812692638dc/image.png" alt="">
2차 차분은 이렇게 나타낼 수 있겠지?</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/d195d205-b061-4c66-a6f5-648993129db7/image.png" alt="">
일반화 해보자</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/52b73bab-53dc-41b0-bb4f-bfed90e5bffa/image.png" alt="">
(1-L)^d를 일반화된 이항정리로 전개하면? 이렇게 된다</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/80f94e6e-6527-4876-aeac-40fbe6156df9/image.png" alt="">
y_t를 차분 결과라 하자 </p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/6b1d9f16-de58-48a2-b073-f903310fd574/image.png" alt=""></p>
<p>그럼 이렇게 나타낼 수 있다.</p>
<p>어떤 시점 x_(t-k)마다 앞에 가중치 오메가_k가 붙어있는 것에 주목하자.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/9f2cb338-90e4-4963-ba8b-7351be89074f/image.png" alt=""></p>
<p>전개하면 이렇게 될 것이고</p>
<p>드 디 어</p>
<p>이해하기 쉽게 차분 d에 1과 0.4를 각각 대입해보면</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/a1be0cd0-e4e1-473a-9c1b-ddef34eca5a1/image.png" alt=""></p>
<p>아하~~ 이래서 분수 차분은 기억을 가지고 있다는 거구나.</p>
<p>이때, 과거 데이털르 무한정 사용할 수는 없으니까
FFD(Fixed-Width Window)=&#39;고정 윈도우&#39;를 이용해서 범위를 정해준다.
범위는 어떻게 정함? 가중치가 너무 작아서 영향이 떨어지는 지점으로.</p>
<h3 id="왜-좋은가">왜 좋은가?</h3>
<ol>
<li>일반 차분은 신호까지 날려버리지만 분수 차분은 최대한 보존한다.</li>
<li>원본(d=0)과의 상관관계를 80~90% 유지하면서 정상성도 갖춰 딥러닝 학습 결과가 월등함.</li>
<li>덕분에 예측력이 향상됨</li>
</ol>
<h3 id="최적-d값은-어떻게-정하나">최적 d값은 어떻게 정하나?</h3>
<p>d를 0.1같은 작은 값부터 조금씩 올려가면서 탐색함
ADF검정 p값 &lt; 0.05 를 통과하는(=정상성을 확보하는) 가장 작은 값을 찾는다.</p>
<h1 id="2-garch11-그리고-garman-klass">2. GARCH(1,1) 그리고 Garman-Klass</h1>
<p>변동성 내용</p>
<h1 id="3-hmm-그리고-gmmgaussian-mixture-model">3. HMM 그리고 GMM(Gaussian Mixture Model)</h1>
<p>레짐 탐지 내용</p>
<h1 id="4-walk-forward-그리고-cpcvcombinatorial-purged-cross-validation">4. Walk-Forward 그리고 CPCV(Combinatorial Purged Cross-Validation)</h1>
<p>시계열 CV 내용</p>
<h1 id="5-boosted-hybrid">5. Boosted Hybrid</h1>
<p>잔차 재학습 내용</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[비지도 학습을 활용한 페어 트레이딩 탐색]]></title>
            <link>https://velog.io/@orca_orcinus/%EB%B9%84%EC%A7%80%EB%8F%84-%ED%95%99%EC%8A%B5%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8E%98%EC%96%B4-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%94%A9</link>
            <guid>https://velog.io/@orca_orcinus/%EB%B9%84%EC%A7%80%EB%8F%84-%ED%95%99%EC%8A%B5%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%8E%98%EC%96%B4-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%94%A9</guid>
            <pubDate>Tue, 06 Jan 2026 08:36:57 GMT</pubDate>
            <description><![CDATA[<h1 id="페어-트레이딩이란">페어 트레이딩이란?</h1>
<p>일종의 차익거래이다.
여기선 이해하기 쉽게 주식으로 예를 들겠다.</p>
<p>주가가 비슷하게 움직이는 2개의 주식이 있다고 가정하자.
평소와 움직임이 달라지며 A주식과 B주식의 가격 차이가 벌어지는 상황을 상상해보자.
예를 들어, A주식은 가격이 오르고 B주식은 가격이 내려갔다.
이때, 평균회귀를 기대하며 A주식에 대해 (공)매도 B주식에 대해 매수를 하는 것이
통계적 차익거래라고 할 수 있다.</p>
<p>페어 트레이딩 대상을 찾기 위하여
S&amp;P 500에서 500개 주식의 정보를 갖고왔다
그리고 아래는 500개 주식끼리의 상관관계를 나타낸 히트맵이다</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/f42937ac-f585-4f99-9e2c-20ec6e20b2b6/image.png" alt=""></p>
<p>이게 추상화도 아니고 도무지 알아볼 수 없다.
주식 2개씩 계속 뽑아서 확인해야할까?
그럼 500_C_2(조합) = 124,750 개의 쌍이 나온다.
그걸 다 점검하는 것은 말이 안되는 짓이다.</p>
<p>그렇다면 상관관계 상위권만 점검하면 될까?
여전히 문제가 있다.
상관관계는 &#39;왜&#39;를 설명하지 못한다.
이게 시장 전체가 올라서 생긴 상관계수인지
섹터 전체가 올라서 생긴 상관계수인지
아니면 해당 시기에 우연히 같이 올라서 생긴 상관계수인지
설명할 수 없다.</p>
<p>(아래는 수익률 행렬이다. 컬럼은 주식 티커, 값은 수익률, 행은 날짜로 구분한다)</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/86026d4d-ad88-45e8-ae22-292e3b295ec0/image.png" alt=""></p>
<p>위에서 발생한 문제를 해결하기 위해 PCA를 도입한다.</p>
<p>PCA의 특성</p>
<ol>
<li>전체 데이터를 가장 잘 설명하는 새로운 축 도입</li>
<li>차원을 축소한다 (방금까지 무려 500차원이었다)</li>
<li>노이즈를 버린다 (주성분 개수 선택에 의해)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/bfcbf6e9-7f97-4d44-a583-b541b0b44565/image.png" alt=""></p>
<p>익숙한 이미지.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/f248410f-d9d0-4b27-9558-721031de28de/image.png" alt=""></p>
<p>PCA 결과를 요약한 이미지이다.
여기서 궁금증이 생길 것이다
아니 이러면 개별 주식이 주성분으로 압축되어 다 사라진 것 아니냐?
이러면 어떻게 분석하느냐?</p>
<p>나도 같은 의문을 가졌다.
이때 PCA의 &#39;로딩&#39;이라는 개념을 알아야한다</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/7dd68d0f-94db-41c8-8d32-1ab3bbe6a5d2/image.png" alt="">
<img src="https://velog.velcdn.com/images/orca_orcinus/post/6ed8b750-ae43-4754-a5b9-73f78f0b2b81/image.png" alt=""></p>
<p>로딩이란, 쉽게 말하면 해당 주성분(PC)를 생성하는데
기존 컬럼들이 얼마나 기여했는지를 나타내는 수치이다.
가중치라고 생각해도 된다.</p>
<p>우리가 PC성분 개수를 k개로 골랐다고 가정하자.
그럼 AAPL 의 로딩 벡터를 이렇게 생각할 수 있다
AAPL: [loading_PC_1, loading_PC_2, ... , loading_PC_k]</p>
<p>즉, 각 주식의 각 PC에 대한 로딩 기여도를 나타낸 k차원 벡터이다</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/05fb01ec-4456-4447-84a0-1ac0de113357/image.png" alt=""></p>
<p>이때, 로딩 유사도를 이용해 군집화를 진행한다.
왜 로딩 유사도를 이용하는가?
로딩이 유사하다는 것은 주가가 움직일 때
같은 시장 요인(Factor)에 대해 거의 동일한 민감도로 반응한다는 것을 의미하기 때문!!!</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/90d61e48-2e07-464e-97a9-fdaaafa36cc6/image.png" alt=""></p>
<p>이제 같은 군집 내에서 가장 유사한 Pair 를 골라주면 된다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/40b5b2c8-d5c7-4cc5-8756-a1330cdd7f48/image.png" alt=""></p>
<p>거의 다 왔다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/9d6637c9-56e4-44a3-bdee-fd1c56010acd/image.png" alt=""></p>
<p>Pair -&gt; BAC, C 당첨
눈으로 봐도 비슷하게 움직인다는 것이 보인다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/a63c6470-5038-4ab1-aea0-718ca391b4e1/image.png" alt=""></p>
<p>한눈에 확인하기 쉽게 스프레드 그래프를 새로 그렸다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/91371546-6586-4029-a0ef-5476e151d15d/image.png" alt=""></p>
<p>Z-스코어를 이용한 진입 신호</p>
<p>초록색 - A long / B short
빨간색 - A short / B long</p>
<p>ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ</p>
<p>비지도 학습(PCA, 군집화)을 활용해서 무엇을 했나? 포인트 정리</p>
<p>1) 차원의 저주 해결 및 연산 효율성 극대화
12만개의 조합을 전수조사하는 대신, 수치화된 로딩 벡터 군집화로 연산 효율을 수만배 높였음.</p>
<p>2) 가짜 상관관계 제거
단순히 차트가 닮은 게 아니라, 시장을 움직이는 동인(Driver)에 반응하는 메커니즘이 같은 종목들을 찾아냈다.</p>
<p>마지막으로
&#39;공분산행렬 분해&#39;를 꼭 알아보시길 바랍니다
PCA 이해도가 차원이 달라졌습니다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝 스태킹 앙상블 첫 시도]]></title>
            <link>https://velog.io/@orca_orcinus/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8A%A4%ED%83%9C%ED%82%B9-%EC%95%99%EC%83%81%EB%B8%94-%EC%B2%AB-%EC%8B%9C%EB%8F%84</link>
            <guid>https://velog.io/@orca_orcinus/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%8A%A4%ED%83%9C%ED%82%B9-%EC%95%99%EC%83%81%EB%B8%94-%EC%B2%AB-%EC%8B%9C%EB%8F%84</guid>
            <pubDate>Sat, 03 Jan 2026 02:48:44 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터-전처리">데이터 전처리</h1>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/d1aac207-17d7-4daf-92c5-1564836bc04c/image.png" alt=""></p>
<p>모든 피처 시각화 다 띄움
산점도+회귀선 분석이 아주 직관적이라 마음에 들었다</p>
<h1 id="베이스라인-모델">베이스라인 모델</h1>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/a669bcfa-f7c5-4bf0-bee7-b630f1688292/image.png" alt=""></p>
<p>베이스모델 LGB 빠르고 데이터 안 가리고 좋음
이상치 제거, 피처 엔지니어링 하나씩 넣어보면서 결정</p>
<p>다른 모델은 다를 수도있지 않나? 맞지만 하나만 고른다면 최선
선형 모델은 워낙 빨라서 베이스라인 여러개를 동시에 돌려도 됨</p>
<p>피처 엔지니어링
단순히 피처늘려서 좋다? ㄴㄴ
트리에는 뭘 해야 좋고 (의미 있는 기준으로 빠르게 분기하도록)</p>
<p>선형은 어떻게 먹여야 좋고 (직선으로 관계를 보기 좋게. 비선형/상호작용 인식할 수 있게)</p>
<p>각각의 기계(모델)가 알아들을 수 있도록</p>
<p>뭔가 파생 변수 더 없을까 고민
분류 때의 아이솔레이션 Anomaly Score, 오토인코더 Latent Vector 만들었던 것처럼</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/10b45634-8e62-450b-b94b-8cdb947fd369/image.png" alt=""></p>
<p>군집화 피처를 만들자!!
지도, 비지도 2가지 방식으로 함</p>
<p>지도는 내가 직접 구간별 답을 주는 방식
비지도는 K-Means 클러스터링 해봤음</p>
<p>큰 기대와 달리 둘 다 그냥 그렇길래 제외함 (큰 차이 X)
생각해보니 이거 LGBM만 해봤음. 선형에도 해봐야했는데..</p>
<p>box-cox (skew 0.75 이상, 고정 람다가 아니라 컬럼마다 최적 람다를 찾아주는 식으로)</p>
<p>스케일링 (필요한 모델일 때)</p>
<h1 id="베이스-러너">베이스 러너</h1>
<p>트리 모델
선형 모델
뉴럴 모델
커널 모델
거리 모델
(확률 모델)</p>
<p>머신러닝 모델을 기반 기준으로 나눠봄</p>
<p>앙상블 때 서로 다른 성격이면 더 좋으니까</p>
<p>다른 기반의 모델들을 골고루 테스트하기로함 </p>
<p>*참고: 태뷸러 데이터는 트리, 선형이 거의 다 해먹음</p>
<pre><code> 추가해봤자 뉴럴 커널 약간.</code></pre><p><img src="https://velog.velcdn.com/images/orca_orcinus/post/fa34dcd9-011b-43b8-87c0-ac307c1a7262/image.png" alt=""></p>
<p>커널 트릭??</p>
<p>커널 함수를 이용해서</p>
<p>차원 확장(비선형 능력)은 얻고</p>
<p>고차원 특징을 직접 만들 필요는 없다.</p>
<p>커널릿지, SVR → 데이터가 적어서(1,100행) 커널릿지가 더 어울림</p>
<p>근데 XGB LGB 등 트리 모델이 성능이 기대만큼 안 나옴.</p>
<p>의외로 뉴럴의 성능이 더 나왔음. 그래서 채택</p>
<p>각종 선형 모델도 많이 해봄.</p>
<p>거리 모델은 KNN도 해봤으나 역시 안 좋음.</p>
<p>각각의 모델에 적합한 처리로 넣어주기</p>
<p>선형 모델에 타깃 인코딩 해봄 (기대만큼 결과가 좋지 못해서 아쉬움)</p>
<p>원핫 인코딩의 경우
원핫 인코딩 하고나서 피처 평가 (순열 중요도)
거기서 지우는 것도 해봄
원본 피처 자체를 지우면 손실이 크니까</p>
<p>원핫으로 나눠진 상태에서 → 골라 지우기</p>
<p>(이렇게도 해봤다는 것이지 권장하는 건 아님)</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/9a409f11-0ec3-4260-85e6-70009ca01ce2/image.png" alt=""></p>
<p>순열 중요도 이용.</p>
<p>피처 셀렉션 목적!!</p>
<p>중요도 ≤ 0 , P밸류 &gt; 0.05 , p99_low &lt; 0
이것도 하나하나 삭제하면서 RMSE 개선되는지 확인함 (특히 선형 모델!!)</p>
<p>데이터가 약 1,100개밖에 없어서 (문제인 데이터가 똑같이 10개일 때 비율을 생각)
이상치 몇개가 회귀선을 강력하게 끌어당기듯이
노이즈가 타깃 예측을 방해함. 그래서 데이터가 적어도 과감히 삭제</p>
<p>중요도. 0 이하는 삭제 고려</p>
<p>p값은 우리가 아는 통계적 유의성</p>
<p>p99_low는 99% 신뢰구간에서의 최솟값. 반복시 중요도가 어디까지 떨어지는가 = 최악의 경우에도 쓸모가 있는가?</p>
<blockquote>
<p>0 양수이면? 최악이어도 도움 된다
&lt; 0 음수이면? 어떤 경우엔 나빴다가 좋았다가 한다. 노이즈 가능성 높으므로 삭제 고려</p>
</blockquote>
<p>기타 참고한 것</p>
<p>잔차 분석 (모델이 어디서 틀리나 진단)</p>
<p>널 중요도 (타깃을 무작위로 섞어서 확인)</p>
<p>SHAP (각 피처 기여도 값)</p>
<p>피처 중요도 &lt;&lt; 이놈은 일부러 안 봄. 안 좋다고 함.</p>
<h1 id="블렌딩-스태킹">블렌딩 스태킹</h1>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/b5bcfd63-f721-4a18-b2ab-daf0551f5ce9/image.png" alt=""></p>
<p>블렌딩(가중치 앙상블), 스태킹 진행함</p>
<p>블렌딩은 수동으로 하는 것과</p>
<p>scipy minimize 최적 수행이 있음</p>
<p>스태킹 OOF, test</p>
<p>코드 오타내서 스태킹 컬럼 하나 값이 전부 0이됨
모르고 제출했다가 절망함</p>
<p>릿지CV, 메타모델 전부 비교해서 선택
힐 클라이밍도 해봄 (가중치 합 강제로 1 만들기)</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/3b1a5829-3e59-4f47-9857-d0e8a8754e12/image.jpg" alt=""></p>
<p>스태킹 하면서 깨달음
데이터를 보는 관점이 다른 모델들이 서로 보완</p>
<p>XGB LGB 단독 성능이 CAT보다 좋았지만 CAT이 좋음</p>
<p>포켓몬 배틀 예시</p>
<p>PassThrough 스태킹 (메타모델이 원본 X의 세부 신호도 다 담기 위해)
OOF를 원본 피처에 섞어서 XGB 주는 것도 해봄</p>
<h1 id="기타">기타</h1>
<p>못해봐서 아쉬운거</p>
<p>스태킹 더 많은 조합을 준비해놨는데 못해본거.
모델마다 다르게, 데이터에서 이상치 혹은 노이즈를 더 제거하면 성능이 더 좋아질게 분명한데 못해서 아쉽다
VIF(다중공선성) 확인하고 삭제해볼 시간이 없어서 아쉽다 혹은 PCA
시드 앙상블?? 알아보고 싶었는데</p>
<p>더욱 개선할 여지나 아이디어는 많았다 하루만 더있었다면
18,000 아래도 될 것 같지만? 못해ㅘ거 아쉽네</p>
<p>ai와 협업하는 것의 중요성을 또 다시 체감</p>
<p>자바웹개발 (DB → 백엔드 → 프론트엔드)
우리도 써야한다
근데 일임은 ㄴㄴ</p>
<p>나는 실험 설계에 집중해야한다</p>
<p>의사결정 수억 수십억 수백억
설명가능?
재현성은? 재현가능?</p>
<p>나를 중심으로 ai를 써야한다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[선형회귀와 헷지]]></title>
            <link>https://velog.io/@orca_orcinus/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80%EC%99%80-%ED%97%B7%EC%A7%80</link>
            <guid>https://velog.io/@orca_orcinus/%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80%EC%99%80-%ED%97%B7%EC%A7%80</guid>
            <pubDate>Thu, 18 Dec 2025 07:34:26 GMT</pubDate>
            <description><![CDATA[<p>선형회귀는 예측만을 위한 도구가 아니라
구조 파악의 도구로도 활용할 수 있다.</p>
<p><strong>y = a + bx + e</strong></p>
<p>절편a, 기울기b 의미는? </p>
<p>주식과 헷지에 대한 예시로 알아보자.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/51befe9e-3a39-49f6-b909-cc9e8494c4bd/image.png" alt=""></p>
<p>(예시를 이해하기 쉽도록 둘 다 오르는 경우로 만들었음)</p>
<p>y축 내 포트폴리오 수익률
x축 시장 수익률
기울기b 시장이 1만큼 움직일 때의 자산 움직임 (시장 민감도)
절편a 시장으로 설명되지 않는 고유 변동 (시장과 무관한 추가 수익)</p>
<p>주식을 산다는 것은 기본적으로 내 자산을 b에 노출시키는 것
(x가 움직이면 b만큼 영향을 받아 y가 움직이니까)</p>
<p>b값에 대해 생각해보자
b = 1
b = 2.5 (위 이미지)
b = 0.3
b = 0
b &lt; 0 (음수)</p>
<p>b = 0 에서 a의 의미가 잘 보인다.
시장 영향을 제거하고 남은 성분이므로, 그 주식 고유의 성격이다.</p>
<p>주식을 산다는 것은 궁극적 목표는 a를 찾는 것. (seeking alpha)
초과수익을 추구한다고도 한다.</p>
<p>a값에 대해 생각해보자</p>
<p>a &gt; 0
a = 0
a &lt; 0</p>
<p><strong>헷지(hedge)란 무엇인가?</strong></p>
<p>간단히 말하면
원래 포지션의 위험을 줄이기 위해 반대 방향의 포지션을 일부 취하는 것이다.</p>
<p>다시 b를 생각해보자</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/09d2c4d9-8871-41e4-815f-2d0f58aabacd/image.png" alt=""></p>
<p>내 포트폴리오는 시장 민감도가 크다.
이 말은 시장이 급락할 때의 반응도 크다는 뜻이다.</p>
<p>조만간 시장에 일시적으로 큰 충격이 있을 것으로 예상된다.
그런데 주식을 팔기는 싫고 장기보유하고싶다.
뭔가 방법이 없을까?</p>
<p><strong>헷지를 하는 이유</strong></p>
<p>일시적으로 내 포트폴리오의 시장 민감도를 낮추고 싶다.
이때 헷지를 사용하면 된다</p>
<p>b를 0에 가깝게 만드는 것이다. (혹은 내가 원하는 전략에 맞춘 값으로)
그럼 일시적으로 시장 민감도가 줄어들어 충격을 완화할 수 있다.</p>
<p>내 포트폴리오의 b(시장 민감도)를 낮추려면
b가 음수 값인 것을 추각하면 된다</p>
<p>여기서는 시장 수익률의 정확히 반대인, 지수 선물 매도를 생각할 수 있다.</p>
<p>이렇게 시장 성분(b)을 제거해서 주식 고유 성분(a)만 누리는 것이다.</p>
<p>b값이 음수인 다른 대안(금, 채권 등)은 안되나요?
된다. 하지만 헷지보다도 자산배분 성격이 강하다.
(장기 수익률 및 MDD 조정 등의 목적)</p>
<p><strong>헷지에 대한 오해</strong></p>
<p>헷지의 목적은 수익 극대화가 아니라
&#39;변동성을 제한하는 것&#39;이다</p>
<p>이를 선형회귀에 입각해 설명하면,
불필요한 흔들림(분산)을 회귀로 분해해서 제거하는 작업이다.</p>
<p>(수익률을 고유 성분 a와 시장 성분 b로 분해해서 해석했다)</p>
<p><strong>구체적인 헷지 계산법</strong></p>
<p>시장 민감도 b는 시간에 따라 변한다</p>
<p>.
.
.
(더 이상은 주제를 벗어나서 생략)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝을 위한 데이터 전처리]]></title>
            <link>https://velog.io/@orca_orcinus/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@orca_orcinus/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Thu, 18 Dec 2025 07:11:47 GMT</pubDate>
            <description><![CDATA[<p><strong>1. 데이터 클리닝</strong>
-&gt; 모델 학습에 방해가 되는 요소를 제거하거나 수정하여 데이터 품질을 올린다.</p>
<p><strong>2. 데이터 트랜스포메이션</strong>
-&gt; 데이터를 알고리즘이 다루기 좋은 형태/분포로 바꾼다.</p>
<p><strong>3. 피처 엔지니어링</strong>
-&gt; 모델 학습 성능을 높일 수 있는 새로운 변수를 만들어낸다.</p>
<p>내가 사용하려고 만든 작업 플로우는 아래와 같다.</p>
<p>ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ</p>
<p><strong>0. 데이터 파악</strong></p>
<p>수치형
문자열
수치 + 문자열
수치인척 문자열</p>
<p>어떤 컬럼들이 있는지 의미 확인</p>
<p><strong>1. 정제</strong></p>
<p>1-1. 중복값 삭제
1-2. 수치인척 문자열 -&gt; 수치</p>
<p>1-3. 범주형 처리 (순서 있는 문자열 -&gt; 수치)
1-4. 결측치 처리</p>
<p>a) 대체</p>
<p>숫자형 - 중앙값, 평균, 상수
범주형 - 최빈값, &#39;Unknown&#39;(특히 의미있는 결측)</p>
<p>b) 삭제</p>
<p>행 - 결측치가 적을 때
-&gt; 행 내에서 말고, 결측 행이 적을 때를 뜻함
-&gt; 행 내에서 결측치가 많으면 지워야지</p>
<p>열 - 결측치가 많을 때
-&gt; 단, 의미있는 결측의 경우 삭제하지 않고 위와 같이 대체한다</p>
<p>1-5. 이상치 처리 (에러 및 통계적 아웃라이어)</p>
<p>먼저 명백한 오류인, 논리적으로 불가능한 에러 값을 처리한다</p>
<p>박스플랏(IQR) - 히스트플랏kde(히스토그램) 순으로 모든 컬럼 확인.</p>
<p>통계적 아웃라이어 처리 방법
지도학습의 경우 타깃(y) - 피처(x) 분리해서 생각
타깃은 원래 성격을 최대한 보존. 변환까진 괜찮은데 삭제/대체 최소화</p>
<p>이후</p>
<ol>
<li>대체 (클리핑)</li>
<li>변환 (로그)</li>
<li>삭제</li>
</ol>
<p><strong>2. 인코딩 - 원핫 (순서 없는 범주형)</strong></p>
<p>지도학습은 타깃(y) 피처(x) 분리.</p>
<p>컬럼을 따로 지정할 수도 있지만
그냥 넣어도 수치형이 아닌 것들을 알아서 인코딩한다
표면적으로 수치형인데 개념적으로 범주형이라 인코딩하고 싶으면 수동으로 지정해야함</p>
<p>데이트타임이 좀 특이한데 그냥 겟더미즈에 넣으면 반응 안하고 무시함
근데 머신에 넣으면 오류남. 그래서 뭔가 변환을 해야하는데
그냥 통째로 겟더미즈 수동 변환 컬럼에 지정해버리면 날짜 시간 값마다 더미 만들어서 차원폭발 일어남
그래서 겟더미즈가 아니라 내가 데이트타임에서 원하는 값을 쪼개고 수치형으로 정리해놔야함</p>
<p><strong>3. 스케일링</strong></p>
<p>스케일링이 필요한 모델의 경우
적합한 스케일러를 고른다
수치형 컬럼만 골라서 넣는다.</p>
<p><strong>4. 피처 엔지니어링</strong></p>
<p>피처 엔지니어링은 데이터마다 접근 방식이 매우 다양해서 간단히 말할 수 없다.</p>
<p>ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ</p>
<p>공부하면서 가장 혼동이 왔던 부분은 값을 수정하는 메서드 3종이다.
이번 기회에 간단히 정리해봤다.</p>
<p><strong>1) .apply(func)</strong></p>
<p>replace, map으로 처리하기 어려운 복잡한 로직을 적용한다.
그래서 주로 함수와 같이 사용하는데 하나 알아둬야할 것이 있다.</p>
<p>함수의 x가 무엇이냐?
시리즈면 &#39;스칼라&#39;를 하나씩 가져와서 처리. 그걸 모아서 반환값은 시리즈.
데이터프레임이면 &#39;시리즈&#39;를 하나씩 가져와서 처리. 그걸 모아서 반환값은 데이터프레임.</p>
<p>주의! func 뒤에 () 쓰면 안됨. 안 써야 앞에 객체를 받음.</p>
<p><strong>2) .replace()</strong>
값 치환.
지정하지 않은 것은 그대로 둔다. (중요)</p>
<p><strong>3) .map()</strong>
이것도 매핑 규칙에 맞춰 값을 치환한다.
그런데 지정하지 않은 것들은 모조리 null로 바뀐다. (중요)</p>
<p>데이터를 null로 바꿔버리면 아주 위험할 것 같은데 이게 왜 있을까?
무슨 이유로 만들어진 메서드인지 궁금해서 알아봤다.</p>
<p>목적은 시리즈의 값들을 매핑 규칙에 따라 <strong>&#39;재정의&#39;!!</strong>
그래서 규칙에 없는 것들은 null로 바꾸는구나.</p>
<p>이렇게 말하면 조금 더 이해가 쉽다.
&quot;내가 필요한 값만 재정의하고 나머지는 관심 없으므로 null&quot;</p>
<p>ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ</p>
<p>데이터 전처리는 어느정도 틀이 정해져있는 반복 노동이다.
특히 클리닝과 트랜스포메이션이 그렇다.
따라서, 앞으로 ai에 의해 자동화될 가능성이 굉장히 높다.</p>
<p>ai가 해준다고 공부를 안해도 된다는 것은 아니다.
나는 ai가 대체할 수 없는 역량을 더 강화하는 것이 효율적이라 생각한다.
도메인 특화 피처 엔지니어링은 오랜 기간 ai가 대체할 수 없을 것 같다.</p>
<p>그럼 결국 무엇이 중요한가? 돌고돌아 도메인 지식이 또 중요해진다.
데이터 사이언스는 시작과 끝이 도메인 지식인 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 을 조금 더 알아보자]]></title>
            <link>https://velog.io/@orca_orcinus/SQL-%EC%9D%84-%EC%A1%B0%EA%B8%88-%EB%8D%94%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@orca_orcinus/SQL-%EC%9D%84-%EC%A1%B0%EA%B8%88-%EB%8D%94%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Thu, 18 Dec 2025 07:11:26 GMT</pubDate>
            <description><![CDATA[<p><strong>&lt;목차&gt;</strong></p>
<ol>
<li>SELECT 와 별칭의 범위</li>
<li>GROUP BY 작동 원리</li>
<li>GROUP BY 와 SELECT</li>
<li>HAVING 이 존재하는 이유</li>
<li>JOIN 의 실제 작동 원리</li>
</ol>
<p><strong>## 1. SELECT 와 별칭의 범위</strong>
지난 글에서 SQL의 실제 작동 순서를 알아보았다</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/c1ecb49d-9262-4011-b38f-3c16e5ff5278/image.webp" alt=""></p>
<p>실제로는 SELECT의 작동 위치가
FROM 위가 아닌 HAVING 아래라는 것이 핵심인데
이것을 모를 때 생기는 가장 큰 오해가 있다.
<strong>&#39;SELECT 에서 만든 별칭은 그보다 윗쪽에 있는 절에서는 사용할 수 없다&#39;</strong>는 것이다.
예를 들면 SELECT에서 만든 AS &#39;별칭&#39;은
그 아래에 있는 ORDER BY에서는 당연히 사용할 수 있지만
윗쪽에 있는 WHERE 절에서는 원칙적으로 사용할 수 없다.
그런데 종종 어떤 곳에서는 WHERE 절에서 사용이 되기도 한다.
그건 저 실수를 저지르는 사람들이 너무 많다보니
최신DB들이 편의성을 위해 인식하도록 바꿔놓은 것이다.
원래는 불가능한 것이 맞다.</p>
<h2 id="2-group-by-작동-원리"><strong>2. GROUP BY 작동 원리</strong></h2>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/35777112-8016-49bc-8b0e-5c4e2a50cf24/image.webp" alt=""></p>
<p>예를 들어, 이런 테이블에서</p>
<pre><code>SELECT InvoiceNo, COUNT(*) AS cnt
FROM data3
GROUP BY InvoiceNo</code></pre><p>GROUP BY와 COUNT(*)을 이용하면</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/23b7f922-132b-4827-a8bf-ae5975861ce5/image.webp" alt=""></p>
<p>이런 결과가 나온다.
그런데 궁금하다.
우리 눈에는 하나의 컬럼 값인데 도대체 어떻게 몇 개인지 출력된 걸까?
GROUP BY는 하나의 컬럼 값만 남기고 삭제하는 것이 아니라
해당 컬럼 값의 이름으로 <strong>&#39;집계용 객체&#39;</strong>를 만드는 것이다.
데이터 베이스 용어로는 <strong>&quot;결과 셋(Result Set)을 재구성했다&quot;</strong>라고 한다.
그래서 눈에 보이는 컬럼 값은 하나인데도 여러가지 연산이 가능한 것이다.
예를 들어, 아래테이블을 그룹화하면</p>
<pre><code>name   age
-----  ----
Alice  20
Alice  21
Alice  23</code></pre><p>내부적으로는 이런 구조가 되는 것이다</p>
<pre><code>그룹(name=&#39;Alice&#39;) → [20,21,23]</code></pre><h2 id="3-group-by-와-select"><strong>3. GROUP BY 와 SELECT</strong></h2>
<p>GROUP BY를 처음 사용하면 이런 실수를 자주 한다.
GROUP BY에서 지정한 컬럼이 SELECT에 없는 오류
GROUP BY에서 지정하지 않은 컬럼이 SELECT에 있는 오류</p>
<p>이런 실수를 반복하다보면 그룹화한 컬럼이 반드시 출력되어야하는구나를 알게되는데
여기서 또 궁금하다.
왜 그렇지?
그리고 SELECT에서 다른 함수들은 왜 출력될 수 있는 거지?
간단히 말하면, <strong>&#39;그룹화한 객체 옆에는 그것을 대표할 수 있는 값만 올 수 있기 때문&#39;</strong>이다
데이터 베이스의 기본 구조를 떠올려보면
<strong>&#39;하나의 행 = 어떤 하나의 사물/사건의 정보를 담은 단위&#39;</strong>이다
즉, 행 하나하나가 어떤 사물/사건인 것이다.
그런데 어떤 컬럼이 그룹화 됐을 때,
원래 하던 대로 그 옆에 &#39;하나의 행&#39;에 대한 정보를 넣어버리면?
데이터 베이스의 기본 구조가 완전히 망가진다
테이블 = 어떤 종류의 객체
행 = 그 객체의 개별 인스턴스
컬럼 = 그 인스턴스를 설명하는 속성
이기 때문이다.
이러한 이유로 그룹화 컬럼 옆에는 반드시 그것을 대표하는 값이 와야하는 것이다.</p>
<h2 id="4-having-이-존재하는-이유"><strong>4. HAVING 이 존재하는 이유</strong></h2>
<p>나는 처음 공부할 때, WHERE이 있는데 왜 HAVING이 또 있는지 궁금했다.
왜 굳이 조건 필터링 예약어가 2개일까?
글을 열심히 읽은 독자라면 이제 HAVING이 존재하는 이유를 자연히 알 것이다.
WHERE은 행 단위로 필터링하는 기능을 수행하고
HAVING은 그룹을 필터링하는 기능을 수행한다.
즉, &#39;하나의 행&#39;들로 이루어진 테이블을 필터링하는 것과
&#39;그룹&#39;들로 이루어진 테이블을 필터링하는 것의 차이다.</p>
<h2 id="5-join-의-실제-작동-원리"><strong>5. JOIN 의 실제 작동 원리</strong></h2>
<p>A) 논리적 관점 - 개념
테이블A와 테이블B를 크로스 조인(Cartesian Product)한다.
곱집합을 만드는 것으로 가능한 모든 조합이 생성 된다</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/fa7c8002-1c42-4f8d-a4c4-122366b61388/image.webp" alt=""></p>
<p>예를 들어, 테이블A가 20행이고 테이블B가 30행이면 600행의 테이블이 만들어진다.
여기서 JOIN의 종류와 조건(ON condition)에 맞는 행만 남기는 것이다.
INNER JOIN - 조건에 맞는 행만 남긴다.
LEFT JOIN - 왼쪽 테이블의 행 + 조건에 맞는 행만 남긴다.
이래서 LEFT JOIN을 쓰면 NULL이 들어간 행이 많이 보이는 것이다.
B) 물리적 관점 - 실제 작동
하지만 매번 저렇게 곱집합을 생성해버리면 불필요한 연산량이 폭발하기 떄문에
실제로는 곱집합을 전부 만들지 않도록 똑똑한 알고리즘을 사용하고 있다.
ex. Nested Loop Join, Hash Join 등</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 공부를 시작할 때 반드시 알아야할 것]]></title>
            <link>https://velog.io/@orca_orcinus/SQL-%EA%B3%B5%EB%B6%80%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A0%EA%B2%83</link>
            <guid>https://velog.io/@orca_orcinus/SQL-%EA%B3%B5%EB%B6%80%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%A0-%EB%95%8C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A0%EA%B2%83</guid>
            <pubDate>Thu, 18 Dec 2025 07:11:06 GMT</pubDate>
            <description><![CDATA[<p>이 글을 누른 독자는
SQL을 학습하다 막혀서 검색한 사람일 것으로 가정하고 작성한다.
어떤 목적으로 SQL을 학습하는지는 모르지만 반드시 알아야할 것이 있다.
지금 SQL을 배우는 곳에서 분명히 예약어를 하나씩 알려줄 건데
그렇게 배우면 지식이 파편화돼서 힘들어지는 순간이 분명히 온다</p>
<p>C, 자바, 파이썬 같은 프로그래밍 언어들은 문법을 하나 배우면
내가 필요한 곳 혹은 쓰고싶은 곳에 넣으면서 각각이 독립적으로 기능하는데
SQL은 커다란 틀이 정해져있어서
작성 순서를 반드시 지켜야하고
해당 절 안에서 사용 가능한 예약어가 무엇인지 알아야한다.</p>
<p>그래서 쿼리문의 전체 구조를 먼저 알아야 한다.
지금부터 아래의 순서로 글을 작성하겠다.</p>
<h2 id="목차"><strong>&lt;목차&gt;</strong></h2>
<p>SQL의 틀
SQL의 실제 작동 순서
서브쿼리 VS WITH(=CTE)</p>
<h2 id="1-sql의-틀"><strong>1. SQL의 틀</strong></h2>
<p>우선 전체 틀을 보여줄테니 외우자.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/1b512ef8-4e8d-4778-b0a9-b405cb7cd07c/image.webp" alt=""></p>
<p>이것이 SQL의 기본 틀이다.
&#39;틀&#39;이라는 것은 정해진 규칙이니까
의구심을 갖지 말고 외워서 따르도록 한다.
줄바꿈 공백 부분도 의도된 것이니 외우자.</p>
<h2 id="2-sql의-실제-작동-순서"><strong>2. SQL의 실제 작동 순서</strong></h2>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/d49a27b9-e6a3-417d-8d6b-d3abf85faf51/image.webp" alt=""></p>
<p>이것이 SQL의 실제 작동 순서이다.
SELECT는 사실 HAVING 다음에 실행된다. (다음 글에서 추가 설명)</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/bb2cec81-64c4-4392-b9dd-b36870416392/image.webp" alt=""></p>
<p>SQL이라는 것은 결국 이 덩어리가 계속 반복되는 것이다.(조회 기준)
이것을 빨리 깨닫는 것이 매우매우 중요하다.
저 덩어리가 계속 반복되면서
WITH 전처리를 하거나
ORDER BY, LIMIT 출력을 조절하거나
UNION 다른 덩어리와 이어주는 것이다</p>
<h2 id="3-서브쿼리-vs-withcte"><strong>3. 서브쿼리 vs WITH(=CTE)</strong></h2>
<p>반복되는 덩어리는 &#39;서브쿼리&#39; 형태로
덩어리 안에서조차 반복된다.</p>
<p><img src="https://velog.velcdn.com/images/orca_orcinus/post/79b12a24-da91-492d-9af1-c66ce3895e2e/image.webp" alt=""></p>
<p>서브쿼리는 이 위치에서 사용 가능하다.
그런데 쿼리문을 쓰다보면
서브쿼리와 WITH 무엇을 쓸까? 고민되는 순간이 생기는데
<strong>한 번만 쓰는 경우 or 단일 값 필요 -&gt; 서브쿼리
나머지 -&gt; 싹다 WITH</strong>
이렇게 사용하면 아주 좋다.
아 그리고 너무나 당연하게도
WITH 내부에서조차 저 덩어리가 반복된다.
끝
//추가
서브쿼리, WITH 외에 추가로 VIEW 가 있다.
VIEW를 써야하는 경우도 분명히 있어서 선택을 해야하는데
대부분의 경우 서브쿼리, VIEW 보다 WITH를 쓰는것이 좋다.</p>
]]></description>
        </item>
    </channel>
</rss>