이경수 선생님의 수학실험실

1년동안 30% 이상의 수익률을 경험한 종목의 비중은 얼마나 될까? 본문

Algorithm Trading

1년동안 30% 이상의 수익률을 경험한 종목의 비중은 얼마나 될까?

(이경수) 2017. 1. 26. 18:33
2014년, 2015년, 2016년 각 1월 1일 종가 기준으로 1년동안 30% 이상의 수익률을 경험한 종목 비중을 알아 보았습니다.

결과에 따르면 30% 이상의 수익률을 경험한 종목의 비중은

2014년 54.79%, 2015년 63.99%, 2016년 38.67%로 2016년의 비율이 상대적으로 낮은 수치를 보입니다.

참고로 분석과정에서 2017년 1월 현재 kospi, kosdaq에 상장된 종목을 기준으로 분석한 것이기 때문에

2014년, 2015년 결과는 실제와 차이가 날 수 있습니다.





다음은 위의 그래프를 그리는데 사용한 코드입니다.

개발환경
- kiwoom OpenAPI+
- python3.5
- sqlite3


import sqlite3
import sqlite3
from Kiwoom import *
from PyQt5.QtWidgets import *
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from matplotlib import style

MARKET_KOSPI = 0
MARKET_KOSDAQ = 10


class Up30:
    def run(self):
        #self.input_codes()
        #self.check_up30()
        self.draw_chart()

    def input_codes(self):
        self.kiwoom = Kiwoom()
        self.kiwoom.CommConnect()
        self.kospi_code = self.kiwoom.GetCodeListByMarket(MARKET_KOSPI)
        self.kosdak_code = self.kiwoom.GetCodeListByMarket(MARKET_KOSDAQ)

        # Get 'code' data
        codes = []
        for cd in self.kospi_code:
            codes.append(cd)
        for cd in self.kosdak_code:
            codes.append(cd)

        con = sqlite3.connect("C:\\Users\\Kyoungsoo\\PycharmProjects\\Analysis\\stock_info.db")
        cursor = con.cursor()
        cursor.execute("DROP TABLE  Codes1701")
        cursor.execute("CREATE TABLE Codes1701(Code text, Codename text)")

        for code in codes:
            name = self.kiwoom.dynamicCall("GetMasterCodeName(QString)", code)
            cursor.execute("INSERT INTO Codes1701(Code, Codename) VALUES(?, ?)", (code, name))
        con.commit()
        con.close()

    def check_up30(self, success = 0, fail = 0, sf = 0):
        start_day = '2016-01-01'
        end_day = '2016-12-31'

        # Database connect
        con = sqlite3.connect("C:\\Users\\Kyoungsoo\\PycharmProjects\\Analysis\\stock_info.db")
        cursor = con.cursor()
        #cursor.execute(("DROP TABLE up30"))
        #cursor.execute("CREATE TABLE up30(Code text, StartDate text, EndDate text, SDPrice int, MaxPrice int, SF int)")

        cursor.execute("SELECT Code From Codes1701")
        rows = cursor.fetchall()

        codes = []
        for row in rows:
            codes.append(row[0])

        for cd in codes:
            code = '"' + cd + '"'

            cursor.execute("SELECT Close FROM opt_10081 "
                           "WHERE opt_10081.Code = " + code + " and Date BETWEEN " +  "'" + start_day + "'" + " AND " + "'" + end_day + " '" 
                           "ORDER BY opt_10081.Date asc")

            rows = cursor.fetchall()

            try:
                price = []
                for row in rows:
                    price.append(row[0])

                start_day_price = price[0]
                max_price = max(price)

                if start_day_price * 1.3 <= max_price:
                    success += 1
                    sf = 1
                else:
                    fail += 1
                    sf = 0
            except:
                start_day_price = 0
                max_price = 0
                sf = 2

            # Insert data
            cursor.execute("INSERT INTO up30(Code, StartDate, EndDate, SDPrice, MaxPrice, SF) "
                           "VALUES(?,?,?,?,?,?)",
                           (cd, start_day, end_day, start_day_price, max_price, sf))

            print(cd, start_day, end_day, start_day_price, max_price, sf)

        con.commit()
        con.close()

    def draw_chart(self):
        start_day = '2014-01-01'

        font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
        rc('font', family=font_name)
        style.use('ggplot')

        # Database connect
        con = sqlite3.connect("C:\\Users\\Kyoungsoo\\PycharmProjects\\Analysis\\stock_info.db")
        cursor = con.cursor()
        cursor.execute("SELECT SF FROM up30 WHERE StartDate= " + '"' + start_day + '"')

        rows = cursor.fetchall()

        sfs = []
        for row in rows:
            sfs.append(row[0])

        s_count = sfs.count(1)
        f_count = sfs.count(0)

        s_rate = s_count / (s_count + f_count)
        f_rate = f_count / (s_count + f_count)

        s_rate = round(s_rate * 100, 2)
        f_rate = round(f_rate * 100, 2)

        item = ['130% 이상', '130% 미만']
        rate = [s_rate, f_rate]

        fig = plt.figure(figsize=(4, 6))
        ax = fig.add_subplot(1, 1, 1)

        pos = np.arange(2)
        rects = plt.bar(pos, rate, align='center', width=0.5)
        plt.xticks(pos, item)

        for i, rect in enumerate(rects):
            ax.text(rect.get_x() + rect.get_width() / 2.0, 0.95 * rect.get_height(), str(rate[i]) + '%',
                    ha='center')

        plt.ylabel('비율(%)')
        plt.title(start_day + ' 기준 1년 이내 최고 종가')
        plt.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    up30 = Up30()
    up30.run()
Comments