우선 주식을 컴퓨터에게 분석 하기 위해서는 데이터가 필요하죠.

키움증권의 OpenAPI등을 사용해서 데이터를 실시간으로 가져 올 수 있으나,

그건 실제 매매 전략등을 구현해서 성공한다는 확신이 들때 해도 됩니다.

 

시스템 자동매매 만드는 방법은 아래와 같은 순서로 만드는게 보편적입니다.

  1. 주식 데이터 모으기 (tick 데이터 자체도 매매 됩니다. 해외 선물 같은 경우 거래소당 월 180달러 내야 합니다.)
  2. 주식 데이터를 기술 분석 하기 (이동평균선, 볼린저 벤드, RSI 등...)
  3. 기술 데이터를 기반으로 매매 규칙 세우기
  4. 벡테스팅 하기.
       즉 1의 주식 데이터를 기반으로 3에서 새운 매매 규칙을 적용해서 실제 이익나는 전략인지 검증
        (사실 여기서 다들 좌절 합니다....ㅠㅠ)
  5. 실제 모의 투자 계좌에서 위의 통과된 매매법을 적용하기 (최소 1개월 ~ 3개월)
  6. 실제 계좌에 돈을 넣고 보기...

 

상기의 주제들은 구글이나 네이버 등에서도 검색하면 나오는 소스들이 많습니다

여기서는 제 나름대로 주석을 붙여가서 해석을 하는거니, 참고 바랍니다.

 

우선 1번 데이터 모으기 부터 해봅시다.

 

main.py

import pandas as pd 
import dataframe
import sqlite3
import datetime
import WebStockDataGetter
import SqliteStockDB

# 메인 함수 시작
if __name__ == '__main__':
    # 설정파일. 웹페이지의 1페이지당 10일치 데이터가 있는데, 몇개 웹페이지를 긁을지 설정
    f = open("./config.txt", 'r')
    if f.readable == False:
        print("! have not config file.")
        exit
     
    maxGetPage = f.readline().strip()
    f.close()

    # 네이버 데이터 크롤러
    getter = WebStockDataGetter.naverGetter()
    stockDf = getter.getKoreaStocks()

    # Sqlite에 데이터 저장
    dayPriceDB = SqliteStockDB.dayPriceDB()
    conn = dayPriceDB.connectDB('KoreaStockData.db')
    totalCount = len(stockDf)

    with conn:
        # 주식의 일자데이터 url 가져오기 
        for idxi, rowCode in stockDf.iterrows():
            code = rowCode['code']
            name = rowCode['name']      

            # DB에 데이터가 없으면 테이블을 만듬
            tableName = dayPriceDB.tableName(code)
            if dayPriceDB.checkTable(conn, tableName) == False:
                dayPriceDB.createTable(conn, tableName)

            # 크롤러에게 code 넘기고 넷 데이터 긁어오기
            df = getter.getAllStockDays(code, maxGetPage)
            data = pd.DataFrame(df, columns=['날짜', '시가', '고가', '저가', '종가', '거래량'])
                                    
            # 데이터 저장
            dayPriceDB.save(conn, tableName, data)
            log = "====== 주식 일봉 데이터 [%s] 저장 완료 (%d/%d) =====" % (name, idxi, totalCount)
            print(log)

        conn.close()

 

SqliteStockDB.py

import pandas as pd 
import dataframe
import sqlite3
import datetime

class dayPriceDB:
    # DB 폴더가 준비 되어 있어여함.	
    def __init__(self, dbName):
        self.conn_ = sqlite3.connect('./DB/' + dbName)

    def tableName(self, code):
        name = "DayPriceTable_" + code
        return name
    
    # 테이블 이름이 있는지 확인
    def checkTable(self, tableName):
        with self.conn_:
            cur = self.conn_.cursor()
            sql = "SELECT count(*) FROM sqlite_master WHERE Name = \'%s\'" % tableName
            cur.execute(sql)
            rows = cur.fetchall()
            for row in rows:          
                if str(row[0]) == "1":
                    return True
            return False
    
    # 테이블 생성
    def createTable(self, tableName):
        with self.conn_:
            cur = self.conn_.cursor()
            sql = "CREATE TABLE %s (candleTime DATETIME PRIMARY KEY, start INT, high INT, low INT, close INT, vol INT);" % tableName
            cur.execute(sql)
    
    # 데이터 저장
    def save(self, tableName, dataframe):    
        with self.conn_:
            cur = self.conn_.cursor()
            sql = "INSERT OR REPLACE INTO \'%s\'" % tableName
            sql = sql + " ('candleTime', 'start', 'high', 'low', 'close', 'vol') VALUES(?, ?, ?, ?, ?, ?)"
            cur.executemany(sql, dataframe.values)    
            self.conn_.commit()

 

WebStockDataGetter.py

import pandas as pd 
import dataframe
import sqlite3
import datetime

class naverGetter:
    def getKoreaStocks(self):
        # 한국 주식 회사 등록 정보 가지고 오기
        stocksDataFrame = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
        stocksDataFrame.종목코드 = stocksDataFrame.종목코드.map('{:06d}'.format)
        stocksDataFrame = stocksDataFrame[['회사명', '종목코드']] 
        stocksDataFrame = stocksDataFrame.rename(columns={'회사명': 'name', '종목코드': 'code'})
        return stocksDataFrame

    def __getURLCode(self, code):    
        url = 'http://finance.naver.com/item/sise_day.nhn?code={code}'.format(code=code)
        print("요청 URL = {}".format(url))
        return url

    # 종목 이름을 입력하면 종목에 해당하는 코드를 불러와 
    def getStockURL(self, item_name, stocksDataFrame):
        code = stocksDataFrame.query("name=='{}'".format(item_name))['code'].to_string(index=False)
        url = self.__getURLCode(code)
        return url

    def getAllStockDays(self, code, maxGetPage):
        # 일자 데이터를 담을 df라는 DataFrame 정의
        df = pd.DataFrame()

        url = self.__getURLCode(code)
        # 1페이지가 10일. 60페이지 = 600일 데이터만 가져오기 
        for page in range(1, int(maxGetPage)):
            pageURL = '{url}&page={page}'.format(url=url, page=page)
            df = df.append(pd.read_html(pageURL, header=0)[0], ignore_index=True)
        
        # df.dropna()를 이용해 결측값 있는 행 제거 
        df = df.dropna()
        return df

 

이걸로 DB 폴더안에 'KoreaStockData.db' 파일이 생성될거고요.

DB Browser for SQLite 로 열어보면 네이터 주식 게시판에서 긁어온 데이터가 제대로 저장되어 있다면 성공입니다.

 

시스템 트레이딩을 위해서 필요한걸 적어 봤습니다.

주 목표는 ETF / ETN 종목등 몇몇 종목에 대한 그래프 그려보고 어떤식으로 만들지 고민해보도록 하겠습니다.

 

- 파이썬을 돌릴 visual code https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

- 파이썬 설치 관련 / 메뉴얼 https://docs.python.org/ko/3/tutorial/index.html

 

파이썬 자습서 — Python 3.8.1rc1 문서

파이썬 자습서 파이썬은 배우기 쉽고, 강력한 프로그래밍 언어입니다. 효율적인 자료 구조들과 객체 지향 프로그래밍에 대해 간단하고도 효과적인 접근법을 제공합니다. 우아한 문법과 동적 타이핑(typing)은, 인터프리터 적인 특징들과 더불어, 대부분 플랫폼과 다양한 문제 영역에서 스크립트 작성과 빠른 응용 프로그램 개발에 이상적인 환경을 제공합니다. 파이썬 인터프리터와 풍부한 표준 라이브러리는 소스나 바이너리 형태로 파이썬 웹 사이트, https://www.

docs.python.org

<이 아래는 매매까지 자동으로 하고 싶을 경우>

- 키움증권 계좌  (휴대폰 비대면 계좌 개설) 및 OpenAPI 사용 등록

https://www2.kiwoom.com/nkw.templateFrameSet.do?m=m1408010100

 

키움증권-대한민국 주식시장 점유율 1위

 

www2.kiwoom.com

- C# 프로그램 설치를 위한 Visual Studio https://visualstudio.microsoft.com/

 

Visual Studio IDE, Code Editor, Azure DevOps, & App Center - Visual Studio

Visual Studio dev tools & services make app development easy for any platform & language. Try our Mac & Windows code editor, IDE, or Azure DevOps for free.

visualstudio.microsoft.com

- sqlite db 값을 볼 브라우져 https://sqlitebrowser.org/

 

DB Browser for SQLite

DB Browser for SQLite The Official home of the DB Browser for SQLite Screenshot What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. DB4S is for users and dev

sqlitebrowser.org

 

이 몇년간 개인적 사정으로 블로그를 방치 했었지만, 

이제 다시 몇개 글좀 올리고자 합니다.

 

게임 서버 프로그래머로서 나름 족적을 남기고자 노력하고 자기 개발도 해봤지만,

회사에 묶인 개인으로선 역시 한계가 있네요.

게임 회사라는 한계도 있고요.

 

당연한 이야기지만, 결국 회사원으로서는 재산 증식에 어려움이 많네요.

게임 회사에 입사한 것도 열심히 일하다가 성공하면 어느정도 인센이 나오니까, 게임을 좋아 하니까 였는데

10년 넘게하다보니, 열심히 해도 소용없다는 벽이 느껴지네요. 번인은 물론이거니와

인센도 먹을 사람들은 정해져 있고, 보이지 않는 학연, 지연, 흡연... 

 

그래서, 다른 뭔가 자신의 분야를 활용하는 재테크 분야를 찾다 보니

시스템 트레이딩 분야가 눈에 들어 왔습니다.

 

잘 될지 안될지는 모르겠으나, 이것 저것 시도 해보고 결과를 공유 하고자 합니다.

부디 경제적 자유를 얻는 그날까지...

 

 

+ Recent posts