3. DB 구현 (키움 open api 주식 알고리즘 테스트 프로그래밍) >


1. 키움 open api를 이용한 주식 알고리즘 테스트 프로그래밍

2. DB 설계 (키움 open api 주식 알고리즘 테스트 프로그래밍)


해당 포스트를 읽기 전에 위에 링크된 두 포스트를 읽기 바란다. 

지난 포스트에서 설계한 DB를 바탕으로 파이썬으로 실제 코딩해 DB를 생성할 것이다. 다음은 Db.py 일부 코드이다.(전체 코드는 마지막에..)


import sqlite3 class StockDb(object): # 싱글톤 패턴 _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls) return cls._instance return cls._instance def __init__(self): self.open_Db() # DB를 오픈한다. def open_Db(self): self.con = sqlite3.connect("./kosdaq_leverage.db") self.cursor = self.con.cursor() def create_StockDb(self): self.cursor.execute("CREATE TABLE kosdaq_leve(date text unique, high int, low int);") self.cursor.execute("CREATE TABLE kosdaq_start(date text unique, start int);") self.cursor.execute("CREATE TABLE kosdaq_leve_day(date text unique, start int, end int);") def create_OrderDb(self): self.cursor.execute("CREATE TABLE buy(date text, buy_price int, buy_reason text, buy_id integer primary key autoincrement);") self.cursor.execute("CREATE TABLE sell(date text, sell_price int, sell_reason text, sell_id integer primary key autoincrement references buy(buy_id));") self.cursor.execute("CREATE TABLE optimize_profit(********* int, ******* int, profit int);") def commit(self): self.con.commit()

다른 클래스에서 같은 db에 접근하기 때문에 __new__ 메서드를 재정의해 싱글톤 패턴을 만들었다. 나머지 코드 테이블을 생성하는 코드이다. 첫 번째 포스트에서 말한 "파이썬으로 배우는 알고리즘 트레이딩" 을 보았다면 이해될 것이다. create_StockDb 메서드는 KODEX 코스닥 150 레버리지에 관한 테이블을 생성한다. create_OrderDb 메서드는 매수, 매도, 수익률에 관한 테이블을 생성한다. commit 메서드는 굳이 정의해도 되지 않지만 외부에서 con에 직접 접근하지 않게 하기 위해서 정의했다.  참고로 commit의 역할은 프로그래머가 명령한 DB Access 작업을 실제 DB에 쓰는 역할을 한다. commit를 하지 않을 시 DB에 작업한 내용이 일부분 반영되지 않는다. 


다음은 Db.py 전체 코드이다. 그냥 보기만 해도 된다. insert나 select 메서드들은 다음에 차차 하나씩 설명할 것이다.

import sqlite3
import pandas as pd

class StockDb(object):

    # 싱글톤 패턴
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls)
            return cls._instance
        return cls._instance


    def __init__(self):
        self.open_Db()

    # DB를 오픈한다.
    def open_Db(self):
        self.con = sqlite3.connect("./kosdaq_leverage.db")
        self.cursor = self.con.cursor()


    def create_StockDb(self):
        self.cursor.execute("CREATE TABLE kosdaq_leve(date text unique, high int, low int);")
        self.cursor.execute("CREATE TABLE kosdaq_start(date text unique, start int);")
        self.cursor.execute("CREATE TABLE kosdaq_leve_day(date text unique, start int, end int);")


    def create_OrderDb(self):
        self.cursor.execute("CREATE TABLE buy(date text, buy_price int, buy_reason text, buy_id integer primary key autoincrement);")
        self.cursor.execute("CREATE TABLE sell(date text, sell_price int, sell_reason text, sell_id integer primary key autoincrement references buy(buy_id));")
        self.cursor.execute("CREATE TABLE optimize_profit(mean_level int, price_limit int, profit int);")

    def insert_Leve(self,day,high, low):
        self.cursor.execute("insert into kosdaq_leve values(?,?,?);",(day,high,low))

    def insert_Start(self,day,start):
        self.cursor.execute("insert into kosdaq_start values(?,?);",(day,start))

    def insert_Leve_Day(self,day,start,end):
        self.cursor.execute("insert into kosdaq_leve_day values(?,?,?);",(day,start, end))

    def insert_Buy(self,day,price,reason):
        self.cursor.execute("insert into buy (date,buy_price,buy_reason) values(?,?,?);",(day,price,reason))

    def insert_Sell(self,day,price,reason):
        self.cursor.execute("insert into sell (date,sell_price,sell_reason) values(?,?,?);", (day,price, reason))

    def insert_Profit(self, mean_level, limit, profit):
        self.cursor.execute("insert into optimize_profit values(?,?,?);",(*********,**********))

    def select_MinuteData(self,day):
        data = pd.read_sql("SELECT * FROM kosdaq_leve where date like \'" + day + "%\' order by date;", self.con, index_col=None)
        return data

    def select_DailyStart(self,day):
        data = pd.read_sql("SELECT * FROM kosdaq_start where date like \'"+day+"%\' order by date;", self.con, index_col=None)
        return data

    def select_Buy(self,day):
        day = day[0:8]
        data = pd.read_sql("SELECT * FROM buy where date like \'"+day+"%\';",self.con, index_col=None)
        return data

    def select_Sell(self,day):
        day = day[0:8]
        data = pd.read_sql("SELECT * FROM sell where date like \'" + day + "%\';", self.con, index_col=None)
        return data

    def select_Date(self, start, end):
        data = pd.read_sql("SELECT date FROM kosdaq_start where date >= \'" + start + "000000\' and date <= \'"+end+"090000\' order by date;", self.con, index_col=None)
        return data

    def delete_Buy_Sell(self):
        self.cursor.execute("DELETE FROM sell;")
        self.cursor.execute("DELETE FROM buy;")
        self.cursor.execute("DELETE FROM sqlite_sequence;")
        self.commit()

    def select_Daily_Data(self,start,end):
        data = pd.read_sql("SELECT * FROM kosdaq_leve_day where date >= \'" + start + "\' and date <= \'"+ end +"\';", self.con, index_col=None)
        return data

    def select_Optimize_Data(self):
        data = pd.read_sql("SELECT * FROM optimize_profit;", self.con, index_col=None)
        return data

    def commit(self):
        self.con.commit()

if __name__ == "__main__":
    db = StockDb()
    db.create_StockDb()
    db.create_OrderDb()
Db.py를 실제 실행해서 테이블을 만들면 된다. 

여기까지가 DB에 관련된 내용이었다. 다음 포스트부터는 실제 키움 open api를 사용해서 데이터를 불러오고 DB에 실제 값을 저장할 것이다.


+ Recent posts