Ejemplo n.º 1
0
def All_stock():
    df = stock.get_market_ohlcv_by_ticker('20210217', market='KOSPI')
    list_of_index = [item for item in df.index]
    ticker = sorted(list_of_index)  #종목코드 오름차순
    ticker_name = [stock.get_market_ticker_name(i) for i in ticker]  # 종목명 오름차순

    return ticker, ticker_name
Ejemplo n.º 2
0
async def fluctuation_stock_list(qDate: Optional[str] = None):
    date = getRecentDay()
    if qDate:
        date = qDate
    df = stock.get_market_ohlcv_by_ticker(date)
    result = []
    df_index = df.index
    df_arr = df._series
    start_price = df_arr.get('시가').values.tolist()
    highest_price = df_arr.get('고가').values.tolist()
    lowest_price = df_arr.get('저가').values.tolist()
    end_price = df_arr.get('종가').values.tolist()
    volume = df_arr.get('거래량').values.tolist()
    transaction_price = df_arr.get('거래대금').values.tolist()
    fluctuation_rate = df_arr.get('등락률').values.tolist()
    for i, index in enumerate(df_index):
        result.append({
            'ticker': index,
            'start_price': start_price[i],
            'highest_price': highest_price[i],
            'lowest_price': lowest_price[i],
            'end_price': end_price[i],
            'volume': volume[i],
            'transaction_price': transaction_price[i],
            'fluctuation_rate': fluctuation_rate[i]
        })
    return {
        'data': result,
    }
Ejemplo n.º 3
0
def update_stockData():   # TODO: tail 제거
    '''
    라벨링이 되지 않은 상태로 업데이트되므로, 대신 update_stockData_with_labels()를 사용하세요.
    '''
    # pd_가 붙은 것은 pd.timestamp, 붙지 않은 것은 'YYYY-MM-DD' 형식의 str
    pd_lastSavedDate = tail(open('resources/ohlcv/950200.csv'), 1)
    pd_lastSavedDate = pd_lastSavedDate[1][:10]
    pd_lastSavedDate = pd.to_datetime(pd_lastSavedDate)
    pd_destDate = pd.Timestamp.now()
    pd_destDate = pd.to_datetime(pd_destDate.date())

    # 데이터를 갱신할 날짜 범위
    pd_last_p1 = pd_lastSavedDate + pd.Timedelta(days=1)
    pd_dateRange = pd.date_range(pd_last_p1, pd_destDate)

    for pd_date in pd_dateRange:
        df_update = get_market_ohlcv_by_ticker(pd_date)
        if not len(df_update):  # 장이 열리지 않은 날이면 skip
            continue
        df_update = df_update.reset_index()
        for stock_ in df_update.iloc:
            stock_code = stock_['종목코드']
            filename = f'resources/ohlcv/{stock_code}.csv'
            str_date = str(pd_date.date())
            if (isfile(filename)):
                with open(filename, 'a', encoding='UTF-8') as f:
                    f.write(
                        f"{str_date},{stock_['시가']},{stock_['고가']},{stock_['저가']},{stock_['종가']},{stock_['거래량']}\n")
            else:
                new_stock = get_market_ohlcv_by_date(
                    "20120101", pd_date, stock_code)
                new_stock.to_csv(filename, encoding='UTF-8')
                sleep(1)
Ejemplo n.º 4
0
 def test_ohlcv_for_a_day(self):
     df = stock.get_market_ohlcv_by_ticker("20210122")
     #           시가    고가    저가    종가   거래량     거래대금     등락률
     # 티커
     # 095570    4190    4245    4160    4210   216835    910274405   0.839844
     # 006840   25750   29550   25600   29100   727088  20462325950  12.570312
     # 027410    5020    5250    4955    5220  1547629   7990770515   4.191406
     # 282330  156500  156500  151500  152000    62510   9555364000  -2.560547
     temp = df.iloc[0:5, 0] == np.array([4190, 25750, 5020, 156500, 5720])
     self.assertEqual(temp.sum(), 5)
     temp = df.index[0:5] == np.array(["095570", "006840", "027410", "282330", "138930"])
     self.assertEqual(temp.sum(), 5)
Ejemplo n.º 5
0
 def test_io(self):
     df = stock.get_market_ohlcv_by_ticker("20180212")
     self.assertIsInstance(df.index[0], str)
     self.assertIsInstance(df['종목명'].iloc[0], str)
     self.assertIsInstance(df['시가'].iloc[0], np.int32)
     self.assertIsInstance(df['고가'].iloc[0], np.int32)
     self.assertIsInstance(df['저가'].iloc[0], np.int32)
     self.assertIsInstance(df['종가'].iloc[0], np.int32)
     self.assertIsInstance(df['거래량'].iloc[0], np.int64)
     self.assertIsInstance(df['시가총액'].iloc[0], np.int64)
     self.assertIsInstance(df['거래대금'].iloc[0], np.int64)
     self.assertIsInstance(df['시총비중'].iloc[0], np.float16)
     self.assertIsInstance(df['상장주식수'].iloc[0], np.int32)
Ejemplo n.º 6
0
 def test_ohlcv_for_a_day_in_kosdaq(self):
     df = stock.get_market_ohlcv_by_ticker("20210122", "KOSDAQ")
     #           시가    고가    저가    종가   거래량     거래대금    등락률
     # 티커
     # 060310    2265    2290    2225    2255   275425    619653305 -0.219971
     # 054620    7210    7250    7030    7120   124636    883893780 -1.110352
     # 265520   25850   25850   25200   25400   196384   4994644750 -0.779785
     # 211270   10250   10950   10050   10350  1664154  17351956900  1.469727
     # 035760  165200  166900  162600  163800   179018  29574003100  0.429932
     temp = df.iloc[0:5, 0] == np.array([2265, 7210, 25850, 10250, 165200])
     self.assertEqual(temp.sum(), 5)
     temp = df.index[0:5] == np.array(["060310", "054620", "265520", "211270", "035760"])
     self.assertEqual(temp.sum(), 5)
Ejemplo n.º 7
0
def get_latest_market_ohlcv(today=None, market="ALL"):
    
    if today == None:
        today = datetime.datetime.today().strftime("%Y%m%d")

    if DEBUG == True: print(get_latest_market_ohlcv.__name__, today)

    today_datetime = datetime.datetime.strptime(today, "%Y%m%d")
    for i in range(0, RETRY_COUNT):
        latest_date = (today_datetime - datetime.timedelta(i)).strftime("%Y%m%d")
        if DEBUG: print(latest_date)
        result = stock.get_market_ohlcv_by_ticker(latest_date, market)
        if result.empty == False:
            return result

    if DEBUG: print("fail")
    return None
Ejemplo n.º 8
0
 def analyzeData(self, anal_type='a', res_tablename='dart2019', std_date='20201116', today='20210305', dept_rate=None):
     '''
     anal_type
     a: 기업분석 > 기준가 
     b: 가치분석 < 기업가치
     c: 영업이익 2년 연속 상승
     d: 부채비율 100% 이하
     e: 최소 주당가치분석 < 최대 주당기업가치
     g: 현재가 추가 데이터
     orgin: 원래 데이터
     '''
     years = ['2017', '2018', '2019', '2020']
     if self.is_maria == False:
         self._setMaria()
     
     df = self.maria.showData('select * from {}'.format(res_tablename))
     if anal_type == 'a':
         std_date = std_date
         df1 = stock.get_market_ohlcv_by_ticker(std_date)['종가']
         df2 = stock.get_market_ohlcv_by_ticker(std_date, market='KOSDAQ')['종가']
         df3 = stock.get_market_ohlcv_by_ticker(std_date, market='KONEX')['종가']
         price_df = pd.concat([df1, df2, df3]).reset_index(drop=False).rename(columns={'티커': '종목코드', '종가': '기준가격'})
         a_df = pd.merge(df[['종목코드', '주당가치분석']], price_df, on=['종목코드'])
         a_df = a_df[a_df['주당가치분석'] > a_df['기준가격']][['종목코드', '기준가격']]
         return pd.merge(a_df, df, on=['종목코드']).reset_index(drop=True)
     elif anal_type == 'b':
         return df[df['주당기업가치'] > df['주당가치분석']].reset_index(drop=True)
     elif anal_type == 'c':
         c_df = pd.DataFrame()
         c_df['종목코드'] = df['종목코드']
         c_df['{}영업이익성장률'.format(years[1])] = ((df['영업이익{}'.format(years[1])] - df['영업이익{}'.format(years[0])]) / df['영업이익{}'.format(years[0])])*100
         c_df['{}영업이익성장률'.format(years[2])] = ((df['영업이익2019'] - df['영업이익{}'.format(years[1])]) / df['영업이익{}'.format(years[1])])*100
         c_df = c_df[c_df['{}영업이익성장률'.format(years[1])] > 0]
         c_df = c_df[c_df['{}영업이익성장률'.format(years[2])] > 0]
         return pd.merge(c_df[['종목코드', '{}영업이익성장률'.format(years[1]), '{}영업이익성장률'.format(years[2])]], df, on=['종목코드']).reset_index(drop=True)
     elif anal_type == 'd':
         d_df = df[['종목코드', '자본총계{}'.format(years[3]), '부채총계{}'.format(years[3])]]
         d_df['부채비율'] = (d_df['부채총계{}'.format(years[3])] / d_df['자본총계{}'.format(years[3])]) * 100
         d_df = d_df[d_df['부채비율'] <= dept_rate][['종목코드', '부채비율']]
         d_df = d_df[d_df['부채비율'] >= 0]
         return pd.merge(d_df, df, on=['종목코드']).reset_index(drop=True)
     elif anal_type == 'e':
         df[df['본질가치'] > df['주당기업가치']].reset_index(drop=True)
     elif anal_type == 'g':
         df1 = stock.get_market_ohlcv_by_ticker(today)['종가']
         df2 = stock.get_market_ohlcv_by_ticker(today, market='KOSDAQ')['종가']
         df3 = stock.get_market_ohlcv_by_ticker(today, market='KONEX')['종가']
         price_df = pd.concat([df1, df2, df3]).reset_index(drop=False).rename(columns={'티커': '종목코드', '종가': '최신가격'})
         g_df = pd.merge(df[['종목코드', '주당가치분석']], price_df, on=['종목코드'])[['종목코드', '최신가격']]
         return pd.merge(g_df, df, on=['종목코드']).reset_index(drop=True)
     elif anal_type == 'orgin':
         return df
Ejemplo n.º 9
0
    def getMarketOhlcvByTicker(self, date=None, market="ALL"):
        if date == None:
            return None

        # NOTE: 백업 데이터 존재 여부 확인.
        if not os.path.isdir(self.dirMarketOhlcv):
            os.makedirs(self.dirMarketOhlcv)
        filePath = self.dirMarketOhlcv + \
            '/marketOhlcv_%s_%s.bin' % (market, date)
        if os.path.isfile(filePath):
            # NOTE: file 이 있고, corpName 에 해당하는 데이터 있는지 확인.
            with open(filePath, 'rb') as f:
                marketOhlcv = pickle.load(f)
                return marketOhlcv

        rawOhlcvList = None
        try:
            rawOhlcvList = stock.get_market_ohlcv_by_ticker(date, market)
        except:
            print("[param] date 를 확인해주세요.")
            print(
                "[위 사항이 아니라면] [KRX API update 가 필요합니다] stock.get_market_ohlcv_by_ticker")
            exit()

        # NOTE: rawOhlcvList 데이터는 pandas.DataFrame 인데, DaraFrame 전체가 empty 면 rawOhlcvList.empty 는 True 를 리턴 함.
        # [refer] https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.empty.html
        if rawOhlcvList.empty == True:
            return None

        resOhlcv = dict()
        desc = "get ohlcv"
        for ticker in tqdm(rawOhlcvList.index, desc):
            corpName = stock.get_market_ticker_name(ticker)
            tmpDict = dict()
            for column in rawOhlcvList.columns:
                tmpDict[column] = str(rawOhlcvList.loc[ticker][column])
            resOhlcv[corpName] = tmpDict

        # NOTE: 데이터 백업.
        with open(filePath, 'wb') as f:
            pickle.dump(resOhlcv, f)

        return resOhlcv
Ejemplo n.º 10
0
    def computeData(self, fnguide_tablename, signal_tablename, mh_tablename, jb_tablename, dg_tablename, res_tablename):
        self._setMaria()
        data = {}
        std_date = '20201116'
        today = '20210305'
        res_tablename = res_tablename+std_date

        years = ['2017', '2018', '2019', '2020']

        for y in years:
            data['fnguide{}'.format(y)] = self.maria.showData('select * from {}{}'.format(fnguide_tablename, y))
        for y in years[:-1]:
            data['new_signal{}'.format(y)] = self.maria.showData('select * from {}{}'.format(signal_tablename, y))
        data['dart_mh'] = self.maria.showData('select * from {}'.format(mh_tablename))
        data['dart_jb'] = self.maria.showData('select * from {}'.format(jb_tablename))

        # 사업보고서가 발표 된다면 사용하지 않음
        data['dart_dg_3q'] = self.maria.showData('select * from {}'.format(dg_tablename))
        ####################################
        
        df = data['fnguide{}'.format(years[3])][['종목코드', '자산', '부채', '자본', '기말현금및현금성자산', '매출액', '영업이익발표기준', '당기순이익', 'GB']]
        df = df.rename(columns={'자산': '자산총계{}'.format(years[3]), '부채': '부채총계{}'.format(years[3]), '자본': '자본총계{}'.format(years[3]), '기말현금및현금성자산': '현금성자산', '매출액': '매출액{}'.format(years[3]), '영업이익발표기준': '영업이익{}'.format(years[3]), '당기순이익': '당기순이익{}'.format(years[3])})

        tmp = data['fnguide{}'.format(years[0])][['종목코드', '당기순이익', '영업이익발표기준', '자산']]
        tmp = tmp.rename(columns={'당기순이익': '당기순이익{}'.format(years[0]), '영업이익발표기준': '영업이익{}'.format(years[0]),'자산': '자산총계{}'.format(years[0])})
        df = pd.merge(df, tmp, on=['종목코드'])

        tmp = data['fnguide{}'.format(years[1])][['종목코드', '당기순이익', '영업이익발표기준', '자본', '자산', '부채', '유동자산', '유동부채', '매출액']]
        tmp = tmp.rename(columns={'당기순이익': '당기순이익{}'.format(years[1]), '영업이익발표기준': '영업이익{}'.format(years[1]), '자본': '자본총계{}'.format(years[1]), '자산': '자산총계{}'.format(years[1]), '부채': '부채총계{}'.format(years[1]), '유동자산': '유동자산{}'.format(years[1]), '유동부채': '유동부채{}'.format(years[1]), '매출액': '매출액{}'.format(years[1])})
        df = pd.merge(df, tmp, on=['종목코드'])

        tmp = data['fnguide{}'.format(years[2])][['종목코드', '당기순이익', '영업이익발표기준', '자본', '자산', '부채', '유동자산', '유동부채', '매출액']]
        tmp = tmp.rename(columns={'당기순이익': '당기순이익{}'.format(years[2]), '영업이익발표기준': '영업이익{}'.format(years[2]), '자본': '자본총계{}'.format(years[2]), '자산': '자산총계{}'.format(years[2]), '부채': '부채총계{}'.format(years[2]), '유동자산': '유동자산{}'.format(years[2]), '유동부채': '유동부채{}'.format(years[2]), '매출액': '매출액{}'.format(years[2])})
        df = pd.merge(df, tmp, on=['종목코드'])

        # 사업보고서가 발표 된다면 해당년도로 사용
        tmp = data['new_signal{}'.format(years[2])][['종목코드', '단기차입금', '장기차입금']]
        df = pd.merge(df, tmp, on=['종목코드'])

        tmp = data['dart_mh'][['종목코드', 'mh{}'.format(years[2])]]
        tmp = tmp.rename(columns={'mh{}'.format(years[2]): '무형자산'})
        df = pd.merge(df, tmp, on=['종목코드'])

        tmp = data['dart_jb'][['종목코드', 'jb{}'.format(years[2])]]
        tmp = tmp.rename(columns={'jb{}'.format(years[2]): '자본금'})
        df = pd.merge(df, tmp, on=['종목코드'])
        #############################################

        df_An = df[df['GB'] == '12']
        df_3q = df[df['GB'] == '09'].rename(columns={'당기순이익{}'.format(years[3]): '당기순이익{}_3Q'.format(years[3])})

        tmp = data['dart_dg_3q'][['종목코드', 'dg{}_3Q'.format(years[1]), 'dg{}_3Q'.format(years[2])]]
        tmp = tmp.rename(columns={'dg{}_3Q'.format(years[1]): '당기순이익{}_3Q'.format(years[1]), 'dg{}_3Q'.format(years[2]): '당기순이익{}_3Q'.format(years[2])})
        df_3q = pd.merge(df_3q, tmp, on=['종목코드'])

        tmp = df_3q[['종목코드', '당기순이익{}_3Q'.format(years[1]), '당기순이익{}_3Q'.format(years[2]), '당기순이익{}_3Q'.format(years[3])]]
        tmp['rate{}'.format(years[2])] = (tmp['당기순이익{}_3Q'.format(years[2])] - tmp['당기순이익{}_3Q'.format(years[1])]) / tmp['당기순이익{}_3Q'.format(years[1])]
        tmp['rate{}'.format(years[3])] = (tmp['당기순이익{}_3Q'.format(years[3])] - tmp['당기순이익{}_3Q'.format(years[2])]) / tmp['당기순이익{}_3Q'.format(years[2])]
        tmp['당기순이익{}'.format(years[3])] = tmp['당기순이익{}_3Q'.format(years[2])] * (1 + (tmp['rate{}'.format(years[2])] + tmp['rate{}'.format(years[3])]) / 2)

        df_3q = pd.merge(df_3q, tmp[['종목코드', '당기순이익{}'.format(years[3])]], on=['종목코드'])
        df_3q = df_3q[list(df_An.columns)]

        df = pd.concat([df_An, df_3q])

        stock_amount_dates = ['20190329', '20200327', std_date]
        for y in stock_amount_dates:
            data['stock_amount_{}'.format(y)] = stock.get_market_cap_by_ticker(y)[['상장주식수', '시가총액']]

        tmp = data['stock_amount_{}'.format(stock_amount_dates[0])].reset_index(drop=False)
        tmp.columns = ['종목코드', '상장주식수{}'.format(years[1]), '시가총액{}'.format(years[1])]
        tmp['상장주식수{}'.format(years[1])] = tmp['상장주식수{}'.format(years[1])] / 100000000
        tmp['시가총액{}'.format(years[1])] = tmp['시가총액{}'.format(years[1])] / 100000000
        df = pd.merge(df, tmp, on=['종목코드'])

        tmp = data['stock_amount_{}'.format(stock_amount_dates[1])].reset_index(drop=False)
        tmp.columns = ['종목코드', '상장주식수{}'.format(years[2]), '시가총액{}'.format(years[2])]
        tmp['상장주식수{}'.format(years[2])] = tmp['상장주식수{}'.format(years[2])] / 100000000
        tmp['시가총액{}'.format(years[2])] = tmp['시가총액{}'.format(years[2])] / 100000000
        df = pd.merge(df, tmp, on=['종목코드'])

        tmp = data['stock_amount_{}'.format(stock_amount_dates[2])].reset_index(drop=False)
        tmp.columns = ['종목코드', '상장주식수{}'.format(years[3]), '시가총액{}'.format(years[3])]
        tmp['상장주식수{}'.format(years[3])] = tmp['상장주식수{}'.format(years[3])] / 100000000
        tmp['시가총액{}'.format(years[3])] = tmp['시가총액{}'.format(years[3])] / 100000000
        #df = pd.merge(df, tmp, on=['종목코드'])
        df = pd.merge(df, tmp[['종목코드', '시가총액{}'.format(years[3])]], on=['종목코드'])

        tmp = self.maria.showData('select * from stocks_202103')
        tmp['상장주식수{}'.format(years[3])] = (tmp['보통주'] + tmp['우선주']) / 100000000
        df = pd.merge(df, tmp[['종목코드', '상장주식수{}'.format(years[3])]], on=['종목코드'])
        

        for y in years[1:]:
            df['EPS{}'.format(y)] = df['당기순이익{}'.format(y)] / df['상장주식수{}'.format(y)]


        df1 = pd.DataFrame(stock.get_market_ohlcv_by_ticker(std_date)['종가'])
        df1['Size'] = [0] * df1.shape[0]
        df2 = pd.DataFrame(stock.get_market_ohlcv_by_ticker(std_date, market='KOSDAQ')['종가'])
        df2['Size'] = [1] * df2.shape[0]
        df3 = pd.DataFrame(stock.get_market_ohlcv_by_ticker(std_date, market='KONEX')['종가'])
        df3['Size'] = [2] * df3.shape[0]
        price = pd.concat([df1, df2, df3])
        price = price.reset_index(drop=False).rename(columns={'티커': '종목코드', '종가': '주식가격'})
        df = pd.merge(df, price, on='종목코드')


        df['순자산가치'] = (df['자본총계{}'.format(years[3])] - df['무형자산']) / df['상장주식수{}'.format(years[3])]
        df['순손익가치'] = ((df['EPS{}'.format(years[1])] + df['EPS{}'.format(years[2])]*2 + df['EPS{}'.format(years[3])]*3)/6)*10
        df['본질가치'] = (df['순자산가치'] + (df['순손익가치']*1.5))/2.5
        df['보충적가치'] = (df['순손익가치']*2 + df['순자산가치']*3) / 5

        df['주당기업가치'] = (df['상장주식수{}'.format(years[3])]*df['주식가격']+df['단기차입금']+df['장기차입금']-df['현금성자산'])/df['상장주식수{}'.format(years[3])]

        df['주당가치분석'] = (df['본질가치'] + df['주당기업가치']) / 2

        cols = list(df.columns)
        cols.remove('GB')

        df = df[cols]
        print(df.columns)
        print(len(list(df.columns)))
        self.maria.createTable(res_tablename, list(df.columns), ['VARCHAR(20)'] + ['FLOAT']*len(cols))
        for i in range(df.shape[0]):
            try:
                self.maria.insertData(res_tablename, tuple(list(df.iloc[i])))
                self.maria.commitDB()
            except:
                continue
Ejemplo n.º 11
0
from pykrx import stock
import time
df = stock.get_market_ohlcv_by_ticker("20200831")
print(df.tail())

Ejemplo n.º 12
0
 def test_ohlcv_for_a_day_on_holiday2(self):
     df0 = stock.get_market_ohlcv_by_ticker("20210123",
                                            alternative=True)  # Saturday
     df1 = stock.get_market_ohlcv_by_ticker("20210122")  # Friday
     self.assertTrue((df0 == df1).all(axis=None))
Ejemplo n.º 13
0
def update_stockData_with_labels(start_date=None):
    '''
    pykrx를 이용하여 증시 데이터를 업데이트합니다.
    - start_date    갱신이 필요한 시점으로, 미입력 시 마지막으로 장 마감한 날짜부터 갱신됩니다.
                    장 마감 이전에 업데이트했을 경우 마지막 날짜의 데이터는 실제와 다를 수 있습니다.
                    형식은 'YYYYMMDD' 또는 Datetime
    '''
    sys_print = stdout.write  # stack print method

    # 장 마감 시간이 지나지 않으면 오늘의 결과를, 지나면 다음 날의 결과를 예측함
    pd_destDate = pd.to_datetime(pd.Timestamp.now() - pd.Timedelta(hours=15.5))
    pd_destDate = pd.to_datetime(pd_destDate.date())

    if start_date is None:
        # TODO: 상장된 종목 리스트 갱신, 충분한 양의 데이터가 쌓인 종목만 선별
        with open('resources/stock_market_data/900140.csv', 'r') as file:
            standard = file.readlines()
        standard = standard[-2].split(
            ",")  # 장 마감 전 업데이트했을 가능성을 고려하여 어제를 갱신 대상에 포함시킴
        pd_startDate = pd.to_datetime(standard[1])
    else:
        pd_startDate = pd.to_datetime(start_date)

    sys_print("증시 데이터 로드를 시작합니다.\n")
    pd_dateRange = pd.date_range(pd_startDate, pd_destDate)
    df_update_all = pd.DataFrame()
    for pd_date in pd_dateRange:
        # pd_date 날짜의 한국거래소 시장 데이터를 불러옵니다.
        df_update = get_market_ohlcv_by_ticker(pd_date)
        if df_update.거래량.sum() == 0:
            sys_print(f"{str(pd_date)} 에는 증시 데이터가 없습니다.\n")
            continue
        df_update = df_update.reset_index()
        df_update = df_update[df_update.시가 >
                              0]  # 거래정지된 종목은 종가를 제외한 column이 0으로 채워짐

        df_update['date'] = pd_date
        df_update_all = df_update_all.append(df_update)

        # 너무 많은 요청 시 IP block을 방지하기 위한 sleep
        timeSleep = 1 + 2 * random()
        sys_print(f"{str(pd_date)} 의 증시 데이터를 로드했습니다 --- {timeSleep:.2f}초 대기\n")
        sleep(timeSleep)

    df_update_all.rename(columns={'티커': '종목코드'},
                         inplace=True)  # TODO: 리소스 자체의 column명을 변경
    sys_print("필요한 증시 데이터 로드 완료.\n")

    for stock_code in stock_list['종목코드'].iloc:
        filename = f'resources/stock_market_data/{stock_code}.csv'
        try:
            update_target = pd.read_csv(filename,
                                        parse_dates=['date'],
                                        index_col=[0])
        except FileNotFoundError:
            continue

        try:
            while pd_startDate <= update_target.date.iloc[-1]:
                update_target = update_target.drop(len(update_target) - 1)
        except IndexError:
            pass  # start_date보다 상장일이 더 최신

        start = len(update_target)
        update_obj = df_update_all[df_update_all['종목코드'] == stock_code]
        update_obj = update_obj[['date', '시가', '고가', '저가', '종가', '거래량']]
        update_obj.columns = ['date', 'open', 'high', 'low', 'close', 'volume']
        update_target = update_target.append(update_obj)
        update_target = update_target.reset_index(drop=True)

        for i in range(start, len(update_target)):
            update_target.pattern1.values[i] = labellingD0(
                update_target.iloc[i])

        lastline = {
            'date': pd.to_datetime(pd_destDate + pd.Timedelta(days=1)),
            'open': -1,
            'high': -1,
            'low': -1,
            'close': -1,
            'volume': -1,
            'pattern1': "XXX"
        }
        update_target = update_target.append(lastline, ignore_index=True)
        update_target.to_csv(filename)
        sys_print(f"{stock_code} 갱신 완료\n")
Ejemplo n.º 14
0
 def test_ohlcv_for_a_day_on_holiday(self):
     df = stock.get_market_ohlcv_by_ticker("20210123")       # Saturday
     self.assertIsInstance(df, pd.DataFrame)
     temp = df[df.columns[1:]]
     self.assertTrue((temp == 0).all(axis=None))
import pandas as pd
from pykrx import stock

# 종가 추가하기 
df1 =pd.read_excel("s-rim-all.xlsx", index_col=0, usecols=["cd", "nm", "gb", "자기자본", "ROE", "유통주식수"])
df2 = stock.get_market_ohlcv_by_ticker("20200420")
종가 = df2["종가"]
종가.index = 'A' + 종가.index 
df1['종가'] = 종가 

# 현재가 추가하기 
df3 = stock.get_market_ohlcv_by_ticker("20201106")
현재가 = df3['종가']
현재가.index = 'A' + 현재가.index
df1['현재가'] = 현재가 

# 요구수익률 필터링
K = 7.89
조건 = df1['ROE'] >= K
df = df1[조건].copy()
df["초과이익"] = df["자기자본"] * (df["ROE"] - K) * 0.01

# 기업가치 
W = 1.0
df["기업가치0"] = df["자기자본"] + df["초과이익"] * (W / (1 + K * 0.01 - W))
W = 0.9
df["기업가치1"] = df["자기자본"] + df["초과이익"] * (W / (1 + K * 0.01 - W))
W = 0.8
df["기업가치2"] = df["자기자본"] + df["초과이익"] * (W / (1 + K * 0.01 - W))
W = 0.7
df["기업가치3"] = df["자기자본"] + df["초과이익"] * (W / (1 + K * 0.01 - W))
Ejemplo n.º 16
0
# https://github.com/sharebook-kr/pykrx
from pykrx import stock
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn import datasets

df = stock.get_market_ohlcv_by_ticker("20210319",
                                      market="KOSPI")  # Kospi의 해당날자 주가정보 뽑기
df = df.sort_values(by=['거래량'], axis=0, ascending=False)  #해당 컬럼의 내림차순으로 정렬
print(df)

# 만들고싶은거:
# 3거래일의 거래량 상위 10프로를 비교하여 증감을 확인
# OBV 계산식도입하여 판단하기 On Balance Volume
#    (1)   If 오늘 주식 종가 > 전날의 주식 종가, 이전까지의 거래량 합산에 오늘 거래량을 합함
#    (2)   If 오늘 주식 종가 < 전날의 주식 종가, 이전까지의 거래량 합산에 오늘 거래량을 뺌

# # # 이거만 바꾸면 상관도 나오는 거!
# X = df.거래량.values
# Y = df.등락률.values

# # 1. 산점도로 육안으로 일단 확인
# plt.scatter(X, Y)
# plt.show()

# # 2. 공분산(covariance) : 2개의 변수의 상관도를 나타내는 값
# cov_value = (np.sum(X*Y)-len(X)*np.mean(X)*np.mean(Y))/len(X)
# print('공분산:', cov_value) # 2.14... ? 양수의 의미는 상승시 상승

# # 3. 상관계수(correlation coeffect) : 공분산을 0~1 사이로 표준화시킨 값 (0 상관없음, 0.3~0.7 뚜렷한 상관, 0.8 이상 절대적인 상관)