프로젝트

주식 적립식 투자앱 만들기 - 4

FinanceDataReader

 

FinanceDataReader 사용자 안내서

FinanceDataReader 사용자 안내서

financedata.github.io

 

pandas datareader를 보완한 파이썬 패키지. 여기엔 종목코드를 가져오는 기능이 있어서 사용했다

정말 손쉽게 코스피, 코스닥, 뉴욕거래소, 나스닥 종목 전체를 가져올 수 있다. 

 

코스피의 경우 이렇게 데이터를 받았다.

{
    "Symbol": "095570",
    "Market": "KOSPI",
    "Name": "AJ\ub124\ud2b8\uc6cd\uc2a4",
    "Sector": "\uc0b0\uc5c5\uc6a9 \uae30\uacc4 \ubc0f \uc7a5\ube44 \uc784\ub300\uc5c5",
    "Industry": "\ub80c\ud0c8(\ud30c\ub81b\ud2b8, OA\uc7a5\ube44, \uac74\uc124\uc7a5\ube44)",
    "ListingDate": 1440115200000,
    "SettleMonth": "12\uc6d4",
    "Representative": "\uc774\ud604\uc6b0",
    "HomePage": "http://www.ajnet.co.kr",
    "Region": "\uc11c\uc6b8\ud2b9\ubcc4\uc2dc"
  }

symbol, name 빼고는 필요없는 내용이라 삭제하고 유니코드화 된 건 json.dump에 ensure_ascii=False 옵션을 주니 해결됨. 파이썬은 참 어려운것 같다.

 

KOSPI.json
0.06MB

대충 이렇게 파싱이 됨. 이 파일은 주가 크롤링에 심볼 참조할 때도 쓰고 앱의 프론트엔드단에 넣어서 리스트 불러오는데도 쓸 것임.

코인쪽은 몇개 안되니 그냥 손으로 입력해야겠다.

 

다음은 각각의 개별 주식들 과거 주가정보를 가져와서 db에 저장하자.

 

db 연결하기

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['stock_app']
collection = db['stock']

stock 콜렉션 하나에 모든 데이터를 때려박을 생각이다.

 

파이썬의 몽고디비는 node에서 쓸때와 다르게 스키마를 미리 설정하지 않아도 입력이 되었다.

 

with open('./List/KOSPI.json') as json_file:
    KOSPI = json.load(json_file)
with open('./List/KOSDAQ.json') as json_file:
    KOSDAQ = json.load(json_file)
with open('./List/NYSE.json') as json_file:
    NYSE = json.load(json_file)
with open('./List/NASDAQ.json') as json_file:
    NASDAQ = json.load(json_file)

for market in [KOSPI, KOSDAQ, NYSE, NASDAQ]:
    for stock in market:
        try:
            symbol = stock['symbol']
            if(stock['market'] == 'KOSPI'):
                symbol += '.KS'
            if(stock['market'] == 'KOSDAQ'):
                symbol += '.KQ'
            print(stock['name'], '/', stock['symbol'], '/', symbol)
            df = pdr.DataReader(symbol, 'yahoo', '1900-01-01')
            parsed = json.loads(df.to_json(orient="index"))
            for ms in parsed:
                date = datetime.fromtimestamp(int(ms)/1000)
                exist = collection.find_one(
                    {'symbol': stock['symbol'], 'date': date})
                if not exist:
                    collection.insert_one({'symbol': stock['symbol'], 'date': date,
                                           'close': parsed[ms]['Close'], 'AdjClose': parsed[ms]['Adj Close']})
        except:
            print('error : ', stock['name'])
            continue

미리 저장해둔 주식 종목들을 순회하면서 개별 주식 주가를 db에 저장했다.

 

 

아직 진행중인데 이렇게 저장이된다. 이게 속도가 상당히 느려서 이거 다 가져오려면 하루 종일 걸릴 것 같다.

내 컴퓨터로 다 하긴 무리고, 프로덕트할때 쓸 벌쳐 서버에다 코드 올려서 데이터 크롤링하게 해둬야겠다.

 

=> vultr 서버에 크롤링 돌려놓고 자러갔는데 100개도 못하고 cpu 100프로 찍히고 멈춰있더라구요

그냥 도큐먼트 하나당 종목하나로 하고 주가 정보는 객체 속성에다 다 넣는걸로 수정했습니다.