반응형
네이버증권에서 종목 정보를 보다면 이런 메뉴가 눈에 들어옵니다.
"삼성전자"를 예시로... https://m.stock.naver.com/investmentInfo/domestic/005930 링크를 들어가보면,
"투자자, 평균 단가, 평균 수익률"을 볼 수 있습니다.
문득 평균 단가나 평균 수익률을 투자에 참고하면 좋겠다는 생각이 들었습니다.
python 스크립트를 아래와 같이 작성합니다.
결과물은 csv로 저장하여 엑셀에서 데이터 검토하고자 합니다.
import time
import csv
from multiprocessing import Pool, cpu_count, freeze_support
import pandas as pd
import requests
from bs4 import BeautifulSoup
import re # 정규 표현식 사용
def extract_number(text):
"""문자열에서 숫자만 추출 후 정수로 변환"""
numbers = re.sub(r"[^\d]", "", text) # 숫자가 아닌 문자 제거
return int(numbers) if numbers else 0 # 변환 후 반환 (비어있으면 0 반환)
# 한국거래소에서 종목 코드 받아오기
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13')[0]
code_df.종목코드 = code_df.종목코드.map('{:06d}'.format) # 6자리 코드 맞추기
code_df = code_df[['회사명', '종목코드']] # 필요한 컬럼만 선택
stock_list = code_df.values.tolist() # 리스트 변환
def investor_info(stock):
time.sleep(1)
url = f'https://m.stock.naver.com/investmentInfo/domestic/{stock[1]}'
page_url = f"https://finance.naver.com/item/main.naver?code={stock[1]}"
#로봇으로 감지 못하도록 추가 했지만... 효과는 잘 모르겠습니다!
headers = {
"User-Agent": "Mozilla/5.0"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 응답 코드 확인 (200이 아니면 예외 발생)
soup = BeautifulSoup(response.text, 'html.parser')
# "Floor_text__TKfxc" 클래스를 가진 strong 태그 가져오기
strong_tags = soup.find_all("strong", class_="Floor_text__TKfxc")
# 최소 3개 이상 데이터가 있어야 함
if len(strong_tags) >= 3:
return [
stock[0], # 종목명
stock[1], # 종목 코드
extract_number(strong_tags[0].text.strip()), # 총 투자자 (정수 변환)
extract_number(strong_tags[1].text.strip()), # 평균 단가 (정수 변환)
strong_tags[2].text.strip(), # 평균 수익률
page_url # 종목 링크
]
else:
print(f"[데이터 부족] {stock[0]} ({stock[1]})")
return None # 데이터 부족 시 None 반환
except requests.exceptions.RequestException as e:
print(f"[요청 오류] {stock[0]} ({stock[1]}): {e}")
return None # 요청 실패 시 None 반환
if __name__ == "__main__":
freeze_support() # PyInstaller 용
# 투자자 정보를 담을 리스트
investor_info_list = []
# 병렬 처리
with Pool(cpu_count()) as pool:
results = pool.map(investor_info, stock_list)
# None 값 필터링 (실패한 종목 제거)
investor_info_list = [res for res in results if res]
# CSV 파일로 저장
with open("investor_info.csv", mode="w", newline="", encoding="ANSI") as file:
writer = csv.writer(file)
writer.writerow(["종목명", "종목 코드", "총 투자자(수)", "평균 단가(원)", "평균 수익률", "종목 링크 (네이버)"]) # 헤더 추가
writer.writerows(investor_info_list) # 데이터 추가
print("CSV 저장 완료!")
csv 저장 결과를 열어봅니다. 열고나서 "총 투자자(수)" 정보를 내림차순 했습니다.
투자자수를 보자마자 역시 국장은 "삼성전자"라는 생각과 함께...
몇만명의 사람들이 20~50% 이상의 손해를 보고 있다는 점이 많이 놀라웠습니다. 😢
평균 단가의 계산 방식이 전체 보유 수량 단가를 반영한 것인지 모르겠습니다만...
투자자 개개인으로 보면 적은 금액이던, 큰 금액이던 수익률이 형평 없는 것으로 보여 씁쓸합니다.
아무쪼록 국장도 다시 살아나서 많은 분들이 원금도 회복하고 돈도 많이 벌 수 있는 상황이 오길 기대합니다.
반응형
'Python > 네이버증권API(New)' 카테고리의 다른 글
[네이버증권] 25년3월9일부터 "몇 층에서 샀을까?" 데이터 수집 그리고 조회 페이지 배포 (0) | 2025.03.19 |
---|---|
[Python/파이썬] 네이버증권API 활용 - 미국 주식 고배당주 찾기 (1) | 2024.12.08 |
[Python/파이썬] 네이버증권API 활용 - 미국 주식 종목 정보 가져오기 (0) | 2024.12.02 |
[Python/파이썬] 네이버증권API 활용 - 미국 주식 전체 종목 정보 가져오기 (7) | 2024.07.07 |
[Python/파이썬] 네이버증권API 활용 - json에서 값 찾기 (4) | 2024.03.18 |