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 inYYYYMMDDformat (string)todate— End date inYYYYMMDDformat (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
| Korean | English | Description |
|---|---|---|
| 시가 | Open | Opening price |
| 고가 | High | Highest price |
| 저가 | Low | Lowest price |
| 종가 | Close | Closing price |
| 거래량 | Volume | Trading 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
| Feature | pykrx | KIS API |
|---|---|---|
| Historical data | ✅ Excellent | ✅ Good |
| Real-time data | ❌ No | ✅ Yes |
| Setup required | None | Brokerage account |
| Rate limits | Unofficial | Official |
| Best for | Research, backtesting | Live trading |
Key Takeaways
get_market_ohlcv_by_dateis 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_listto find the right ticker