Ejemplo n.º 1
0
    def test_ohlcv_query(self):
        # 1 business day
        df = stock.get_market_ohlcv_by_date("20180208", "20180208", "066570")
        self.assertTrue(len(df) == 1)

        # one more business days
        df = stock.get_market_ohlcv_by_date("20180101", "20180208", "066570")
        self.assertIsNotNone(df)

        # None for holiday
        df = stock.get_market_ohlcv_by_date("20190209", "20190209", "066570")
        self.assertTrue(df.empty)
Ejemplo n.º 2
0
 def updateFile(self):
     df = pd.read_csv(
         "data/chart_data/" + self.stock_code + ".csv",
         names=["date", "open", "high", "low", "close", "volume"],
         header=None)
     try:
         dt = datetime.strptime(df.date.iloc[-1], '%Y-%m-%d %H:%M:%S')
     except:
         dt = datetime.strptime(df.date.iloc[-1], '%Y-%m-%d')
     Ndt = dt + timedelta(days=1)
     lastday = Ndt.strftime("%Y%m%d")
     today = datetime.today().strftime("%Y%m%d")
     if int(lastday) < int(datetime.today().strftime("%Y%m%d")):
         df2 = stock.get_market_ohlcv_by_date(lastday, today,
                                              self.stock_code)
         df2 = df2.reset_index()
         df2.rename(columns={
             "날짜": "date",
             "시가": "open",
             "고가": "high",
             "저가": "low",
             "종가": "close",
             "거래량": "volume"
         },
                    inplace=True)
         df_new = pd.concat([df, df2], ignore_index=True)
         df_new.to_csv('./data/chart_data/{}.csv'.format(self.stock_code),
                       sep=',',
                       index=False,
                       header=False)
         print("\n\n{}.csv File Update Complete!".format(self.stock_code))
Ejemplo n.º 3
0
 def get_dataframe_from_previous(self, days=1):
     interval = timedelta(days)
     previous = self.today - interval
     previous_str = previous.strftime("%Y%m%d")
     dataframe = stock.get_market_ohlcv_by_date(previous_str,
                                                self.today_str, self.code)
     return dataframe
Ejemplo n.º 4
0
    def getBasicKOSPI(self, listKOSPI: list):
        logger.info("GetStockInfo - getBasicKOSPI")
        for stockID in listKOSPI:

            for _ in range(CONF.TOTAL_RETRY_FOR_FETCH_FAIL):
                try:
                    startDay = self.setTimeFormat(CF.getStartFetchingDate(datetime.now()), haveSeparator=False)
                    endDay = self.setTimeFormat(datetime.today(), haveSeparator=False)
                    logger.info(f"GetStockInfo - getBasicKOSPI; startDay : {startDay}, endDay : {endDay}")
                    tmpData = stock.get_market_ohlcv_by_date(
                        fromdate=startDay,
                        todate=endDay,
                        ticker=stockID,
                        name_display=False
                    )

                    if not tmpData.empty:
                        self.infoBasicKOSPI[stockID] = tmpData
                        break

                except:pass
                time.sleep(CONF.SLEEP_SECONDS_BETWEEN_RQ)
            else:
                logger.critical(f"GetStockInfo - getBasicKOSPI; Empty Dataframe, ticker : {stockID}")
        logger.info(f"GetStockInfo - getBasicKOSPI; getBasic Total data length : {len(self.infoBasicKOSPI)}")
def pykrx_scratch(date_Start, date_End):
    print("Reading Daily Chart ... {} - {}".format(date_Start, date_End))
    # create main folder
    if not os.path.exists(Krx_Char_folder_path):
        os.mkdir(Krx_Char_folder_path)
    # ticker scratch
    for ticker in stock.get_market_ticker_list(market="ALL"):
        stock_name = stock.get_market_ticker_name(ticker)
        stock_folder_name = stock_name + '_' + ticker
        #print(stock_name, ticker)
        df = stock.get_market_ohlcv_by_date(date_Start, date_End, ticker)
        df = df.reset_index()
        #print(len(df))
        df.insert(5, '종가2', df['종가'])
        # folder check
        if not os.path.exists(Krx_Char_folder_path + '/' + stock_name):
            os.mkdir(Krx_Char_folder_path + '/' + stock_name)
        df.to_csv(Krx_Char_folder_path + '/' + stock_name + '/' + ticker +
                  '.csv',
                  sep=',',
                  na_rep='0',
                  index=False,
                  header=False)
        print('{} Daily chart is written! ==== ticker is : {}'.format(
            stock_name, ticker))
    print('Scratching daily chart is done!')
Ejemplo n.º 6
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.º 7
0
 def _collect_one_daily_info(self, info_type, itemcode_info):
     itemcode, itemname, market = itemcode_info
     table_name = f"{info_type}_{itemcode}_{market}"
     start_date, end_date = self._get_date_filter(table_name)
     df = pd.DataFrame()
     if info_type == 'daily_items_info':
         df = stock.get_market_ohlcv_by_date(start_date.format('YYYYMMDD'),
                                             end_date.format('YYYYMMDD'),
                                             itemcode).rename(
                                                 columns={
                                                     '시가': 'open',
                                                     '고가': 'high',
                                                     '저가': 'low',
                                                     '종가': 'close',
                                                     '거래량': 'volume'
                                                 })
     elif info_type == 'daily_items_indicator_info':
         df = self._get_daily_items_indicator_info(
             itemcode_info, start_date.format('YYYYMMDD'),
             end_date.format('YYYYMMDD'))
     if df.empty:
         raise Exception(f"업데이트할 내용이 없어서 SKIP ({table_name})")
     df = df.reset_index().rename(columns={'날짜': 'date'})
     df.insert(loc=0, column='itemname', value=itemname)
     df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
     start_date = df['date'].min().strftime('%Y-%m-%d')
     self.bigquery_worker.delete_duplicated_rows(table_name, start_date)
     func = self.bigquery_worker.save_daily_item_info if info_type == 'daily_items_info' \
         else self.bigquery_worker.save_daily_item_indicator_info
     func(itemcode_info, df, bigquery.WriteDisposition.WRITE_APPEND)
Ejemplo n.º 8
0
def get_market_price(nowDate, companies, codes):
    Prices, Volumes=[],[]
    for i in range(len(companies)):
        df = stock.get_market_ohlcv_by_date(nowDate,nowDate,codes[i])
        L=list(df.iloc[0])
        Prices.append(L[3])
        Volumes.append(L[4])
    return Prices, Volumes
Ejemplo n.º 9
0
def dataset_loaderKR(stock_name, start, end, train_ratio=0.7):
    dataset = stock.get_market_ohlcv_by_date("".join(start.split('-')),
                                             "".join(end.split('-')),
                                             stock_name.split('.KR')[0])
    dataset['Close'] = dataset['종가']
    date_split = str(dataset.index[int(train_ratio * len(dataset))])

    return dataset[:date_split], dataset[date_split:], date_split
Ejemplo n.º 10
0
def Daily_Crawling(start_date: str, end_date: str, code: str):
    # 위 순서대로
    df_market_cap = stock.get_market_cap_by_date(start_date, end_date, code)
    df_ohlcv = stock.get_market_ohlcv_by_date(start_date, end_date, code)
    df_fundamental = stock.get_market_fundamental_by_date(
        start_date, end_date, code)
    df = pd.concat([df_market_cap.iloc[:, 0], df_ohlcv, df_fundamental],
                   axis=1)
    return df
Ejemplo n.º 11
0
 def makeNewFile(self):
     df = stock.get_market_ohlcv_by_date("19990101", "20201231",
                                         self.stock_code)
     df = df.reset_index()
     df.to_csv('./data/chart_data/{}.csv'.format(self.stock_code),
               sep=',',
               index=False,
               header=False)
     print("\n\n{}.csv File Generation Complete!".format(self.stock_code))
Ejemplo n.º 12
0
 def test_ohlcv_format(self):
     target = "20180208"
     df = stock.get_market_ohlcv_by_date(target, target, "066570")
     self.assertEqual(type(df.index[0]), pandas.Timestamp)
     self.assertEqual(type(df['시가'].iloc[0]), np.int32)
     self.assertEqual(type(df['고가'].iloc[0]), np.int32)
     self.assertEqual(type(df['저가'].iloc[0]), np.int32)
     self.assertEqual(type(df['종가'].iloc[0]), np.int32)
     self.assertEqual(type(df['거래량'].iloc[0]), np.int32)
Ejemplo n.º 13
0
    def download_data(cls, save_dir='./data/kospi'):
        save_dir = path.join(utils.get_original_cwd(), save_dir)
        os.makedirs(save_dir, exist_ok=True)

        codes, names = cls.metadata()
        for code in codes:
            df = stock.get_market_ohlcv_by_date('19000101', '20300101', code)
            df.to_csv(path.join(save_dir, f'{names[code]}_{code}.csv'))
            time.sleep(1)
Ejemplo n.º 14
0
def get_SAMSUNG_dataframe():
    start_date = '2020-09-01'
    end_date = '2021-03-01'
    # investing.com 양식, ex) dd/mm/yyyy
    start_date_ = start_date[8:] + '/' + start_date[5:7] + '/' + start_date[:4]
    end_date_ = end_date[8:] + '/' + end_date[5:7] + '/' + end_date[:4]

    # krx 양식 ex) yyyymmdd
    start_date__ = start_date[0:4] + start_date[5:7] + start_date[8:10]
    end_date__ = end_date[0:4] + end_date[5:7] + end_date[8:10]
    model_samsung = pd.DataFrame()

    # S&P 500
    snp_500_ = yf.download("^GSPC", start=start_date, end=end_date)
    snp_500_.columns = [
        'snp_500_Open', 'snp_500_High', 'snp_500_Low', 'snp_500_Close',
        'snp_500_Adj Close', 'snp_500_Volume'
    ]
    snp_500_ = snp_500_.drop([
        'snp_500_Open', 'snp_500_High', 'snp_500_Low', 'snp_500_Adj Close',
        'snp_500_Volume'
    ],
                             axis=1)

    # 삼성 차트 데이터
    sam_ = stock.get_market_ohlcv_by_date(start_date__, end_date__, "005930")
    sam_.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
    model_samsung = sam_.copy()

    # SOX 지수 엔비디아(8.9%), 텍사스인스트루먼트(8.6%), 퀄컴(7.7%), 인텔(7.4%) 반도체장비기업 18.52%
    SOXX = yf.download("SOXX", start=start_date, end=end_date)
    SOXX.columns = [
        'SOXX_Open', 'SOXX_High', 'SOXX_Low', 'SOXX_Close', 'SOXX_Adj Close',
        'SOXX_Volume'
    ]
    SOXX = SOXX.drop([
        'SOXX_Open', 'SOXX_High', 'SOXX_Low', 'SOXX_Adj Close', 'SOXX_Volume'
    ],
                     axis=1)
    model_samsung['SNP500'] = snp_500_
    model_samsung['SOXX'] = SOXX
    model_samsung = model_samsung.dropna()  # 결측치가 있는 행 제거
    maxClose = model_samsung['Close'].max()
    maxSNP500 = model_samsung['SNP500'].max()
    maxSOXX = model_samsung['SOXX'].max()
    model_samsung["rev_Close"] = maxClose - model_samsung['Close']
    model_samsung["rev_SNP500"] = maxSNP500 - model_samsung['SNP500']
    model_samsung["rev_SOXX"] = maxSOXX - model_samsung['SOXX']
    # 차트 비교분석을 위한 정규화

    min_max_scaler = MinMaxScaler()
    fitted = min_max_scaler.fit(model_samsung)
    output = min_max_scaler.transform(model_samsung)
    output = pd.DataFrame(output,
                          columns=model_samsung.columns,
                          index=list(model_samsung.index.values))
    return output, model_samsung
Ejemplo n.º 15
0
 def test_io_for_n_day(self):
     df = stock.get_market_ohlcv_by_date("20200701", "20200717", "005930")
     self.assertIsNotNone(df)
     self.assertIsInstance(df.index[0], pandas.Timestamp)
     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.int32)
def get_stock_df(start_date, end_date, stock_code):
    stock_df = stock.get_market_ohlcv_by_date(start_date, end_date, stock_code)
    stock_df.reset_index(inplace=True)

    stock_df["종목코드"] = stock_code
    stock_df.drop(['시가', '고가', '저가', '거래량'], axis=1, inplace=True)

    stock_df = stock_df[["종목코드", "날짜", "종가"]]
    stock_df.columns = ["stock_code", "stock_date", "close_price"]

    return stock_df
Ejemplo n.º 17
0
    def test_not_empty_result(self):
        df = stock.get_market_ohlcv_by_date("20190225", "20190228", "000660")
        self.assertNotEqual(df.empty, True)

        df = stock.get_market_price_change_by_ticker("20180301", "20180320")
        self.assertNotEqual(df.empty, True)

        df = stock.get_market_fundamental_by_ticker("20180305", "KOSPI")
        self.assertNotEqual(df.empty, True)

        df = stock.get_market_fundamental_by_date("20180301", "20180320",
                                                  '005930')
        self.assertNotEqual(df.empty, True)
Ejemplo n.º 18
0
 def test_ohlcv_simple_call(self):
     df = stock.get_market_ohlcv_by_date("20210118", "20210126", "005930")
     #              시가   고가   저가   종가    거래량
     # 날짜
     # 2021-01-18  86600  87300  84100  85000  43227951
     # 2021-01-19  84500  88000  83600  87000  39895044
     # 2021-01-20  89000  89000  86500  87200  25211127
     # 2021-01-21  87500  88600  86500  88100  25318011
     # 2021-01-22  89000  89700  86800  86800  30861661
     temp = df.iloc[0:5, 0] == np.array([86600, 84500, 89000, 87500, 89000])
     self.assertEqual(temp.sum(), 5)
     self.assertIsInstance(df.index   , pd.core.indexes.datetimes.DatetimeIndex)
     self.assertIsInstance(df.index[0], pd._libs.tslibs.timestamps.Timestamp)
     self.assertTrue(df.index[0] < df.index[-1])
Ejemplo n.º 19
0
def make_band_data(option):
    # st.write(option)
    #오늘날짜까지
    now = datetime.now()
    today = '%s%s%s' % (now.year, now.month, now.day)
    fun_df = stock.get_market_fundamental_by_date("20080101", today, option,
                                                  "m")

    #Price 추가 => 이것의 문제는 수정주가가 아님
    # fun_df['Close'] = fun_df['PER'] * fun_df['EPS']

    #Price 수정 주가로 변경
    p_df = stock.get_market_ohlcv_by_date("20080101", today, option, "m")
    fun_df['Close'] = p_df['종가']

    #PER Max/Min/half/3/1
    e_max = round(fun_df['PER'].max(), 1)
    if (e_max >= 30.00):
        e_max = 30.00
    e_min = round(fun_df['PER'].min(), 1)
    e_half = round((e_max + e_min) / 2, 1)
    e_3 = round((e_max - e_half) / 2 + e_half, 1)
    e_1 = round((e_half - e_min) / 2 + e_min, 1)

    #가격 데이터 만들기
    fun_df[str(e_max) + "X"] = (fun_df['EPS'] * e_max).round(2)
    fun_df[str(e_3) + "X"] = (fun_df['EPS'] * e_3).round(2)
    fun_df[str(e_half) + "X"] = (fun_df['EPS'] * e_half).round(2)
    fun_df[str(e_1) + "X"] = (fun_df['EPS'] * e_1).round(2)
    fun_df[str(e_min) + "X"] = (fun_df['EPS'] * e_min).round(2)

    #PBR Max/Min/half/3/1
    b_max = round(fun_df['PBR'].max(), 1)
    if (b_max >= 20.00):
        b_max = 20.00
    b_min = round(fun_df['PBR'].min(), 1)
    b_half = round((b_max + b_min) / 2, 1)
    b_3 = round((b_max - b_half) / 2 + b_half, 1)
    b_1 = round((b_half - b_min) / 2 + b_min, 1)

    #가격 데이터 만들기
    fun_df[str(b_max) + "X"] = fun_df['BPS'] * b_max
    fun_df[str(b_3) + "X"] = (fun_df['BPS'] * b_3).round(2)
    fun_df[str(b_half) + "X"] = (fun_df['BPS'] * b_half).round(2)
    fun_df[str(b_1) + "X"] = (fun_df['BPS'] * b_1).round(2)
    fun_df[str(b_min) + "bX"] = (fun_df['BPS'] * b_min).round(2)

    fun_df.round(decimals=2)

    return fun_df
Ejemplo n.º 20
0
    def generate_train_data(self, n, left_date, right_date, train_len,
                            result_len, code_list):
        x_list = []
        y_closing_list = []
        y_highest_list = []

        while True:
            if len(x_list) == n:
                break

            duration = (datetime.strptime(right_date, '%Y%m%d') -
                        datetime.strptime(left_date, '%Y%m%d')).days
            rand_offset = random.randrange(0, duration)

            start_date = datetime.strptime(
                left_date, '%Y%m%d') + dt.timedelta(days=rand_offset)
            end_date = (start_date + dt.timedelta(
                days=(train_len + result_len) * 2)).strftime("%Y%m%d")
            start_date = start_date.strftime("%Y%m%d")
            rand_code = code_list[random.randrange(0, len(code_list))]
            price_data = st.get_market_ohlcv_by_date(start_date, end_date,
                                                     rand_code)

            if len(price_data['종가']) < train_len + result_len:
                continue

            closing_price_norm = price_data['종가'] / np.max(
                price_data['종가'][:train_len])
            highest_price_norm = price_data['고가'] / np.max(
                price_data['종가'][:train_len])

            train_data = closing_price_norm[:train_len]
            raw_closing_data = closing_price_norm[train_len:train_len +
                                                  result_len]
            raw_highest_data = highest_price_norm[train_len:train_len +
                                                  result_len]

            x_list.append(train_data)
            y_closing_list.append(raw_closing_data)
            y_highest_list.append(raw_highest_data)

        x_list = np.array(x_list)
        y_closing_list = np.array(y_closing_list)
        y_highest_list = np.array(y_highest_list)

        return x_list, y_closing_list, y_highest_list
Ejemplo n.º 21
0
    def test_not_empty_result(self):
        df = stock.get_market_ohlcv_by_date("20190225", "20190228", "000660")
        self.assertFalse(df.empty)

        df = stock.get_market_cap_by_date("20190101", "20190131", "005930")
        self.assertFalse(df.empty)

        df = stock.get_market_cap_by_ticker("20200625")
        self.assertFalse(df.empty)

        df = stock.get_market_price_change_by_ticker("20180301", "20180320")
        self.assertFalse(df.empty)

        df = stock.get_market_fundamental_by_ticker("20180305", "KOSPI")
        self.assertFalse(df.empty)

        df = stock.get_market_fundamental_by_date("20180301", "20180320", '005930')
        self.assertFalse(df.empty)
Ejemplo n.º 22
0
def get_top_volume_by_date(Date, ticker_list, top=500):
    '''
    파라미터: Date > "YYYYmmdd" 문자열 형식, 개장일 날짜로 보장되어야 함 
              ticker_list > 종목 코드(문자열 형식) 리스트
              top(default=500) > 거래량 상위로부터 top개 까지 반환
              
    date 날짜에 ticker_list 안 모든 종목에 대하여 
    거래량 상위 top개 종목코드 리스트 형태로 반환
    '''
    volumes = []

    for ticker in ticker_list:
        vol = stock.get_market_ohlcv_by_date(Date, Date, ticker)

        if (len(vol.index) > 0):
            volumes.append((ticker, vol['거래량'][0]))

    volumes.sort(key=lambda x: -x[1])

    return list(x[0] for x in volumes[0:top])
Ejemplo n.º 23
0
def insertQuotes(stockCode, startDate, endDate, source='yahoo'):
    df = stock.get_market_ohlcv_by_date(startDate, endDate, stockCode)
    dfMarketCap = stock.get_market_cap_by_date(startDate, endDate, stockCode)

    df['stock_code'] = stockCode
    df['date'] = df.index
    df['market_cap'] = dfMarketCap['시가총액']
    df['num_stocks'] = dfMarketCap['상장주식수']
    df = df.rename(columns={
        '고가': 'high',
        '저가': 'low',
        '시가': 'open',
        '종가': 'close',
        '거래량': 'volume'
    })
    df = df[[
        'stock_code', 'date', 'open', 'high', 'low', 'close', 'volume',
        'market_cap', 'num_stocks'
    ]]

    with sl.connect(config.dbName) as con:
        df.to_sql('QUOTES', con, if_exists='replace', index=False)
Ejemplo n.º 24
0
def get_n_ATR(Date, n, tickercode):
    '''
    파라미터: n > n ATR 의 n 입력. 정수 형태
              date > 조회할 날짜 "YYYYmmdd" 문자열 형태로 입력
                     개장일으로 보장되어야 함
              tickercode > 조회할 종목 코드 문자열 형태로 입력
              
    diff_today_hl= 오늘 고가-저가
    diff_yester_today_ch= 전일 종가-오늘 고가
    diff_yester_today_cl= 전일 종가-오늘 저가
    
    입력한 종목에 대하여 date 로 부터 n ATR 반환
    n+1 일의 데이터가 없으면 -1 반환
    '''

    nday = get_ndays_ago_from_date(Date, n)
    OHLCV = stock.get_market_ohlcv_by_date(nday, Date, tickercode)

    if (len(OHLCV.index) != n + 1):
        return -1

    ATR = 0

    for i in range(n, 0, -1):
        ohlcv = OHLCV.iloc[i]
        prev_c = OHLCV.iloc[i - 1]['종가']

        diff_today_hl = abs(ohlcv['고가'] - ohlcv['저가'])
        diff_yester_today_ch = abs(prev_c - ohlcv['고가'])
        diff_yester_today_cl = abs(prev_c - ohlcv['저가'])

        TR = max(diff_today_hl, diff_yester_today_ch)
        TR = max(TR, diff_yester_today_cl)

        ATR += TR

    ATR = ATR / n

    return (ATR)
Ejemplo n.º 25
0
from pykrx import stock

samsung_df = stock.get_market_ohlcv_by_date("20180101", "20190531", "005930")
lge_df = stock.get_market_ohlcv_by_date("20180101", "20190531", "066570")

print(samsung_df.head())
print(lge_df.head())
Ejemplo n.º 26
0
    def get_stock_by_day(code, start_date):
        start_date_no_bar = collect_data.bar_remover(start_date)
        start_date = start_date

        # end_date는 오늘 날짜로 고정
        today = datetime.datetime.today().strftime(
            '%Y%m%d')  # krx는 YYYYMMDD 형식, 야후는 YYYY-MM-DD 형식
        stock_df = stock.get_market_ohlcv_by_date(
            start_date_no_bar, today, code, adjusted=True)  # 시가 고가 저가 종가 거래량
        stock_df2 = stock.get_market_fundamental_by_date(
            start_date_no_bar, today, code)  # DIV BPS PER EPS PBR
        today_pdr = datetime.datetime.today().strftime('%Y-%m-%d')
        gold = pdr.get_data_yahoo('GC=F', start=start_date,
                                  end=today_pdr)[['Adj Close', 'Volume']]  # 금값
        gold.columns = ['Adj Close_gold', 'Volume_gold']
        nikkei = pdr.DataReader('^N225',
                                'yahoo',
                                start=start_date,
                                end=today_pdr)[['Adj Close',
                                                'Volume']]  # 일본 지수
        nikkei.columns = ['Adj Close_nikkei', 'Volume_nikkei']
        crude_oil = pdr.get_data_yahoo('CL=F', start=start_date,
                                       end=today_pdr)[['Adj Close',
                                                       'Volume']]  # 유가
        crude_oil.columns = ['Adj Close_oil', 'Volume_oil']
        change = pd.Series(
            pdr.get_data_yahoo('KRW=X', start=start_date,
                               end=today_pdr)['Adj Close'])  # 환율
        # 데이터 leftjoin
        data = pd.concat([stock_df, stock_df2], axis=1)
        data = pd.merge(data,
                        gold,
                        how='left',
                        left_index=True,
                        right_index=True)
        data = pd.merge(data,
                        nikkei,
                        how='left',
                        left_index=True,
                        right_index=True)
        data = pd.merge(data,
                        crude_oil,
                        how='left',
                        left_index=True,
                        right_index=True)
        data = pd.merge(data,
                        change,
                        how='left',
                        left_index=True,
                        right_index=True)
        data.columns = [
            '시가', '고가', '저가', '종가', '거래량', 'DIV', 'BPS', 'PER', 'EPS', 'PBR',
            'Adj Close_gold', 'Volume_gold', 'Adj Close_nikkei',
            'Volume_nikkei', 'Adj Close_oil', 'Volume_oil', 'Adj Close_change'
        ]
        # 기존에 사용했던 가장 최근의 값으로 채우는 방법 이거 쓰면 거의 다날라감
        data = data.fillna(method="pad")
        # 주가 자체의 값이 아니라 등락율을 구하기로 해서 다음날과 비교해서 올라가면 1 아니면 0 마지막날은 그대로
        for i in range(len(data['종가'])):
            if i == 0:
                continue
            elif i > 0 and i < (len(data['종가']) - 1):
                if data['종가'][i] < data['종가'][(i + 1)]:
                    data['종가'][i] = 1
                else:
                    data['종가'][i] = 0
            else:
                pass
        return data
Ejemplo n.º 27
0
    def getTimeseriesData(self, analyezdData):
        from_date = '20200331'
        to_date = '20210226'
        from_date_str = '{}-{}-{}'.format(from_date[:4], from_date[4:6], from_date[6:])
        to_date_str = '{}-{}-{}'.format(to_date[:4], to_date[4:6], to_date[6:])
        price = []
        rate = []
        price.append(['날짜']+list(stock.get_market_ohlcv_by_date(from_date, to_date, "005930").index.astype('str')))
        rate.append(['날짜']+list(stock.get_market_ohlcv_by_date(from_date, to_date, "005930").index.astype('str')))

        for i in range(analyezdData.shape[0]):
            df = stock.get_market_ohlcv_by_date(from_date, to_date, analyezdData['종목코드'][i])
            df['rate'] = ((np.array(df['종가']) - df['종가'][from_date_str]) / df['종가'][from_date_str])*100

            price.append([analyezdData['종목코드'][i]]+list(stock.get_market_ohlcv_by_date(from_date, to_date, analyezdData['종목코드'][i])['종가']))
            rate.append([analyezdData['종목코드'][i]]+list(df['rate']))

        # 코스피 종목수 934
        df = fdr.DataReader('KS11', from_date, to_date)
        df['rate'] = ((np.array(df['Close']) - df['Close'][from_date_str]) / df['Close'][from_date_str])*100
        price.append(['KOSPI']+list(df['Close']))
        rate.append(['KOSPI']+list(df['rate'])) 

        # 코스닥 종목수 1,471
        df = fdr.DataReader('KQ11', from_date, to_date)
        df['rate'] = ((np.array(df['Close']) - df['Close'][from_date_str]) / df['Close'][from_date_str])*100
        price.append(['KOSDAQ']+list(df['Close']))
        rate.append(['KOSDAQ']+list(df['rate'])) 

        
        price = pd.DataFrame(price[1:], columns=price[0])
        rate = pd.DataFrame(rate[1:], columns=rate[0])

        # 지표평균
        mean_list = []
        for c in rate.columns[1:]:
            kospi = rate[rate['날짜']=='KOSPI'][c].iloc[0]
            kosdaq = rate[rate['날짜']=='KOSDAQ'][c].iloc[0]
            mean_list.append((kospi*934 + kosdaq*1471)/2405) # kospi, kosdaq, 지표평균은 빼고
        rate = rate.append(pd.Series(['KOS_MEAN']+mean_list, index=rate.columns), ignore_index=True)

        # 종목평균
        mean_list = []
        for c in rate.columns[1:]:
            mean_list.append(rate[c][:-3].mean()) # kospi, kosdaq, 지표평균은 빼고
        rate = rate.append(pd.Series(['CODE_MEAN']+mean_list, index=rate.columns), ignore_index=True)



        count_list = []
        tmp = rate.iloc[:-4]  # kospi, kosdaq, 지표평균, 종목평균은 빼고
        for c in rate.columns[1:]:
            count_list.append(tmp[tmp[c] > rate[rate[rate.columns[0]]=='KOS_MEAN'][c].iloc[0]].shape[0])
        count_list = list(np.array(count_list) / (rate.shape[0] - 4))
        rate = rate.append(pd.Series(['COUNT']+count_list, index=rate.columns), ignore_index=True)

        compare = rate.iloc[-5:]
        compare = pd.DataFrame(compare.transpose()).reset_index(drop=False)
        compare.columns = compare.iloc[0]
        compare = compare.iloc[1:]

        return [price, rate, compare]
Ejemplo n.º 28
0
from pykrx import stock
from cx_Oracle import connect
import os
LOCATION = r"D:\instantclient_19_6"
os.environ["PATH"] = LOCATION + ";" + os.environ["PATH"]

#https://github.com/sharebook-kr/pykrx
#https://jsideas.net/daily_to_weekly/

con = connect("hoijoo/[email protected]:1521/xe")
cur = con.cursor()

tickers = stock.get_market_ticker_list()
print(tickers)
for i in tickers:
    s = stock.get_market_ohlcv_by_date("20201008", "20201012", i, "d", True)
    stockcode = i
    print("=======")
    print(i)
#     print(s)
    
    endPrice = str(s['종가']).split("\n")
    startPrice = str(s['시가']).split("\n")
    highPrice = str(s['고가']).split("\n")
    lowPrice = str(s['저가']).split("\n")
    amount = str(s['거래량']).split("\n")
    for i in range(1, (len(endPrice) - 1)):
        date = str(s.index[i-1]).split(" ")
        print(date[0])
        endPrice1 = endPrice[i].split("    ")
        startPrice1 = startPrice[i].split("    ")
Ejemplo n.º 29
0
 def test_io_for_month(self):
     df = stock.get_market_ohlcv_by_date("20200101", "20200630", "005930",
                                         "m")
     self.assertIsNotNone(df)
     self.assertEqual(len(df), 6)
Ejemplo n.º 30
0
 def test_ohlcv_for_a_day(self):
     df = stock.get_market_ohlcv_by_date("20210118", "20210118", "005930")
     self.assertIsInstance(df, pd.DataFrame)
     self.assertEqual(len(df), 1)