주식 데이터를 모으기 위한 Mariadb 데이터베이스 설계

궁극적인 목표는 주식 자동 거래 시스템을 만드는 것인데, 우선 주식 데이터를 수집하는 것부터 해보고 이번 기회에 딥 러닝도 공부해보기로~! 아무튼 먼저 MariaDB를 사용해서 기초 데이터베이스를 나름대로 설계해봤습니다.

大体ERD(Entity Relationship Diagram)です。각 엔티티의 관계도를 나타내는 그림입니다.아직 완성된 건 아니고 몇 개의 테이블이 필요해요.

create table code(code char(3)comment’어코드명’, name varchar(20)comment’드명코드’, comment varchar(50)comment’설어용’, PRIMARY KEY(code, name, comment)comment’피류분코켓류마닥스’;무시를 코드(code, master, market’,’,’코스분등용코/’코’/류),’분켓’,’,’,’,””드운사용”’);create table code_slv(code int comment”’드드코”, p_code char(3)not null comment”’모명명짜”’, name varchar(10)comment”’어설어날성”’, create_atetime NOT NULL now(), update_at timestamp now()comment’정보 업이트 시일’, 외부 키(p_code)참조 코드(code), 프라이머리 키(코드)코멘트”’종속”’;code_slv(코드, p_code이름, 주장치(0,”’C01”’,”코스피”,”한국 종합 주가 지수”'(10,”C01”,’코스닥”,”·’·’·’·’·’·’·’·’·’·’·’·’·’·’·’·’·’·”·”·”·”·”·”·”·”·”·”·”·”·”·”·”·”‘C02′,’뮤추얼펀드’,’투자자에게 주식을 발행하는 방법으로 자금을 모아 주식·채권·부동산 등에 투자하여 투자자들에게 배당금의 형태로 수익을 분배하는 일종의 신탁 회사’),(5,’C02′,’신주인수권’,’신주인수권(preemptive right)은 회사가 신주를 발행할 경우에 그 전부 또는 일부를 타인에 우선하여 인수할 수 있는 권리’),(6,’C02′,’리츠’,’부동산 투자 신탁, 다수의 투자자로부터 자금을 모아 부동산, 부동산 관련 증권 등에 투자·운영하고 그 수익을 투자자에게 돌려주는 부동산 간접투자기구인 주식회사’),(8,’C02′,’ETF’,’ETF(Exchanged Traded Fund)는 특정 지수의 성과를 추적하는 인덱스 펀드를 거래소에 상장시켜 주식처럼 거래할 수 있게 한 펀드’),(9,’C02′,’하이일드펀드’,’하이일드(High yield)는 높은 수익률을 의미하는데 고수익 고위험 채권이 편입된 펀드’);

market, ticker에 대한 코드값은 키움증권 API에서 그대로 사용하고자 코드값을 동일하게 정의하였습니다.나중에 다른 코드가 필요하게 되면 적절한 규칙을 만들어서 코드 추가를..

용어코드 넣어서 조회해볼게요.

CREATE TABLE IF NOT EXISTS stock(idint AUTO_INCREMENT코멘트’pk’, code varchar(10)코멘트”’코드명형목”, null코멘트”’목유목”’이 아닌 이름 varchar(30), market varchar(6)코멘트””’종티커종종형(코스피, 코스닥)”’, ticker_cdint코멘트””””””””’ID’, timestamp timestamp default now()on update now(), status tinyint(1)default 1 comment’1:정상/0:폐지장상’, primary key(id), unique(code)foreign key(ticker_cd)referencode_slv(code), constraint check(‘KOSPI’, KOSDAQ’), 시장에서의 제약 체크(0,에서의 스테이터스, 1)1)comment’주식종목정보’;

다음은 주식 종목에 대한 테이블입니다. KOSPI/KOSDAQ시장을 구분하여 ticker을 붙였습니다.종목 코드가…이래봬도 대부분의 길이가 6이지만 몇몇의 길이가 9이상이 된 종목 코드도 있었지.. VARCHAR(10)에 두었습니다. 작은 규모의 데이터이므로 기본 키를 varchar에 둘 수 있지만, daily_price와 조인을 걸때의 속도를 생각하면 int로 가야 한다고 판단했습니다.

daily_price테이블을 작성 또는 치환합니다(idint AUTO_INCREMENT코멘트’pk’, stock_idint코멘트’pk’)ID’, date comment’짜가’, open int comment’초가’, high int comment’고저’, low int comment’가량’, close int comment’결량’, volume int comment’래거가’, primary key(id), UNIQUE(stock_id, date), foreign key(stock_id)references stock(id)comment”종목짜별가격”;

종목에 대한 주가 가격의 테이블입니다. 이 프로젝트에서 최대 크기를 차지할 테이블입니다. 키움 증권 API에서 전 종목의 데이터를 19XX년도부터 현재까지 모두 넣는다고 가정하면 약 5천 만건?정도라고 생각하지만 그 정도면 PK에 BIGINT까지는 필요 없고, INT에서 충분하다고 생각합니다. 한 종목에 같은 날짜의 데이터가 중복해선 안 되는 만큼 unique(stock_id, date)제약 조건이 걸리고 있습니다.다음은 설계한 데이터베이스에 키움 증권 API을 통해서 어떻게 편입할지에 대한 Python코드입니다.from base.logger수입 MyLogger from src.model.dao.kium.stockIdxDAO는 src.model.api에서 StockIdxDAO을 가져옵니다.키움 API임포트*class StockIndexSrv:”’식주종목트를집하비서수스는스리자성생 api”비#서스_’_self_집 stockdefinit=(_)selfself는하:”*stockimporto”’#’dadaclass def__init__(self):self.stockIdxDao=StockIdxDAO(self).__반__.__name__)self.message=MyLogger(self).__반__.__name__)def update_stock(self):_dao=self.stockIdxDao;kium=KiumAPI()def transaction(args, **kwargs):##코스피 데이터 업데이트 kospi=kiwoom.get_stock_from_code(0)self.logger.info public{}({{}}:{}}. format(“코스피”, 0, len(vlan)_dao.update_stock_code(vlan)#코닥트이데 이터업데(“kospi스 kospikospikosdaqgetkiwoom=데트(“이}_({“.{})(터 format#k”업)닥이(데 kospiospi0”}:{_)da, update_. get_stock_from_code(10)self.logger.info market{}({{{}}}). format(“KOSDAQ”, 10, len(ticker)_dao.update_stock_code(ticker)#티쯔카ー”ticker_code_list=_dao.get_ticker_list”을 선택합니다. ticker_code_list:list=kium.get_stock_from_code(market_code[0], ticker=True)self.logger.info vpn{}({}}:. format(market_code[1], market_code[0], len(list)_dao.update_stock_ticker(list)_dao.execute_transaction(transaction, method=’update_stock’)우선 INSERTIGNORE INTO에 KOSPI과 KOSDAQ종목의 데이터를 넣고 그 뒤 ticker목록을 갖다 키움 증권으로 구분된 주식 정보를 취득합니다.그리고 INNERT INTO ON DUPLICATE KEYUPDATE에서 신규 은행은 INNERT를 하고 KEY가 중복 행은 업데이트하면서 ticker_cd값을 넣습니다.INSERT IGNORE INTO와 REPLACE INTO의 차이는 REPLACE INTO는 내부적으로 데이터를 먼저 삭제하고 INSERT을 벌이는 cursor를 증가시키고 AUTO_INCREMENT를 증가시킵니다만, INCERT IGNORE INTO는 중복 키가 있는 경우는 미끄러져서 새 키에 대해서만 INSERT추진은 그렇지 않습니다.다음은 수행하고 본 결과입니다.종목 데이터가 모두 데이터베이스에 잘 들어갔어요. 다음으로 조회를 쿼리를 날려보겠습니다.매번 저런 조인을 걸고 select하기 귀찮아서 VIEW를 하나 생성했어요.stock_info AS를 만들거나 치환합니다 (s.code, s.name , s.market, t.code as tcode, t.name 를 stocks Left JOIN code_slvton s.ticker_cd = t.code 에서 티커로 선택합니다);stock_info AS를 만들거나 치환합니다 (s.code, s.name , s.market, t.code as tcode, t.name 를 stocks Left JOIN code_slvton s.ticker_cd = t.code 에서 티커로 선택합니다);여담이지만 오늘 오전에 미국 증시, 국내 증시 지수가 다 오르고 주가가 많이 올랐다 오후에 다시 하락하는 게…오전 수익이 +72만이었는데…벌써 가려고 했는데…오후가 되고 보면+33만이 쓰였습니다 www(울음)이는 음···외국인들이 오전 중에 사자를 일으키며 개미를 꾀어 놓고 오후가 되자 짐을 싸서 팔고 달아난 느낌이…이래봬도 왠가 했더니… 그렇긴 내일이 4마녀의 날?”4마녀의 날”은 주가 지수 선물과 옵션 개별 주식 옵션과 선물 만기가 겹치는 날이래요.그동안 경제 문맹이었기 때문에… 그렇긴 이번 그런 날도 있다는 걸 처음 알았습니다.그리고 아직 딥 러닝”딥”글씨도 시작되지 않은 상태이지만 아무리 딥 러닝을 하고 주가 예측을 하든 이런 모든 변수가 넘치는 시장에서 얼마나 실효성이 있는지는 저도 의문이긴 합니다.정말 어렵네요.오늘은 오후 9시밖에 안됐는데 신기하게도 이제 피곤해서 일찍 자야겠네요.그럼 다음 시간에!

error: Content is protected !!