본문으로 바로가기

채권 데이터는 구하기가 너무 어려워서, 크롤링이 필수인 자산 데이터 중 하나입니다.
아래는 금융투자협회의 채권정보센터 데이터를 Selenium을 활용하여 동적으로 크롤링하는 코드 일부입니다.

크롤링 -> 데이터 가공 및 처리의 과정을 소개하겠습니다.
전체 코드는 아래의 깃허브 링크에 올려두었으니 참고해주세요.

https://github.com/youjin00/Crawling 

 

GitHub - youjin00/Crawling: 데이터 수집을 위한 크롤링 코드들 입니다.

데이터 수집을 위한 크롤링 코드들 입니다. . Contribute to youjin00/Crawling development by creating an account on GitHub.

github.com

 


준비물

1. 필요한 라이브러리 설치

본 코드를 실행하기 위해서는 다음과 같은 라이브러리를 설치해야 합니다.

pip install selenium pandas

2. ChromeDriver 다운로드 및 설정

Selenium을 실행하기 위해서는 Chrome 브라우저와 ChromeDriver가 필요합니다. 아래 링크에서 본인의 Chrome 버전에 맞는 ChromeDriver를 다운로드한 후, 해당 파일의 경로를 설정해야 합니다.

코드 설명

1. 웹 드라이버 설정 및 웹페이지 로딩

먼저, ChromeDriver를 실행하고 한국금융투자협회 웹사이트를 엽니다.
금투협 채권 정보센터로 바로 연결되기 위해서는, 개발자 도구(f12)를 활용해서 html을 확인해야합니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

chrome_driver_path = "your path"
service = Service(chrome_driver_path)
options = Options()
options.add_argument("--no-sandbox")

# 웹 드라이버 실행
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://www.kofiabond.or.kr/...")  # KOFIA 웹사이트 URL

2. 데이터 크롤링을 위한 반복문 구현

특정 기간 동안 다양한 채권 유형과 만기별 데이터를 조회하여 저장하는 반복문을 작성합니다.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
import time
import pandas as pd

# 페이지 로딩 대기
wait = WebDriverWait(driver, 3)

# 조회 설정
start_year = 2014
end_year = 2025
bond_types = ["특수채", "회사채"]
periods = ["1년", "3년", "5년"]

data_list = []

try:
    for bond_type in bond_types:
        for period in periods:
            for year in range(start_year, end_year):
                start_date_str = f"{year}-01-31"
                end_date_str = f"{year+1}-01-31"

                # 시작일 입력
                start_date = wait.until(EC.presence_of_element_located((By.ID, "schStandardDt_input")))
                start_date.clear()
                start_date.send_keys(start_date_str)

                # 종료일 입력
                end_date = wait.until(EC.presence_of_element_located((By.ID, "schUstandardDt_input")))
                end_date.clear()
                end_date.send_keys(end_date_str)

                # 조회 버튼 클릭
                search_button = wait.until(EC.element_to_be_clickable((By.ID, "image2")))
                search_button.click()

                print(f"{start_date_str} ~ {end_date_str} 데이터 조회 중...")
                time.sleep(5)

                # 데이터 추출
                result_table = wait.until(EC.presence_of_element_located((By.ID, "grdMain")))
                rows = result_table.find_elements(By.TAG_NAME, "tr")

                for row in rows:
                    cols = row.find_elements(By.TAG_NAME, "td")
                    data_list.append([bond_type, period, start_date_str] + [col.text for col in cols])
except Exception as e:
    print("데이터 조회 실패:", e)

3. 데이터 저장 및 정리

수집한 데이터를 Pandas DataFrame으로 변환하고 CSV 파일로 저장합니다.

# 데이터프레임 변환 및 저장
df = pd.DataFrame(data_list)
filename = "bond_data.csv"
df.to_csv(filename, index=False, encoding="utf-8-sig")
print(f"데이터 저장 완료: {filename}")

불필요한 열을 제거하고, 데이터 정리 과정을 추가할 수 있습니다.

# 정리된 데이터 저장
new_columns = ["연월일", "국고 1년", "AAA", "AA+", "AA", "AA-", "A+", "A", "A-", "BBB+", "BBB", "BBB-"]
df.columns = new_columns
df.dropna(inplace=True)
df["연월일"] = pd.to_datetime(df["연월일"], errors="coerce")
df.sort_values("연월일", inplace=True)
df.to_csv("sorted_bond_data.csv", index=False, encoding="utf-8-sig")
print("정리된 데이터 저장 완료: sorted_bond_data.csv")

가공 후 데이터 예시

연월일 국고 1년 AAA AA+ AA AA- A+ A A- BBB+ BBB BBB-
2014.12.19 2.1 0.15 0.18 0.22 0.26 0.55 0.71 0.94 2.21 2.88 3.87
2014.12.31 2.07 0.14 0.17 0.21 0.25 0.54 0.70 0.92 2.19 2.87 3.85
2015.01.02 2.07 0.13 0.16 0.21 0.25 0.54 0.70 0.92 2.19 2.87 3.85

위 코드를 실행하면 2014년부터 2025년까지 다양한 채권 유형과 만기별 금리 데이터를 수집하여 CSV 파일로 저장할 수 있습니다.