본문 바로가기
Quant

백테스팅 - 보유 기간이 길어지면서 MeanBarsToHit가 커지는 현상에 대하여

by 인천고래
반응형

안녕하세요. 주식 투자 관련 지식을 공유하는 인천고래입니다.

 

오늘은 이전 글에 이어서 백테스팅에 대해 알아볼 텐데요~

그중에 보유기간에 따른 통계 데이터가 왜곡현상을 일으키는지에 대해 알아보는 시간을 가져보도록 하겠습니다.

[Quant] - 백테스팅 - 보유 기간에 따른 수익 극대화(MeanRet & E-Ratio & MeanBarsToHit)

 

이전 글에서 MeanBarsToHit에 대해 언급이 되었었는데 60일을 보유할 경우 25가 나왔습니다.

이는 평균적으로 25일 안에 목표 수익률에 도달했다는 의미입니다.

즉, 25일 이내에 청산을 해야 좋다는 의미로 해석될 수 있습니다.

맞나요?

 

반은 맞고 반은 틀린 상황입니다. 왜 그럴까요?

예를 들어 확률상으로는 15일 이내에 목표가에 도달하는 경우가 50% 이상이라 하더라도

다수의 종목이 50일 정도 목표 수익률에 도달하지 않았다고 50일 이후에 목표가가 도달하게 되면 기존의 평균을 갉아먹게 되는 현상이 발생되어 15 => 25가 될 수도 있기 때문입니다. 

 

1. 왜 60 일 보유 전략의 MeanBarsToHit ≈ 25 가 이렇게 높게 나오나요?

BarsToHit (기간내 목표가 도달 건수)

  1. 표본 구성이 달라집니다.
    5 일 안에 목표가에 도달하지 못한 트레이드가 60 일 테스트에선 계속 살아 있습니다.
    → 60 일 테스트의 BarsToHit 계산은 **“목표가를 결국 맞힌 종목”**의 첫 터치 시점을 기록하므로, 자연스럽게 평균이 크게 늘어납니다.
  2. 평균(Mean)의 한계
    극단적으로 1 ~ 2 봉 만에 맞힌 건수 + 40 ~ 60 봉 만에 맞힌 소수 건수가 뒤섞이면 평균은 실제 체감과 괴리될 수 있습니다.

따라서 60일동안의 BarsToHit값을 하나로 보여줄 것이 아니라

60일을 5일 또는 10일 단위로 분리해서 보는 형식으로 분포(Distribution)를 들여다보는 것이 해답입니다.

 

2. 60일 보유 전략을 보유 일자별로 분포 (Distribution) 하여 세부 데이터 확인

아래와 같이 분포 관련 코드를 작성해 볼 수 있을 것 같습니다.

def bars_to_hit_buckets(
        df: pd.DataFrame,
        period_key: str,
        exit_days: int,
        n_bucket: int = 10,
        hit_threshold: float = 0.05
) -> pd.DataFrame:
    # ① 목표가를 한 번이라도 맞힌 건만 사용
    # hits = df[(df['Period'] == period_key) & (df['MFE'] >= hit_threshold)].copy()
    # ⭐️ 새 코드
    hits = df[(df['Period'] == period_key) & (df['BarsToHit'].notna())].copy()
    if hits.empty:
        return pd.DataFrame()        # 해당 기간에 Hit 가 없으면 빈 DF 반환

    # ② 0~exit_days 를 동일 폭으로 n_bucket 분할
    bins = np.linspace(0, exit_days, n_bucket + 1)
    labels = [f"{int(bins[i])+1}~{int(bins[i+1])}" for i in range(n_bucket)]
    hits['Bucket'] = pd.cut(
        hits['BarsToHit'],
        bins=bins,
        labels=labels,
        include_lowest=True,
        right=True
    )

    # ③ 구간별 빈도·비율 계산
    summary = (
        hits.groupby('Bucket').size()
            .reindex(labels, fill_value=0)
            .rename('Count')
            .to_frame()
    )
    summary['Pct'] = (summary['Count'] / len(hits) * 100).round(2)
    return summary

 

이를 기반으로 나온 결과를 한 번 보도록 하겠습니다.

60일 보유 전략시의 분포

 

  1. 60 일 보유 전략이라면 1~6, 7~12, … 55~60 식으로 10 구간으로 분포시킵니다. (5일 기준이라면 12 구간이 적당하겠죠.)
  2. 표를 보면 “50 %는 6 봉 안에, 70 %는 12 봉 안에 목표 도달” 같은 실제 분포를 파악할 수 있습니다.
  3. MeanBarsToHit가 25라도, 중간값(Median)이 첫 구간에 존재하므로 “대부분은 6 봉 안에 목표가에 도달한다.”는 사실을 발견할 수 있죠.

 

3. 정리

아래의 표로 구분하여 정리를 해 보도록 하겠습니다.

전략 누적 빈도 계산 50 % 도달 Median BarsToHit 대략
20 일 청산 1~5 구간에서 이미 149,059 건 (전체 235 810 건의 63 %) ≤ 5 봉 (추정치 ≈ 3 ~ 4 봉)
60 일 청산 1~6 구간에서 156,638 건 (전체 280 490 건의 56 %) ≤ 6 봉 (추정치 ≈ 3 ~ 4 봉)
 

 

즉 “평균값(예: MeanBarsToHit값이 25 봉)이 길어 보여도,
절반 이상의 트레이드는 진입 후 한 주기(6 봉) 안에 목표가를 이미 터치한다”는 뜻입니다.

 

 

더 정밀한 값을 얻으려면 원본 BarsToHit 배열로 바로 median을 계산하거나, 첫 버킷을 다시 1 봉 단위(1, 2, 3 …)로 세분화해 누적 빈도를 잡으면 될 것 같지만 위의 내용만으로도 충분할 것 같습니다.

 

오늘 보유 기간에 따른 왜곡 통계 현상을 세분화하여 실제 데이터를 확인하는 방법에 대해 알아보았습니다.

이 글이 여러분들에게 조금이나마 도움이 되기를 기대해 봅니다.

 

감사합니다.


※ 해당 글은 크몽 서비스를 이용해 주신 고객님께 백테스팅 데이터를 설명드리는 문서로 활용하고자 작성된 글입니다. 참고 바랍니다.

 


 

주식 투자자들이 주식 시장에서 살아남기 위해서 자신만의 무기인 기법을 가지고 있는데요.
투자 기법이 없다 보니 실제로는 80% 이상의 투자자들이 매월 손실로 마감하는 악순환을 가진다는 것입니다.
 
악 순환에서 탈피해서 성공적인 투자를 하기 위해서는 제일 좋은 투자 확률을 가지는 지표로 백테스팅도 해야 할 것입니다.
 
확률을 체크도 해야 하고 특정 지표나 기법들을 자신만의 로직으로 담아서 테스트를 하고 싶으신 경우가 있으실 텐데요.
아래의 링크를 통해서 요청해 주세요.
원하시는 사항을 청취하고 그에 대해 요청하신 이상(가격대비 성능의 최대치)의 결과물을 받아 보실 수 있습니다.

 

한 방에 주식 데이터 만들기 - 크몽

인천고래 전문가의 IT·프로그래밍 서비스를 만나보세요. <p>퀀트 매매, 수익률 높은 매매, 확률 높은 매매, 잃지 않는 매매 등<...

kmong.com

 


아래의 글은 제가 작성한 글로

다른 보조지표에 대해서는 아래의 링크 글을 통해 자세히 알아 볼 수 있습니다.

 

보조지표 리스트 (추세, 모멘텀, 채널, 변동성, 거래량, 기타 지표)

안녕하세요. 주식을 통해 삶을 영위할 수 있는 방법을 찾으며  인생 후반을 준비하고 있는 인천고래입니다.이전부터 보조지표에 대해서 글을 작성해 왔지만 중요한 것 위주로 작성을 하다보니

i-whale.com


아래의 글은 제가 작성한 글로

단기적인 스윙 및 세력 매집 분석에 용이한 기준봉에 대해서는 아래의 링크 글을 통해 자세히 알아 볼 수 있습니다.

 

'주식 기준봉' 카테고리의 글 목록

주식 투자에 필요한 교육 내용을 제공하고 시장 정보 및 통계 등 수록하고 기록함을 원칙으로 하되 데이터마이닝을 통해 객관적인 자료를 구축하여 보다 경제적 자유를 얻기 위하여 사이트를

i-whale.com

 

반응형