What is get_market_ohlcv_by_date?

get_market_ohlcv_by_date is one of the most commonly used functions in the pykrx library. It retrieves OHLCV (Open, High, Low, Close, Volume) data for a specific Korean stock ticker over a date range.

Installation

pip install pykrx

Basic Syntax

from pykrx import stock

df = stock.get_market_ohlcv_by_date(fromdate, todate, ticker)

Parameters:

  • fromdate — Start date in YYYYMMDD format (string)
  • todate — End date in YYYYMMDD format (string)
  • ticker — Korean stock ticker (e.g., "005930" for Samsung Electronics)

Basic Example

from pykrx import stock

# Get Samsung Electronics (005930) data for 2024
df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")

print(df.head())

Output:

            시가    고가    저가    종가      거래량
날짜                                              
2024-01-02  72800  74200  72200  73400   9821547
2024-01-03  73000  73800  72400  72700   8234521
2024-01-04  72500  73100  71800  72100  10123456

Column Names Explained

KoreanEnglishDescription
시가OpenOpening price
고가HighHighest price
저가LowLowest price
종가CloseClosing price
거래량VolumeTrading volume

Get English Column Names

from pykrx import stock

df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")

# Rename to English
df.columns = ["Open", "High", "Low", "Close", "Volume"]
print(df.head())

Real-World Examples

Example 1: Get Last 30 Days of Data

from pykrx import stock
from datetime import datetime, timedelta

today = datetime.now().strftime("%Y%m%d")
month_ago = (datetime.now() - timedelta(days=30)).strftime("%Y%m%d")

# SK Hynix (000660)
df = stock.get_market_ohlcv_by_date(month_ago, today, "000660")
print(f"SK Hynix - Last 30 days")
print(f"Highest price: {df['고가'].max():,} KRW")
print(f"Lowest price: {df['저가'].min():,} KRW")
print(f"Average volume: {df['거래량'].mean():,.0f}")

Example 2: Calculate Moving Averages

from pykrx import stock
import pandas as pd

df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")
df.columns = ["Open", "High", "Low", "Close", "Volume"]

# Calculate moving averages
df["MA5"] = df["Close"].rolling(window=5).mean()
df["MA20"] = df["Close"].rolling(window=20).mean()
df["MA60"] = df["Close"].rolling(window=60).mean()

print(df[["Close", "MA5", "MA20", "MA60"]].tail(10))

Example 3: Find Best and Worst Days

from pykrx import stock

df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")

# Calculate daily returns
df["return"] = (df["종가"] - df["시가"]) / df["시가"] * 100

# Best day
best_day = df["return"].idxmax()
print(f"Best day: {best_day.strftime('%Y-%m-%d')} ({df.loc[best_day, 'return']:.2f}%)")

# Worst day
worst_day = df["return"].idxmin()
print(f"Worst day: {worst_day.strftime('%Y-%m-%d')} ({df.loc[worst_day, 'return']:.2f}%)")

Example 4: Volume Analysis

from pykrx import stock

df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")

avg_volume = df["거래량"].mean()

# Find days with unusually high volume (2x average)
high_volume_days = df[df["거래량"] > avg_volume * 2]
print(f"High volume days: {len(high_volume_days)}")
print(high_volume_days[["종가", "거래량"]].head())

Example 5: Multiple Stocks Comparison

from pykrx import stock
import pandas as pd

tickers = {
    "005930": "Samsung",
    "000660": "SK Hynix",
    "373220": "LG Energy Solution"
}

results = {}
for ticker, name in tickers.items():
    df = stock.get_market_ohlcv_by_date("20240101", "20241231", ticker)
    start_price = df["종가"].iloc[0]
    end_price = df["종가"].iloc[-1]
    annual_return = (end_price - start_price) / start_price * 100
    results[name] = annual_return

for name, ret in results.items():
    print(f"{name}: {ret:.2f}%")

Common Errors and Fixes

Error 1: Empty DataFrame

# Wrong - future date or holiday
df = stock.get_market_ohlcv_by_date("20251231", "20251231", "005930")
# Returns empty DataFrame

# Fix - check if market was open
if df.empty:
    print("No data - market may have been closed on this date")

Error 2: Wrong Date Format

# Wrong
df = stock.get_market_ohlcv_by_date("2024-01-01", "2024-12-31", "005930")

# Correct - no dashes
df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")

Error 3: Invalid Ticker

# Wrong ticker
df = stock.get_market_ohlcv_by_date("20240101", "20241231", "SAMSUNG")

# Correct - use KRX ticker number
df = stock.get_market_ohlcv_by_date("20240101", "20241231", "005930")

How to Find Korean Stock Tickers

from pykrx import stock

# Get all KOSPI tickers
kospi_tickers = stock.get_market_ticker_list(market="KOSPI")
kosdaq_tickers = stock.get_market_ticker_list(market="KOSDAQ")

# Find ticker by name
def find_ticker(name_keyword):
    all_tickers = stock.get_market_ticker_list(market="KOSPI") + \
                  stock.get_market_ticker_list(market="KOSDAQ")
    for ticker in all_tickers:
        if name_keyword in stock.get_market_ticker_name(ticker):
            print(f"{ticker}: {stock.get_market_ticker_name(ticker)}")

find_ticker("삼성")

pykrx vs KIS API for OHLCV Data

FeaturepykrxKIS API
Historical data✅ Excellent✅ Good
Real-time data❌ No✅ Yes
Setup requiredNoneBrokerage account
Rate limitsUnofficialOfficial
Best forResearch, backtestingLive trading

Key Takeaways

  • get_market_ohlcv_by_date is the go-to function for Korean stock historical data
  • Date format must be YYYYMMDD (no dashes)
  • Column names are in Korean by default — rename for easier use
  • Returns empty DataFrame for holidays or invalid dates
  • Use alongside get_market_ticker_list to find the right ticker

Next Steps