데이터 기반 주식 종목 선정 과정

주식 투자에서 좋은 종목을 선정하는 것은 성공적인 투자를 위한 가장 중요한 첫 단계입니다. 오늘은 알고리즘 트레이딩에서 활용하는 ‘고빈도 스캐닝 전략(High Frequency Scanning Strategy)’을 통한 체계적인 종목 선정 과정을 소개합니다.

종목 선정의 중요성

누구나 잘 아는 대형주 몇 개만 거래한다면 손쉽게 종목을 고를 수 있겠지만, 시장의 모든 기회를 활용하려면 더 넓은 시야가 필요합니다. 코스피와 코스닥 시장에는 수천 개의 종목이 있고, 이 중에서 유망한 종목을 선별하는 것은 쉽지 않은 작업입니다.

고빈도 스캐닝 전략은 이러한 문제를 해결하기 위해 다음과 같은 접근법을 사용합니다:

  1. 대상 종목의 효율적 선별
  2. 다단계 필터링을 통한 후보 축소
  3. 다양한 기술적 지표의 종합 평가
  4. 점수 기반 객관적 의사결정

이제 이 과정을 단계별로 살펴보겠습니다.

1. 시장 전체 종목 조회

첫 단계는 거래 대상이 될 수 있는 전체 시장의 종목 목록을 가져오는 것입니다.

# 코스피 시장 종목 조회
all_stocks = get_market_stocks('J')  # J: 코스피

# 캐싱으로 효율성 증대
if cached_stocks_available and less_than_one_day_old:
    all_stocks = use_cached_stocks()

이 단계에서는:

  • API를 통해 코스피(또는 코스닥) 시장의 모든 종목을 조회합니다
  • 시가총액 순으로 정렬하여 상위 종목부터 우선 처리합니다
  • 캐싱 메커니즘을 적용하여 반복적인 API 호출을 줄입니다

2. 시간대별 스캐닝 전략

모든 종목을 동일하게 분석하는 것보다 시간대에 따라 스캔 전략을 차별화하면 효율성을 높일 수 있습니다.

# 시간대별 스캔 범위 조절
if (장_초반 or 장_후반):
    # 장 초반/후반에는 더 많은 종목 스캔
    target_stocks = all_stocks[:300]  # 상위 300개 종목
else:
    # 일반 시간대에는 상위 종목만 스캔
    target_stocks = all_stocks[:100]  # 상위 100개 종목

이런 접근법의 이유는:

  • 장 초반(9:00-9:30): 가격 발견 과정이 활발하여 더 많은 종목에서 기회가 발생
  • 장 후반(14:30 이후): 마감 전 포지션 조정으로 인한 거래 기회 증가
  • 일반 시간대: 대형 종목 위주로 거래가 활발하게 이루어짐

3. 1차 필터링: 빠른 스캐닝

대상 종목이 정해지면 기본적인 지표를 활용한 1차 필터링을 수행합니다.

candidates = []
for stock_code in target_stocks:
    # 현재가 데이터 조회
    data = get_stock_current_price(stock_code)
    
    # 가격 변동과 거래량 체크
    price_change = get_price_change_percentage(data)
    volume_ratio = get_volume_ratio(data)
    
    # 기본 점수 계산 (0-6점)
    base_score = 0
    
    # 가격 변동 점수 (최대 3점)
    if price_change > 0.03:  # 3% 이상 상승
        base_score += 3
    elif price_change > 0.01:  # 1% 이상 상승
        base_score += 2
    elif price_change > 0:  # 상승 중
        base_score += 1
    
    # 거래량 점수 (최대 3점)
    if volume_ratio > 3:  # 평균 대비 300%
        base_score += 3
    elif volume_ratio > 2:  # 평균 대비 200%
        base_score += 2
    elif volume_ratio > 1:  # 평균 대비 100%
        base_score += 1
    
    # 4점 이상인 종목만 후보로 선정
    if base_score >= 4:
        candidates.append((stock_code, base_score))

이 단계에서는:

  • 가격 상승 여부와 상승폭을 확인
  • 거래량 증가 비율 확인
  • 두 지표를 종합한 기본 점수 계산
  • 임계값(4점) 이상인 종목만 1차 후보로 선정

4. 상세 분석: 기술적 지표 종합 평가

1차 필터링을 통과한 종목들에 대해 더 상세한 기술적 분석을 수행합니다.

final_candidates = []
for stock_code, base_score in candidates:
    # 일봉 데이터
    df = get_stock_daily_price(stock_code)
    
    # 분봉 데이터 (최근 30분)
    intraday_df = get_intraday_data(stock_code)
    
    # 점수 초기화 (기본 점수 반영)
    score = base_score
    
    # 1. 이동평균선 분석
    if 골든크로스_발생:
        score += 2
    if 단기선이_중기선_위에_있음:
        score += 0.5
    
    # 2. 볼린저 밴드 분석
    if 현재가가_밴드_하단_근처:
        score += 1.5
    elif 현재가가_밴드_상단_돌파:
        score += 1
    
    # 3. RSI 분석
    if 30 <= RSI값 <= 50:  # 과매도 탈출 구간
        score += 1.5
    elif 50 <= RSI값 <= 70:  # 상승 구간
        score += 1
    
    # 4. 거래량 급증 체크
    if 거래량_비율 > 2:  # 평균 대비 2배
        score += 2
    elif 거래량_비율 > 1.5:  # 평균 대비 1.5배
        score += 1
    
    # 5. 분봉 데이터 기반 상승 강도
    상승봉_비율 = 상승봉_수 / 전체_봉_수
    score += 상승봉_비율 * 2  # 최대 2점
    
    # 최종 점수 계산 (최대 10점)
    final_score = min(10, score)
    
    # 임계값(5.0) 이상인 종목만 최종 후보로 선정
    if final_score >= 5.0:
        final_candidates.append((stock_code, final_score))

이 단계에서 평가하는 지표들:

이동평균선(Moving Average)

  • 골든크로스: 단기 이동평균선(5일)이 장기 이동평균선(20일)을 상향 돌파
  • 추세 확인: 단기선이 중기선 위에 위치하는지 확인

볼린저 밴드(Bollinger Bands)

  • 밴드 하단 지지: 현재가가 하단 밴드 근처에서 반등하는 경우 (저점 매수 기회)
  • 밴드 상단 돌파: 강한 상승 추세 확인

RSI(Relative Strength Index)

  • 과매도 탈출: RSI가 30-50 구간에 있을 때 (반등 가능성 높음)
  • 상승 구간: RSI가 50-70 구간에 있을 때 (상승 추세 지속 가능성)

거래량 분석

  • 거래량 급증: 최근 5일 평균 대비 거래량 증가 비율
  • 거래량 지속성: 거래량 증가 추세 확인

분봉 데이터 분석

  • 상승 강도: 최근 분봉에서 상승봉의 비율
  • 모멘텀 확인: 단기적 가격 움직임의 방향성과 강도

5. 최종 후보 선정

상세 분석을 통해 계산된 점수를 바탕으로 최종 매매 후보를 선정합니다.

# 점수순 정렬
final_candidates.sort(key=lambda x: x[1], reverse=True)

# 최종 선정 종목 출력
for idx, (code, score) in enumerate(final_candidates):
    print(f"{idx+1}. {code}: {score:.1f}/10점")

최종 후보 선정 기준:

  • 종합 점수가 임계값(5.0) 이상인 종목만 선정
  • 점수 기준으로 내림차순 정렬하여 우선순위 부여
  • 실제 매수는 보유 종목 수, 자금 상황 등 추가 제약을 고려하여 결정

종목 선정 전략의 장단점

장점

  • 체계적 접근: 주관적 판단 대신 데이터 기반 의사결정
  • 포괄적 평가: 단일 지표가 아닌 여러 지표 종합 평가
  • 효율성: 수천 개 종목에서 유망 종목을 빠르게 선별
  • 객관성: 점수 기반 시스템으로 일관된 기준 적용
  • 자동화 가능: 알고리즘으로 구현하여 자동 실행 가능

단점

  • 과거 패턴 의존: 기술적 지표는 과거 데이터 기반
  • 시장 상황 민감성: 시장 환경에 따라 성능 차이 발생
  • 과적합 위험: 너무 많은 지표 사용 시 노이즈 증가 가능
  • 개별 이슈 반영 한계: 종목별 특수 상황 반영 어려움
  • 파라미터 튜닝: 임계값 설정에 따라 결과 크게 달라질 수 있음

결론

고빈도 스캐닝 전략을 활용한 종목 선정 과정은 방대한 시장 데이터에서 투자 가치가 높은 종목을 체계적으로 선별하는 효과적인 방법입니다. 이 접근법은 빠른 스캐닝과 상세 분석을 단계적으로 적용함으로써, 효율성과 정확성을 모두 추구합니다.

다단계 필터링 과정을 통해 수백 개의 종목 중에서 최종적으로 5개 내외의 우량 매매 대상을 선별해내고, 점수 기반 시스템으로 우선순위를 부여함으로써 보다 객관적이고 일관된 매매 결정이 가능해집니다.

(하지만, 아직 거래를 진행해 본적이 없네요. 다음에는 로직을 좀 더 다음는 과정 및 매매, 매수 과정을 다루겠습니다.)