brunch

You can make anything
by writing

C.S.Lewis

by Moai Oct 03. 2020

Python 주식 종목 찾기

나만의 알고리즘으로 부자가 되자

최근 카카오tv, 유튜브, 최근에 나온 Python에 관한 책들까지 많은 곳에서 주식을 추천하고 있다.



주식 거래 개발에 대한 책들과 영상자료는 이미 많이 공개되었기 때문에 이 부분은 다루지않고 지금까지 배운 모든 내용을 총 동원해서 나의 알고리즘으로 종목을 찾는 프로그램을 개발해보자


개발에 앞서 다뤄야할 내용이 있다.


파이썬에서 웹에 있는 데이터를 불러오는 방법과 컴퓨터에 있는 파일을 읽는 방법에 대해 공부해보자

python2.7버전에서는 urllib2를 사용했지만 python3 버전부터는 requests 모듈을 이용한다.


웹에 있는 데이터를 읽기 위해선 http 프로토콜을 사용하는데 우리는 이 프로토콜을 이용해 데이터를 읽거나 생성하거나 수정하거나 삭제할 수 있다. 이 부분에 대해선 다음에 깊게 다루도록 하자.


requests.get(웹페이지 주소, 요청할 때 필요한 정보들...)로 데이터를 읽을 수 있다.

요청할 때 필요한 정보는 무엇이 있을까?


우선 파라미터에 대해 알아보자! 개발자도구를 실행하고 daum에서 카카오를 검색한 다음에 주식 정보를 조회해보자

다음과 같이 웹 서버에 데이터를 요청할 때

"웹 주소?키=값&키=값"

이런식으로 데이터를 요청한다.

page와 perPage는 데이터가 많다보니 페이지네이션 기법을 이용해 데이터를 일부만 가져오는 방법인데 화면에 보여지는 데이터 외에 더 많은 데이터를 요청할 때 수정해서 보내면 된다. 가장 중요하면 키는 symbolCode이다. 주식종목마다 고유의 키가 존재하는데 이 값에 따라 화면 보여지는 데이터가 바뀌게 된다.


헤더는 웹 서버에 데이터를 요청할 때 서버에 추가적인 정보를 전달할 때 사용한다. 예를들어 쿠키, 브라우저 정보, 어느 페이지에서 이동 또는 요청했는지에 대한 정보가 있을 수 있다. 브라우저가 알아서 해주기 때문에 우리는 이 정보가 전달되는지 몰랐을 것이다.하지만 파이썬코드로 요청할 경우에는 수동을 헤더정보를 입력해줘야 한다. 만약 입력을 안 할 시 서버에서 거부할 수 있다.




파일 읽기


파일을 읽는 기본적인 방법은 open 함수를 이용하는 것이다.

open(파일 경로, 기타 옵션들) 함수를 이용하면 되는데 문제가 있다. 파이썬에서 파일을 읽기 위해 열었으면 닫아야 한다. 안 그러면 컴퓨터는 사용자가 파일을 수정하더라도 수정된 내용을 읽을 수 없거나 수정한지 알 수 없을 것이다. close 함수를 이용해 닫을 수 있지만 파일을 열 때부터 알아서 닫아주는 with를 이용해보자.

 

f = open('파일경로', 'r')

line = f.readline()

print(line)

f.close()


대신 아래처럼 표현하자

with open(파일경로, 'r') as f:

    line = f.readline()

    print(line)


여기서 'r'은 파일을 읽기위해 열겠다는 의미이다. 여기에서는 안 쓰였지만 'w'는 생성, 수정 시 덮어씀, 'a'는 수정 시 기존 내용에 추가를 의미한다.




Class


클래스는 깊게 간단해보이지만 깊게 이해할수록 어렵다. 몇년은 프로그램을 개발해야 객체지향프로그래밍이 무엇인지 이해할 수 있을 것이다. 따라서 오늘부터 class를 조금씩 설명해보려고 한다.

오늘 배울 class의 개념은 추상화이다.

우리는 이전에 함수를 배웠다. 함수의 사용하는 이유는 반복되는 프로그래밍을 피하고 모듈화를 하면 가독성이 좋아진다. 그리고 기능 변경 시 손쉽게 유지보수 할 수 있다.

하지만 함수가 모든 것을 충족시켜주지는 못한다.


포켓몬 게임을 해보았는가? 게임을 해보지 않았더라도 게임은 비슷하므로 자기가 하고 있는 게임을 생각하면서 이해하길 바란다.

사용자는 로그인, 또는 세이브된 파일을 불러와서 게임을 시작할 것이다.

접속할 수 있는 사용자가 한명이라면 함수를 통해 구현하는데 문제가 없다. 하지만 여러 사용자가 동시에 접속한다면 어떻게 사용자를 관리할 것인가? 세이브 파일을 읽은 뒤 게임정보를 불러와서 게임을 진행해야 한다. 두명의 사용자를 잘못 관리해서 잡은 포켓몬이 바뀐다면 어떤일이 발생할까?

포켓몬들은 공통적으로 체력과 레벨이란 정보가 있고 기술4개를 사용할 수 있다. 생김새와 이름만 정해주면 된다. 하지만 피카츄는 여러마리가 될 수 있다. 공통적인 것들을 다르게 관리해야한다. 어떻게 해야할까?

클래스라는 것을 이용해 게임정보를 저장하고 불러올 수 있는 기능을 묶은 뒤 사용자마다 메모리공간을 하나씩 만들자. 포켓몬마다 공통적인 기능을 묶은 뒤 잡은 포켓몬마다 메모리공간을 따로 만들자.

체력과 레벨과 같은 기본 변수정보는 __init__함수를 통해 초기화 설정할 수 있다.

포켓몬 정보를 관리하는 클래스를 만들어보자



p = PocketmonUser('jiwoo')#

p.set_position(14, 52)

p.add_item('몬스터볼', 10)


p.add_pocketmon(Pocketmon('피카츄', 21, 1))

p.add_pocketmon(Pocketmon('파이리', 14, 2))

p.add_pocketmon(Pocketmon('라이츄', 24, 3))


이런식으로 잡은 포켓몬스터에 대한 정보를 관리하는 객체를 생성할 수 있다.

각 잡은 몬스터들은 하나의 객체가 된다.

그리고 객체들은 클래스에 포함된 함수들을 사용할 수 있다.


이렇게 공통된 사항으로 변수와 함수를 묶는 것을 추상화라고 한다.





주식 코드, 종목 이름 가져오기


https://kind.krx.co.kr/corpgeneral/corpList.do?method=loadInitPage

에서 엑셀로 저장 후 파이썬에서 데이터를 읽을 수 있도록 가공한다. pandas를 이용하면 되지만 아직 배우지 않았으므로 수동으로 수정해주자. 아래 파일은 json형태로 수정한 데이터이다. (2020년 10월 03일 버전)



주식 정보를 가져온 뒤 각 주식에 대한 최근 정보를 가지고 있는 클래스를 만들어보자.

try, except는 나중에 설명하도록 하겠다.

그리고 나만의 알고리즘으로 좋은 주식 종목을 찾아보자.

나는 간단하게 최근에 급등 후 조정을 받는 주식을 찾는 코드를 구현해보았다.


이후 종목 코드를 모두 읽어서 알고리즘에 해당하는 종목을 찾아보자

위 코드를 구현하려면 다음의 3가지 모듈을 사용해야한다.


import requests

import json

import time


매거진의 이전글 Python 업/다운 게임
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari