본문 바로가기
파이썬으로 종목 스크리너 만들기

뇌동매매 금지 - 8. 상장종목 스크리닝 해보기

by 유티끌 2022. 9. 12.

그동안 만들었던 것들을 조합하여 스크리닝해보겠습니다.


main.py

프로젝트 최상단에 main.py 를 하나 만들어서 실행 준비합니다.
main.py 에서는 실행시간을 확인하기 위해 간단한 프린트문도 준비해봅니다.

전체 종목 획득 및 소형주의 재무공시 정보 조회

import datetime
import time

import filter_data
from extract_data.extract import Extract
from export_data import ExportToData


start = time.time()

extractor = Extract()
exporter = ExportToData()
kospi_kosdaq_data = extractor.get_data()

print("--------------")
extracted_data = extractor.extract_finance_data(
    [2020, 2021, 2022],
    filter_data.filtering_data_that_market_cap_under_thirty_percent(
        kospi_kosdaq_data
    ))

extract_finance_data 에 최근 3개년의 정수를 배열로 넘겨주고, pykrx를 이용하여 불러온 코스피 코스닥 종목들에서 다시 시가총액 하위 30%의 소형주만으로 필터링하여 재무제표를 뽑아봅니다.

엑셀파일로 저장

exporter.export_to_excel_with_many_sheets(
    "/YOUR/DIRECTORY/PATH/{file_name}.xlsx",
    [
        filter_data.filtering_low_per("ALL_DATA_저PER", kospi_kosdaq_data.copy()),
        filter_data.filtering_low_per("소형주_저PER", extracted_data.copy()),
        filter_data.filtering_low_pbr_and_per("ALL_DATA_저PBR_저PER", 1.0, 10, kospi_kosdaq_data.copy(), True),
        filter_data.filtering_low_pbr_and_per("소형주_저PBR_저PER", 1.0, 10, extracted_data.copy()),
        filter_data.filtering_high_div("고배당률_리스트", kospi_kosdaq_data.copy()),
        filter_data.filtering_high_propensity_to_dividend("소형주 고배당성향", extracted_data.copy()),
        filter_data.filtering_low_pfcr("소형주_저PFCR_시총잉여현금흐름", extracted_data.copy()),
        filter_data.filtering_low_pbr_and_high_gpa("소형주_저PBR_고GPA", 0.8, extracted_data.copy()),
        filter_data.filtering_high_ncav_cap_and_gpa("소형주_고NCAV_GPA_저부채비율", extracted_data.copy()),
        filter_data.filtering_profit_momentum("소형주_모멘텀_전분기대비_영업이익순이익_전략", extracted_data.copy()),
        filter_data.filtering_value_and_profit_momentum("소형주_밸류모멘텀_전략", extracted_data.copy()),
        filter_data.filtering_value_factor("소형주_HIGH_SCORE_Four_value", extracted_data.copy()),
        filter_data.filtering_value_factor_upgrade("소형주_강환국_슈퍼가치전략_업글", extracted_data.copy()),
        filter_data.filtering_new_F_score_and_low_pbr("소형주_NEW F Score and Low PBR", extracted_data.copy()),

        ("Extracted_RAW_Data", extracted_data),
        ("RAW_Data", kospi_kosdaq_data)
    ]
)

엑셀파일로 만들어서 내보내기를 실행할 exporter 변수의 export_to_excel_with_many_sheet 를 실행해줍니다.

필터 조건에 따라, 일부는 전체종목과 소형주를 각각 실행시켜 필터링합니다.
이때 튜플의 형태로 입력을 하고 있는데,

  • 0번째 인덱스에는 파일의 데이터가 담길 sheet의 이름,
  • 1번째에는 해당 파일 데이터의 copy를 넘깁니다.

copy를 넘기지 않으면 원본파일이 변할 수 있습니다.

엑셀파일의 맨 마지막에는 추출한 RAW 정보들을 첨부해줍니다.

최종 처리시간 기재

마지막에는 시간계산을 해주고 정보 추출 및 계산, 엑셀파일 생성까지 걸린 최종 시간을 프린트문으로 출력합니다.

end = time.time()
sec = (end - start)

result_list = str(datetime.timedelta(seconds=sec)).split(".")
print(f"Total extracting time : {result_list[0]} ---------------------")

main.py 의 전문은 아래와 같습니다.

import datetime
import time

import filter_data
from extract_data.extract import Extract
from export_data import ExportToData


start = time.time()
extractor = Extract()
exporter = ExportToData()
kospi_kosdaq_data = extractor.get_data()

print("--------------")
extracted_data = extractor.extract_finance_data(
    [2020, 2021, 2022],
    filter_data.filtering_data_that_market_cap_under_thirty_percent(
        kospi_kosdaq_data
    ))

exporter.export_to_excel_with_many_sheets(
    "/YOUR/DIRECTORY/PATH/{file_name}.xlsx",
    [
        filter_data.filtering_low_per("ALL_DATA_저PER", kospi_kosdaq_data.copy()),
        filter_data.filtering_low_per("소형주_저PER", extracted_data.copy()),
        filter_data.filtering_low_pbr_and_per("ALL_DATA_저PBR_저PER", 1.0, 10, kospi_kosdaq_data.copy(), True),
        filter_data.filtering_low_pbr_and_per("소형주_저PBR_저PER", 1.0, 10, extracted_data.copy()),
        filter_data.filtering_high_div("고배당률_리스트", kospi_kosdaq_data.copy()),
        filter_data.filtering_high_propensity_to_dividend("소형주 고배당성향", extracted_data.copy()),
        filter_data.filtering_low_pfcr("소형주_저PFCR_시총잉여현금흐름", extracted_data.copy()),
        filter_data.filtering_low_pbr_and_high_gpa("소형주_저PBR_고GPA", 0.8, extracted_data.copy()),
        filter_data.filtering_high_ncav_cap_and_gpa("소형주_고NCAV_GPA_저부채비율", extracted_data.copy()),
        filter_data.filtering_profit_momentum("소형주_모멘텀_전분기대비_영업이익순이익_전략", extracted_data.copy()),
        filter_data.filtering_value_and_profit_momentum("소형주_밸류모멘텀_전략", extracted_data.copy()),
        filter_data.filtering_value_factor("소형주_HIGH_SCORE_Four_value", extracted_data.copy()),
        filter_data.filtering_value_factor_upgrade("소형주_강환국_슈퍼가치전략_업글", extracted_data.copy()),
        filter_data.filtering_new_F_score_and_low_pbr("소형주_NEW F Score and Low PBR", extracted_data.copy()),

        ("Extracted_RAW_Data", extracted_data),
        ("RAW_Data", kospi_kosdaq_data)
    ]
)

end = time.time()
sec = (end - start)

result_list = str(datetime.timedelta(seconds=sec)).split(".")
print(f"Total extracting time : {result_list[0]} ---------------------")

추출 결과

약 45분정도가 걸려 570여개의 종목을 추출하고, 스크리닝하였습니다.

엑셀 파일을 보니 각각의 필터대로 스크리닝 된 데이터들을 확인할 수 있습니다.

약간의 이슈

필터에서 약간의 Warning log를 확인하고 있습니다. 원본 이미지가 변형될 수 있으니 다른 방법으로 조건을 걸으라는 내용인 것 같은데, 데이터를 확인해보니 손상이 오거나 데이터 결손이 생긴 것 같지는 않아서 이것은 시간을 가지고 천천히 대응해보고자 합니다.


다음 포스트에서는 이 시리즈의 후기를 기재해봅니다.

반응형

댓글