Skip to main content

python wrapper for korea broker's REST API services

Project description

๐Ÿš€ Korea Investment Stock

PyPI version Python Versions License: MIT

ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ OpenAPI๋ฅผ ์œ„ํ•œ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Rate Limiting, ์ž๋™ ์žฌ์‹œ๋„, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋“ฑ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒŸ ์ฃผ์š” ํŠน์ง•

โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ์™„์ „ํ•œ ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ API ์ง€์›: ๊ตญ๋‚ด/ํ•ด์™ธ ์ฃผ์‹ ์กฐํšŒ, ์ฃผ๋ฌธ, ์ž”๊ณ  ํ™•์ธ
  • ์ž๋™ Rate Limiting: API ํ˜ธ์ถœ ์ œํ•œ(์ดˆ๋‹น 20ํšŒ)์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ
  • ์Šค๋งˆํŠธ ์žฌ์‹œ๋„: Exponential Backoff์™€ Circuit Breaker ํŒจํ„ด ๊ตฌํ˜„
  • ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ: ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ตœ์ ํ™”๋œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
  • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง: ์ƒ์„ธํ•œ ํ†ต๊ณ„ ๋ฐ ์„ฑ๋Šฅ ์ถ”์ 

๐Ÿ›ก๏ธ ์•ˆ์ •์„ฑ

  • ์—๋Ÿฌ์œจ 0%: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๊ฒ€์ฆ๋œ ์•ˆ์ •์„ฑ
  • ์ž๋™ ์—๋Ÿฌ ๋ณต๊ตฌ: ์ผ์‹œ์  ์˜ค๋ฅ˜ ์ž๋™ ์ฒ˜๋ฆฌ
  • Thread-Safe: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ์ง€์›

๐Ÿ“ฆ ์„ค์น˜

pip install korea-investment-stock

์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.9 ์ด์ƒ
  • ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ API ๊ณ„์ •

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

from korea_investment_stock import KoreaInvestment

# API ์ธ์ฆ ์ •๋ณด
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
account_no = "12345678-01"

# ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ
broker = KoreaInvestment(
    api_key=api_key,
    api_secret=api_secret,
    acc_no=account_no,
    mock=False  # ์‹ค๊ฑฐ๋ž˜: False, ๋ชจ์˜ํˆฌ์ž: True
)

# ํ˜„์žฌ๊ฐ€ ์กฐํšŒ
price_info = broker.fetch_price("005930")  # ์‚ผ์„ฑ์ „์ž
print(f"ํ˜„์žฌ๊ฐ€: {price_info['output']['stck_prpr']}์›")

# ์ž”๊ณ  ์กฐํšŒ
balance = broker.fetch_balance()
print(balance)

Context Manager ์‚ฌ์šฉ (๊ถŒ์žฅ)

from korea_investment_stock import KoreaInvestment

with KoreaInvestment(api_key, api_secret, account_no) as broker:
    # ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ
    price = broker.fetch_price("005930")
    # ... ์ž‘์—… ์ˆ˜ํ–‰
# ์ž๋™์œผ๋กœ broker.shutdown() ํ˜ธ์ถœ๋จ

๐Ÿ“Š ์ฃผ์š” ๊ธฐ๋Šฅ

1. ์ฃผ์‹ ์ •๋ณด ์กฐํšŒ

# ๊ตญ๋‚ด ์ฃผ์‹ ํ˜„์žฌ๊ฐ€
price = broker.fetch_price("005930")

# ํ•ด์™ธ ์ฃผ์‹ ํ˜„์žฌ๊ฐ€
oversea_price = broker.fetch_oversea_price("AAPL", "NASD")

# ์ผ๋ด‰ ๋ฐ์ดํ„ฐ
daily_price = broker.fetch_daily_price("005930")

# ์—ฌ๋Ÿฌ ์ข…๋ชฉ ๋™์‹œ ์กฐํšŒ
stock_list = [("005930", "KR"), ("000660", "KR"), ("035720", "KR")]
prices = broker.fetch_price_list(stock_list)

2. ์ฃผ๋ฌธ ๋ฐ ์ž”๊ณ 

# ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜
order = broker.create_market_buy_order("005930", 10)  # 10์ฃผ

# ์ง€์ •๊ฐ€ ๋งค์ˆ˜
order = broker.create_limit_buy_order("005930", 60000, 5)  # 60,000์›์— 5์ฃผ

# ์ฃผ๋ฌธ ์ทจ์†Œ
cancel = broker.cancel_order(
    order_org_no="91252",
    order_no="0000117057", 
    order_type="00",
    price=60000,
    qty=5,
    all_qty="Y"
)

# ์ž”๊ณ  ์กฐํšŒ
balance = broker.fetch_balance()

3. ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ (๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ)

# 100๊ฐœ ์ข…๋ชฉ ์กฐํšŒ
large_stock_list = [(f"{i:06d}", "KR") for i in range(1, 101)]

# ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ
results = broker.fetch_price_list_with_batch(
    large_stock_list,
    batch_size=20,       # 20๊ฐœ์”ฉ ์ฒ˜๋ฆฌ
    batch_delay=1.0,     # ๋ฐฐ์น˜ ๊ฐ„ 1์ดˆ ๋Œ€๊ธฐ
    progress_interval=10 # ์ง„ํ–‰์ƒํ™ฉ ์ถœ๋ ฅ
)

# ๋™์  ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ (์—๋Ÿฌ์œจ์— ๋”ฐ๋ผ ์ž๋™ ์กฐ์ •)
results = broker.fetch_price_list_with_dynamic_batch(large_stock_list)

4. Rate Limiting ๊ด€๋ฆฌ

# Rate Limiter ํ†ต๊ณ„ ํ™•์ธ
broker.rate_limiter.print_stats()

# ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
stats = broker.rate_limiter.get_stats()
print(f"์ด ํ˜ธ์ถœ: {stats['total_calls']}")
print(f"์—๋Ÿฌ์œจ: {stats['error_rate']:.1%}")
print(f"ํ‰๊ท  ๋Œ€๊ธฐ์‹œ๊ฐ„: {stats['avg_wait_time']:.3f}์ดˆ")

# ํ†ต๊ณ„ ์ €์žฅ
broker.rate_limiter.save_stats()

5. ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

# Circuit Breaker ์ƒํƒœ ํ™•์ธ
from korea_investment_stock.rate_limiting import get_backoff_strategy

backoff = get_backoff_strategy()
state = backoff.get_stats()['state']  # CLOSED, OPEN, HALF_OPEN

# ์—๋Ÿฌ ๋ณต๊ตฌ ์‹œ์Šคํ…œ
from korea_investment_stock.error_handling import get_error_recovery_system

recovery = get_error_recovery_system()
summary = recovery.get_error_summary(hours=1)
print(f"์ตœ๊ทผ 1์‹œ๊ฐ„ ์—๋Ÿฌ: {summary['total_errors']}๊ฑด")

# ํ†ต๊ณ„ ๋งค๋‹ˆ์ €
from korea_investment_stock.monitoring import get_stats_manager

stats_mgr = get_stats_manager()
stats_mgr.save_all_stats()  # ๋ชจ๋“  ํ†ต๊ณ„ ์ €์žฅ

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

korea_investment_stock/
โ”œโ”€โ”€ __init__.py
โ”œโ”€โ”€ korea_investment_stock.py      # ๋ฉ”์ธ ํด๋ž˜์Šค
โ”œโ”€โ”€ rate_limiting/                 # Rate Limiting ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ enhanced_rate_limiter.py
โ”‚   โ”œโ”€โ”€ enhanced_backoff_strategy.py
โ”‚   โ””โ”€โ”€ enhanced_retry_decorator.py
โ”œโ”€โ”€ error_handling/                # ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ชจ๋“ˆ
โ”‚   โ””โ”€โ”€ error_recovery_system.py
โ”œโ”€โ”€ batch_processing/              # ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋ชจ๋“ˆ
โ”‚   โ””โ”€โ”€ dynamic_batch_controller.py
โ”œโ”€โ”€ monitoring/                    # ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํ†ต๊ณ„
โ”‚   โ””โ”€โ”€ stats_manager.py
โ””โ”€โ”€ utils/                        # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜

๐Ÿ”ง ํ™˜๊ฒฝ ์„ค์ •

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

# Rate Limiting ์„ค์ •
export RATE_LIMIT_MAX_CALLS=15        # ์ตœ๋Œ€ ํ˜ธ์ถœ ์ˆ˜ (๊ธฐ๋ณธ: 15)
export RATE_LIMIT_SAFETY_MARGIN=0.8   # ์•ˆ์ „ ๋งˆ์ง„ (๊ธฐ๋ณธ: 0.8)

# Backoff ์ „๋žต ์„ค์ •
export BACKOFF_BASE_DELAY=1.0         # ๊ธฐ๋ณธ ๋Œ€๊ธฐ ์‹œ๊ฐ„
export BACKOFF_MAX_DELAY=60.0         # ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„
export CIRCUIT_FAILURE_THRESHOLD=5    # Circuit Breaker ์ž„๊ณ„๊ฐ’

๐Ÿ“ˆ ์„ฑ๋Šฅ ์ง€ํ‘œ

  • ์ฒ˜๋ฆฌ๋Ÿ‰: 10-12 TPS (์•ˆ์ •์ )
  • ์—๋Ÿฌ์œจ: < 0.1%
  • 100์ข…๋ชฉ ์กฐํšŒ: ~8.5์ดˆ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ: < 100MB
  • CPU ์‚ฌ์šฉ๋ฅ : < 5%

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/softyoungha/korea-investment-stock.git
cd korea-investment-stock

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# ๊ฐœ๋ฐœ ์˜์กด์„ฑ ์„ค์น˜
pip install -e ".[dev]"

# ํ…Œ์ŠคํŠธ ์‹คํ–‰
pytest

๐Ÿ“š ๋ฌธ์„œ

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

  • ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ OpenAPI์˜ ๊ณต์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
  • ์‹ค๊ฑฐ๋ž˜ ์‚ฌ์šฉ ์‹œ ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ ์‚ฌ์šฉํ•˜์„ธ์š”
  • API ํ˜ธ์ถœ ์ œํ•œ์„ ์ค€์ˆ˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์„ธ์š”

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿ™ ๊ฐ์‚ฌ์˜ ๊ธ€

  • ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ OpenAPI ํŒ€
  • ๋ชจ๋“  ๊ธฐ์—ฌ์ž๋“ค
  • ์ด์Šˆ ๋ฆฌํฌํŠธ์™€ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹  ์‚ฌ์šฉ์ž๋ถ„๋“ค

๐Ÿ“ž ์ง€์›


Made with โค๏ธ by the Korea Investment Stock community

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

korea_investment_stock-0.4.0.tar.gz (90.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

korea_investment_stock-0.4.0-py3-none-any.whl (111.2 kB view details)

Uploaded Python 3

File details

Details for the file korea_investment_stock-0.4.0.tar.gz.

File metadata

  • Download URL: korea_investment_stock-0.4.0.tar.gz
  • Upload date:
  • Size: 90.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.6

File hashes

Hashes for korea_investment_stock-0.4.0.tar.gz
Algorithm Hash digest
SHA256 dca8d500e6f01d3fd0edc0a3f8a5a97031ad50e3b986cfca8aa894bac29081c2
MD5 a51f7f662c3b534af1dc139ff1b79830
BLAKE2b-256 5b7582d48ec092d83fd548045a7a07da39a449508e32c172ce2df6cfdf86c99e

See more details on using hashes here.

File details

Details for the file korea_investment_stock-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for korea_investment_stock-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4b9bf12c8422096ade65d78aea3773813f405e8db128cb07a3d5d7e1f0a0e3ed
MD5 cf6f4f518ad4a9d2eb68cdde02e8b198
BLAKE2b-256 a269f3a83171ec1873b0a05a0dec5e93155032d12d4ad877c8914530664079d0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page