kispilot 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kispilot-0.1.0/LICENSE +21 -0
- kispilot-0.1.0/PKG-INFO +204 -0
- kispilot-0.1.0/README.md +169 -0
- kispilot-0.1.0/pyproject.toml +55 -0
- kispilot-0.1.0/setup.cfg +4 -0
- kispilot-0.1.0/src/kispilot/__init__.py +3 -0
- kispilot-0.1.0/src/kispilot/__main__.py +5 -0
- kispilot-0.1.0/src/kispilot/api/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/api/account/__init__.py +24 -0
- kispilot-0.1.0/src/kispilot/api/account/account_asset_balance.py +130 -0
- kispilot-0.1.0/src/kispilot/api/account/account_inquire_balance_rlz_pl.py +169 -0
- kispilot-0.1.0/src/kispilot/api/account/account_inquire_period_profit.py +198 -0
- kispilot-0.1.0/src/kispilot/api/account/account_inquire_period_rights.py +197 -0
- kispilot-0.1.0/src/kispilot/api/account/account_inquire_period_trade_profit.py +206 -0
- kispilot-0.1.0/src/kispilot/api/account/account_intgr_margin.py +196 -0
- kispilot-0.1.0/src/kispilot/api/config.py +29 -0
- kispilot-0.1.0/src/kispilot/api/data/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/api/data/_mst.py +20 -0
- kispilot-0.1.0/src/kispilot/api/data/kosdaq.py +75 -0
- kispilot-0.1.0/src/kispilot/api/data/kospi.py +75 -0
- kispilot-0.1.0/src/kispilot/api/data/master.py +138 -0
- kispilot-0.1.0/src/kispilot/api/data/sector.py +30 -0
- kispilot-0.1.0/src/kispilot/api/info/__init__.py +27 -0
- kispilot-0.1.0/src/kispilot/api/info/info_balance_sheet.py +96 -0
- kispilot-0.1.0/src/kispilot/api/info/info_financial_ratio.py +95 -0
- kispilot-0.1.0/src/kispilot/api/info/info_growth_ratio.py +90 -0
- kispilot-0.1.0/src/kispilot/api/info/info_income_statement.py +99 -0
- kispilot-0.1.0/src/kispilot/api/info/info_other_major_ratios.py +90 -0
- kispilot-0.1.0/src/kispilot/api/info/info_profit_ratio.py +90 -0
- kispilot-0.1.0/src/kispilot/api/info/info_search_stock_info.py +149 -0
- kispilot-0.1.0/src/kispilot/api/info/info_stability_ratio.py +90 -0
- kispilot-0.1.0/src/kispilot/api/oauth/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/api/oauth/kis_token.py +237 -0
- kispilot-0.1.0/src/kispilot/api/order/__init__.py +40 -0
- kispilot-0.1.0/src/kispilot/api/order/order_cash.py +200 -0
- kispilot-0.1.0/src/kispilot/api/order/order_credit.py +189 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_balance.py +290 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_credit_psamount.py +114 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_daily_ccld.py +277 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_psbl_order.py +125 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_psbl_sell.py +90 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_reserve.py +188 -0
- kispilot-0.1.0/src/kispilot/api/order/order_inquire_revise_cancel.py +161 -0
- kispilot-0.1.0/src/kispilot/api/order/order_reserve.py +151 -0
- kispilot-0.1.0/src/kispilot/api/order/order_reserve_revise_cancel.py +151 -0
- kispilot-0.1.0/src/kispilot/api/order/order_revise_cancel.py +217 -0
- kispilot-0.1.0/src/kispilot/api/price/__init__.py +45 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_asking_price.py +182 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_ccnl.py +95 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_daily_itemchartprice.py +154 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_daily_price.py +108 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_etf_component_stock_price.py +132 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_etf_price.py +146 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_investor.py +111 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_member.py +156 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_price.py +168 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_time_dailychartprice.py +128 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_time_itemchartprice.py +128 -0
- kispilot-0.1.0/src/kispilot/api/price/price_inquire_time_itemconclusion.py +120 -0
- kispilot-0.1.0/src/kispilot/api/price/price_nav_comparison_daily_trend.py +108 -0
- kispilot-0.1.0/src/kispilot/api/price/price_nav_comparison_time_trend.py +105 -0
- kispilot-0.1.0/src/kispilot/api/price/price_nav_comparison_trend.py +118 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/__init__.py +37 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_daily_loan_trans.py +142 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_daily_short_sale.py +138 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_foreign_institution_total.py +125 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_frgnmem_pchs_trend.py +97 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_inquire_investor_daily_by_market.py +146 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_intstock_multprice.py +136 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_investor_program_trade_today.py +110 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_investor_trade_by_stock_daily.py +215 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_mktfunds.py +104 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_pbar_tratio.py +116 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_program_trade_by_stock.py +101 -0
- kispilot-0.1.0/src/kispilot/api/price_anal/price_anal_program_trade_by_stock_daily.py +107 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/__init__.py +38 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_credit_balance.py +134 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_disparity.py +136 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_exp_trans_updown.py +131 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_finance_ratio.py +162 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_fluctuation.py +153 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_market_cap.py +122 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_market_value.py +146 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_prefer_disparate_ratio.py +134 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_profit_asset_index.py +142 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_quote_balance.py +129 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_short_sale.py +134 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_volume_power.py +129 -0
- kispilot-0.1.0/src/kispilot/api/ranking_anal/ranking_anal_volume_rank.py +135 -0
- kispilot-0.1.0/src/kispilot/api/realtime/__init__.py +9 -0
- kispilot-0.1.0/src/kispilot/api/realtime/realtime_asking_price_total.py +227 -0
- kispilot-0.1.0/src/kispilot/api/realtime/realtime_ccnl_total.py +206 -0
- kispilot-0.1.0/src/kispilot/api/realtime/realtime_member_total.py +239 -0
- kispilot-0.1.0/src/kispilot/api/realtime/realtime_program_trade_total.py +172 -0
- kispilot-0.1.0/src/kispilot/api/sector/__init__.py +28 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_exp_index_trend.py +97 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_exp_total_index.py +122 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_inquire_daily_indexchartprice.py +131 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_inquire_index_category_price.py +136 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_inquire_index_daily_price.py +134 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_inquire_index_price.py +117 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_inquire_index_timeprice.py +94 -0
- kispilot-0.1.0/src/kispilot/api/sector/sector_news_title.py +114 -0
- kispilot-0.1.0/src/kispilot/api/utils/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/api/utils/api_tracker.py +44 -0
- kispilot-0.1.0/src/kispilot/api/utils/http_session.py +66 -0
- kispilot-0.1.0/src/kispilot/app/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/app/backtest/__init__.py +48 -0
- kispilot-0.1.0/src/kispilot/app/backtest/custom_strategy.py +599 -0
- kispilot-0.1.0/src/kispilot/app/backtest/engine.py +184 -0
- kispilot-0.1.0/src/kispilot/app/backtest/indicators_lib.py +1454 -0
- kispilot-0.1.0/src/kispilot/app/backtest/metrics.py +76 -0
- kispilot-0.1.0/src/kispilot/app/backtest/strategies.py +320 -0
- kispilot-0.1.0/src/kispilot/app/main.py +799 -0
- kispilot-0.1.0/src/kispilot/app/ui/account.html +71 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/css/base.css +468 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/favicon.svg +1 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/api.js +201 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/chart-tools.js +186 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/chart.js +466 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/indicators.js +475 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/layout.js +268 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/live.js +143 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/account.js +133 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/backtest.js +813 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/dashboard.js +175 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/etf.js +98 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/market.js +121 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/ranking.js +171 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/stock-finance.js +105 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/stock-flow.js +169 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/stock.js +145 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/pages/trade.js +495 -0
- kispilot-0.1.0/src/kispilot/app/ui/assets/js/ui.js +215 -0
- kispilot-0.1.0/src/kispilot/app/ui/backtest.html +251 -0
- kispilot-0.1.0/src/kispilot/app/ui/etf.html +73 -0
- kispilot-0.1.0/src/kispilot/app/ui/index.html +98 -0
- kispilot-0.1.0/src/kispilot/app/ui/market.html +101 -0
- kispilot-0.1.0/src/kispilot/app/ui/ranking.html +74 -0
- kispilot-0.1.0/src/kispilot/app/ui/stock-finance.html +63 -0
- kispilot-0.1.0/src/kispilot/app/ui/stock-flow.html +72 -0
- kispilot-0.1.0/src/kispilot/app/ui/stock.html +87 -0
- kispilot-0.1.0/src/kispilot/app/ui/trade.html +170 -0
- kispilot-0.1.0/src/kispilot/app/utils/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/app/utils/backtest.py +347 -0
- kispilot-0.1.0/src/kispilot/app/utils/chart.py +304 -0
- kispilot-0.1.0/src/kispilot/app/utils/realtime_hub.py +297 -0
- kispilot-0.1.0/src/kispilot/app/utils/utils.py +79 -0
- kispilot-0.1.0/src/kispilot/cli.py +300 -0
- kispilot-0.1.0/src/kispilot/credentials.py +109 -0
- kispilot-0.1.0/src/kispilot/install.py +185 -0
- kispilot-0.1.0/src/kispilot/mcp_server/__init__.py +1 -0
- kispilot-0.1.0/src/kispilot/mcp_server/analysis_tools.py +398 -0
- kispilot-0.1.0/src/kispilot/mcp_server/prompts.py +185 -0
- kispilot-0.1.0/src/kispilot/mcp_server/server.py +411 -0
- kispilot-0.1.0/src/kispilot/paths.py +35 -0
- kispilot-0.1.0/src/kispilot.egg-info/PKG-INFO +204 -0
- kispilot-0.1.0/src/kispilot.egg-info/SOURCES.txt +160 -0
- kispilot-0.1.0/src/kispilot.egg-info/dependency_links.txt +1 -0
- kispilot-0.1.0/src/kispilot.egg-info/entry_points.txt +2 -0
- kispilot-0.1.0/src/kispilot.egg-info/requires.txt +12 -0
- kispilot-0.1.0/src/kispilot.egg-info/top_level.txt +1 -0
kispilot-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Dong-Ju An
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
kispilot-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kispilot
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 한국투자증권 Open API를 AI 에이전트(MCP)와 웹 콘솔에서 쓰기 위한 도구 모음 (비공식)
|
|
5
|
+
Author: Dong-Ju An
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/dongju923/kispilot
|
|
8
|
+
Project-URL: Repository, https://github.com/dongju923/kispilot
|
|
9
|
+
Project-URL: Issues, https://github.com/dongju923/kispilot/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/dongju923/kispilot/releases
|
|
11
|
+
Keywords: kis,korea-investment,한국투자증권,mcp,trading,backtest,claude,agent
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Natural Language :: Korean
|
|
18
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: requests>=2.31
|
|
23
|
+
Requires-Dist: python-dotenv>=1.0
|
|
24
|
+
Requires-Dist: keyring>=25
|
|
25
|
+
Requires-Dist: platformdirs>=4
|
|
26
|
+
Requires-Dist: pandas>=2.2
|
|
27
|
+
Requires-Dist: numpy>=1.26
|
|
28
|
+
Requires-Dist: yfinance>=0.2.40
|
|
29
|
+
Requires-Dist: starlette>=0.37
|
|
30
|
+
Requires-Dist: uvicorn>=0.30
|
|
31
|
+
Requires-Dist: websockets>=12
|
|
32
|
+
Requires-Dist: aiohttp>=3.9
|
|
33
|
+
Requires-Dist: mcp<3,>=2.2
|
|
34
|
+
Dynamic: license-file
|
|
35
|
+
|
|
36
|
+
# KISPilot
|
|
37
|
+
|
|
38
|
+
한국투자증권 Open API를 **AI 에이전트(MCP)** 와 **웹 콘솔**에서 쓰기 위한 도구 모음입니다.
|
|
39
|
+
|
|
40
|
+
> **비공식 프로젝트입니다.** 한국투자증권과 관계가 없으며, 한국투자증권이 만들거나 검증하지 않았습니다.
|
|
41
|
+
> 이 소프트웨어는 투자 조언이 아니며, 주문·백테스트 결과로 생긴 손실에 대해 책임지지 않습니다 (MIT 라이선스, 무보증).
|
|
42
|
+
> 실전 계좌로 쓰기 전에 모의투자로 충분히 확인하세요.
|
|
43
|
+
|
|
44
|
+
## 할 수 있는 것
|
|
45
|
+
|
|
46
|
+
- **조회** — 시세·호가·체결, 투자자·수급, 재무, 순위, 업종·지수, ETF, 계좌 잔고·손익 (KIS API 80여 개)
|
|
47
|
+
- **주문** — 현금·신용·예약 주문, 정정·취소 (에이전트는 모의투자가 기본, 실전은 2단계 확인)
|
|
48
|
+
- **차트** — 1분~년봉, 이동평균·볼린저·일목균형표 등 지표, 보조 차트 30여 종
|
|
49
|
+
- **백테스트** — 기본 전략 11종 + 지표 157개로 만드는 커스텀 전략, 벤치마크 비교, 거래 내역
|
|
50
|
+
- **실시간** — KIS 웹소켓 체결·호가 (웹 콘솔)
|
|
51
|
+
|
|
52
|
+
## 설치
|
|
53
|
+
|
|
54
|
+
Python 3.11 이상이 필요합니다.
|
|
55
|
+
|
|
56
|
+
**추천** — 도구 전용 환경에 설치되고 `kispilot` 명령이 PATH 에 자동으로 등록됩니다.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
uv tool install kispilot # 또는: pipx install kispilot
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
일반 `pip` 로도 설치할 수 있습니다. 가상환경·conda 를 켠 상태에서 설치하면 그 환경을 켰을 때만 `kispilot` 명령이 보입니다.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pip install kispilot
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
설치 없이 바로 실행 (`uv` 필요):
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
uvx kispilot ui
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
| 할 일 | uv | pipx | pip |
|
|
75
|
+
|---|---|---|---|
|
|
76
|
+
| 업데이트 | `uv tool upgrade kispilot` | `pipx upgrade kispilot` | `pip install -U kispilot` |
|
|
77
|
+
| 특정 버전 | `uv tool install kispilot==0.1.0` | `pipx install kispilot==0.1.0` | `pip install kispilot==0.1.0` |
|
|
78
|
+
| 삭제 | `uv tool uninstall kispilot` | `pipx uninstall kispilot` | `pip uninstall kispilot` |
|
|
79
|
+
|
|
80
|
+
버전별 변경 내용은 [Releases](https://github.com/dongju923/kispilot/releases) 에 있습니다.
|
|
81
|
+
|
|
82
|
+
소스에서 개발용으로 설치하려면:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git clone https://github.com/dongju923/kispilot
|
|
86
|
+
cd kispilot
|
|
87
|
+
pip install -e .
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 키 등록 (처음 한 번)
|
|
91
|
+
|
|
92
|
+
[KIS Developers](https://apiportal.koreainvestment.com)에서 앱키·앱시크릿을 발급받은 뒤 터미널에서 실행합니다.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
kispilot setup # 실전 / 모의투자 / 둘 다 선택 → 앱키·시크릿·계좌 입력
|
|
96
|
+
kispilot status # 등록 상태 확인 (값은 가려서 표시)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- 앱키·시크릿은 **OS 키체인**(Windows 자격 증명 관리자, macOS 키체인, Linux Secret Service)에 저장됩니다. 파일에 평문으로 남지 않습니다.
|
|
100
|
+
- 입력은 화면에 보이지 않고, 저장 전에 실제로 토큰을 발급해 키가 맞는지 확인합니다.
|
|
101
|
+
- **키를 AI 채팅창에 붙여넣지 마세요.** 채팅 내용은 대화 기록과 AI 서비스 쪽에 남습니다.
|
|
102
|
+
- 지우려면 `kispilot logout` (키체인 삭제 + 토큰 폐기).
|
|
103
|
+
|
|
104
|
+
키체인을 쓸 수 없는 환경(서버 등)에서는 환경변수로 넣을 수 있습니다. 환경변수가 키체인보다 먼저 쓰입니다.
|
|
105
|
+
변수 이름은 [.env.example](https://github.com/dongju923/kispilot/blob/main/.env.example)을 참고하여, .env 파일을 새로 생성하세요.
|
|
106
|
+
|
|
107
|
+
## 웹 콘솔
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
kispilot ui # http://127.0.0.1:8000
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
대시보드, 시장·업종, 순위, 종목 분석(차트·호가·수급·재무), ETF, 주문, 계좌, 백테스트 화면이 있습니다.
|
|
114
|
+
같은 PC에서만 접속되도록 127.0.0.1에 열립니다.
|
|
115
|
+
|
|
116
|
+
## AI 에이전트에서 쓰기 (MCP)
|
|
117
|
+
|
|
118
|
+
명령 한 줄로 AI 클라이언트에 등록합니다. 설정 파일(JSON)은 이 명령이 대신 써 줍니다.
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
kispilot install claude-desktop # Claude Desktop 앱
|
|
122
|
+
kispilot install claude-code # Claude Code (내 계정 전체, 어느 폴더에서나)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- 등록한 뒤 해당 앱을 다시 시작하면 연결됩니다. Claude Desktop 은 트레이 아이콘 → 종료 후 다시 켜세요.
|
|
126
|
+
- 지금 설치된 `kispilot` 실행 파일의 전체 경로로 등록하므로 PATH 설정이 필요 없습니다.
|
|
127
|
+
- Claude Desktop 설정 파일은 바꾸기 전에 `claude_desktop_config.json.bak-날짜` 로 백업하고, 다른 항목은 건드리지 않습니다.
|
|
128
|
+
- 실전 주문은 꺼진 상태로 등록됩니다. 켜려면 `--allow-real-orders` 를 붙입니다 (아래 안전장치 참고).
|
|
129
|
+
- 바뀔 내용만 보려면 `--dry-run`, 해제는 `kispilot uninstall claude-desktop` (또는 `claude-code`).
|
|
130
|
+
- 동작 확인: `kispilot mcp --check`
|
|
131
|
+
|
|
132
|
+
### MCP 도구 (95개)
|
|
133
|
+
|
|
134
|
+
| 묶음 | 도구 |
|
|
135
|
+
|---|---|
|
|
136
|
+
| 시세·분석·순위·업종·재무·계좌 | KIS API 조회 도구 (`price_*`, `price_anal_*`, `ranking_anal_*`, `sector_*`, `info_*`, `account_*`, `order_inquire_*`) |
|
|
137
|
+
| 주문 | `order_buy_cash` 등 (모의투자 기본), 실전 주문 확인 `order_confirm` · 취소 `order_discard`, 지금 장 구간·호가 유형 `market_session` |
|
|
138
|
+
| 검색 | `search_stock_code`, `search_sector_code` |
|
|
139
|
+
| 백테스트 | `backtest_options`, `backtest_indicator_catalog`, `backtest_run`, `backtest_strategy_validate` / `list` / `load` / `save` / `delete` |
|
|
140
|
+
| 지표·차트 | `indicator_values` (RSI·MACD 등 최근 값), `chart_bars` (일·주·월·년봉), `yf_get_history` |
|
|
141
|
+
|
|
142
|
+
예: "삼성전자 최근 5년 골든크로스(5/20) 백테스트, 손절 7% 익절 20%로 해줘", "SK하이닉스 RSI랑 20일선 지금 얼마야?"
|
|
143
|
+
|
|
144
|
+
### MCP 프롬프트 (작업 템플릿)
|
|
145
|
+
|
|
146
|
+
자주 하는 작업의 진행 순서를 담은 템플릿입니다. Claude Desktop 은 입력창의 `+` 메뉴, Claude Code 는 `/kispilot:<이름>` 으로 고릅니다.
|
|
147
|
+
칸을 비워 두면 Claude 가 대화로 물어봅니다.
|
|
148
|
+
|
|
149
|
+
| 프롬프트 | 하는 일 |
|
|
150
|
+
|---|---|
|
|
151
|
+
| 오늘 시장 브리핑 (`market_briefing`) | 지수 · 투자자 수급 · 강한/약한 업종 · 등락률/거래량 상위 · 주요 뉴스 |
|
|
152
|
+
| 종목 종합 분석 (`stock_analysis`) | 시세 · 추세(이동평균·RSI·MACD·볼린저) · 수급 · 재무 · 긍정/위험 신호 |
|
|
153
|
+
| 백테스트 마법사 (`backtest_wizard`) | 전략 선택 → 실행 → 지수 대비 해석 → 파라미터 비교 → 저장 |
|
|
154
|
+
| 전략 만들기 (`strategy_builder`) | 말로 설명한 아이디어 → 커스텀 전략 JSON → 검증 → 백테스트 → 저장 |
|
|
155
|
+
| 주문 도우미 (`order_assistant`) | 장 구간 확인 → 시세·주문 가능 수량 → 주문 내용 확인 → (실전) 2단계 승인 |
|
|
156
|
+
| 보유 종목 점검 (`portfolio_review`) | 잔고 · 손익 · 종목별 추세/지표 · 쏠림 점검 (주문 안 함) |
|
|
157
|
+
|
|
158
|
+
<details>
|
|
159
|
+
<summary>직접 설정하려면</summary>
|
|
160
|
+
|
|
161
|
+
등록되는 내용은 "MCP 서버를 `kispilot mcp` 명령으로 실행하라" 는 한 항목입니다.
|
|
162
|
+
이 명령은 AI 클라이언트가 실행해서 표준 입출력으로 대화하므로, 터미널에서 직접 치면 아무것도 출력하지 않고 기다리는 것이 정상입니다.
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"mcpServers": {
|
|
167
|
+
"kispilot": {
|
|
168
|
+
"command": "<kispilot 실행 파일 전체 경로>",
|
|
169
|
+
"args": ["mcp"],
|
|
170
|
+
"env": { "KIS_ALLOW_REAL_ORDERS": "0" }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
- 실행 파일 경로: Windows `where kispilot`, macOS·Linux `which kispilot`
|
|
177
|
+
- Claude Desktop: 설정 → 개발자 → 구성 편집 (`claude_desktop_config.json`)
|
|
178
|
+
- Claude Code: 프로젝트 폴더의 `.mcp.json` (예시: [.mcp.json.example](https://github.com/dongju923/kispilot/blob/main/.mcp.json.example))
|
|
179
|
+
- `uv` 사용자는 설치 없이 `"command": "uvx", "args": ["kispilot", "mcp"]`
|
|
180
|
+
|
|
181
|
+
</details>
|
|
182
|
+
|
|
183
|
+
### 주문 안전장치 (에이전트)
|
|
184
|
+
|
|
185
|
+
AI 모델이 스스로 도구를 부르기 때문에 웹 콘솔보다 보수적으로 동작합니다.
|
|
186
|
+
|
|
187
|
+
1. 주문 도구의 기본값은 **모의투자**입니다.
|
|
188
|
+
2. 실전 주문은 MCP 서버 환경변수 `KIS_ALLOW_REAL_ORDERS=1` 을 사용자가 직접 넣어야 켜집니다.
|
|
189
|
+
3. 켜져 있어도 바로 나가지 않습니다. 주문 내용과 확인 번호를 먼저 돌려주고, 사용자가 승인한 뒤 `order_confirm` 을 불러야 전송됩니다 (3분 안, 1회용).
|
|
190
|
+
|
|
191
|
+
## 데이터 출처와 저장 위치
|
|
192
|
+
|
|
193
|
+
- 과거 일봉·분봉: [yfinance](https://github.com/ranaroussi/yfinance) (Yahoo Finance, 개인적·연구 목적 이용 권장), 최근 거래일은 KIS API로 보강
|
|
194
|
+
- 토큰 캐시·종목 마스터·커스텀 전략: 사용자 데이터 폴더 (`kispilot status` 에 표시, 환경변수 `KISPILOT_HOME` 으로 변경)
|
|
195
|
+
- 차트: [TradingView Lightweight Charts](https://github.com/tradingview/lightweight-charts) (Apache-2.0)
|
|
196
|
+
|
|
197
|
+
## 참고
|
|
198
|
+
|
|
199
|
+
- [한국투자증권 Open API](https://apiportal.koreainvestment.com) — 모든 시세·계좌·주문 기능은 이 API 를 호출합니다.
|
|
200
|
+
- [koreainvestment/open-trading-api](https://github.com/koreainvestment/open-trading-api) — 백테스트 기본 전략 구성(프리셋 종류)과 종목 마스터 파일 형식(필드 폭·열 이름)을 참고했습니다.
|
|
201
|
+
|
|
202
|
+
## 라이선스
|
|
203
|
+
|
|
204
|
+
[MIT](https://github.com/dongju923/kispilot/blob/main/LICENSE)
|
kispilot-0.1.0/README.md
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# KISPilot
|
|
2
|
+
|
|
3
|
+
한국투자증권 Open API를 **AI 에이전트(MCP)** 와 **웹 콘솔**에서 쓰기 위한 도구 모음입니다.
|
|
4
|
+
|
|
5
|
+
> **비공식 프로젝트입니다.** 한국투자증권과 관계가 없으며, 한국투자증권이 만들거나 검증하지 않았습니다.
|
|
6
|
+
> 이 소프트웨어는 투자 조언이 아니며, 주문·백테스트 결과로 생긴 손실에 대해 책임지지 않습니다 (MIT 라이선스, 무보증).
|
|
7
|
+
> 실전 계좌로 쓰기 전에 모의투자로 충분히 확인하세요.
|
|
8
|
+
|
|
9
|
+
## 할 수 있는 것
|
|
10
|
+
|
|
11
|
+
- **조회** — 시세·호가·체결, 투자자·수급, 재무, 순위, 업종·지수, ETF, 계좌 잔고·손익 (KIS API 80여 개)
|
|
12
|
+
- **주문** — 현금·신용·예약 주문, 정정·취소 (에이전트는 모의투자가 기본, 실전은 2단계 확인)
|
|
13
|
+
- **차트** — 1분~년봉, 이동평균·볼린저·일목균형표 등 지표, 보조 차트 30여 종
|
|
14
|
+
- **백테스트** — 기본 전략 11종 + 지표 157개로 만드는 커스텀 전략, 벤치마크 비교, 거래 내역
|
|
15
|
+
- **실시간** — KIS 웹소켓 체결·호가 (웹 콘솔)
|
|
16
|
+
|
|
17
|
+
## 설치
|
|
18
|
+
|
|
19
|
+
Python 3.11 이상이 필요합니다.
|
|
20
|
+
|
|
21
|
+
**추천** — 도구 전용 환경에 설치되고 `kispilot` 명령이 PATH 에 자동으로 등록됩니다.
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
uv tool install kispilot # 또는: pipx install kispilot
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
일반 `pip` 로도 설치할 수 있습니다. 가상환경·conda 를 켠 상태에서 설치하면 그 환경을 켰을 때만 `kispilot` 명령이 보입니다.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install kispilot
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
설치 없이 바로 실행 (`uv` 필요):
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
uvx kispilot ui
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
| 할 일 | uv | pipx | pip |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| 업데이트 | `uv tool upgrade kispilot` | `pipx upgrade kispilot` | `pip install -U kispilot` |
|
|
42
|
+
| 특정 버전 | `uv tool install kispilot==0.1.0` | `pipx install kispilot==0.1.0` | `pip install kispilot==0.1.0` |
|
|
43
|
+
| 삭제 | `uv tool uninstall kispilot` | `pipx uninstall kispilot` | `pip uninstall kispilot` |
|
|
44
|
+
|
|
45
|
+
버전별 변경 내용은 [Releases](https://github.com/dongju923/kispilot/releases) 에 있습니다.
|
|
46
|
+
|
|
47
|
+
소스에서 개발용으로 설치하려면:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/dongju923/kispilot
|
|
51
|
+
cd kispilot
|
|
52
|
+
pip install -e .
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 키 등록 (처음 한 번)
|
|
56
|
+
|
|
57
|
+
[KIS Developers](https://apiportal.koreainvestment.com)에서 앱키·앱시크릿을 발급받은 뒤 터미널에서 실행합니다.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
kispilot setup # 실전 / 모의투자 / 둘 다 선택 → 앱키·시크릿·계좌 입력
|
|
61
|
+
kispilot status # 등록 상태 확인 (값은 가려서 표시)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
- 앱키·시크릿은 **OS 키체인**(Windows 자격 증명 관리자, macOS 키체인, Linux Secret Service)에 저장됩니다. 파일에 평문으로 남지 않습니다.
|
|
65
|
+
- 입력은 화면에 보이지 않고, 저장 전에 실제로 토큰을 발급해 키가 맞는지 확인합니다.
|
|
66
|
+
- **키를 AI 채팅창에 붙여넣지 마세요.** 채팅 내용은 대화 기록과 AI 서비스 쪽에 남습니다.
|
|
67
|
+
- 지우려면 `kispilot logout` (키체인 삭제 + 토큰 폐기).
|
|
68
|
+
|
|
69
|
+
키체인을 쓸 수 없는 환경(서버 등)에서는 환경변수로 넣을 수 있습니다. 환경변수가 키체인보다 먼저 쓰입니다.
|
|
70
|
+
변수 이름은 [.env.example](https://github.com/dongju923/kispilot/blob/main/.env.example)을 참고하여, .env 파일을 새로 생성하세요.
|
|
71
|
+
|
|
72
|
+
## 웹 콘솔
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
kispilot ui # http://127.0.0.1:8000
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
대시보드, 시장·업종, 순위, 종목 분석(차트·호가·수급·재무), ETF, 주문, 계좌, 백테스트 화면이 있습니다.
|
|
79
|
+
같은 PC에서만 접속되도록 127.0.0.1에 열립니다.
|
|
80
|
+
|
|
81
|
+
## AI 에이전트에서 쓰기 (MCP)
|
|
82
|
+
|
|
83
|
+
명령 한 줄로 AI 클라이언트에 등록합니다. 설정 파일(JSON)은 이 명령이 대신 써 줍니다.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
kispilot install claude-desktop # Claude Desktop 앱
|
|
87
|
+
kispilot install claude-code # Claude Code (내 계정 전체, 어느 폴더에서나)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- 등록한 뒤 해당 앱을 다시 시작하면 연결됩니다. Claude Desktop 은 트레이 아이콘 → 종료 후 다시 켜세요.
|
|
91
|
+
- 지금 설치된 `kispilot` 실행 파일의 전체 경로로 등록하므로 PATH 설정이 필요 없습니다.
|
|
92
|
+
- Claude Desktop 설정 파일은 바꾸기 전에 `claude_desktop_config.json.bak-날짜` 로 백업하고, 다른 항목은 건드리지 않습니다.
|
|
93
|
+
- 실전 주문은 꺼진 상태로 등록됩니다. 켜려면 `--allow-real-orders` 를 붙입니다 (아래 안전장치 참고).
|
|
94
|
+
- 바뀔 내용만 보려면 `--dry-run`, 해제는 `kispilot uninstall claude-desktop` (또는 `claude-code`).
|
|
95
|
+
- 동작 확인: `kispilot mcp --check`
|
|
96
|
+
|
|
97
|
+
### MCP 도구 (95개)
|
|
98
|
+
|
|
99
|
+
| 묶음 | 도구 |
|
|
100
|
+
|---|---|
|
|
101
|
+
| 시세·분석·순위·업종·재무·계좌 | KIS API 조회 도구 (`price_*`, `price_anal_*`, `ranking_anal_*`, `sector_*`, `info_*`, `account_*`, `order_inquire_*`) |
|
|
102
|
+
| 주문 | `order_buy_cash` 등 (모의투자 기본), 실전 주문 확인 `order_confirm` · 취소 `order_discard`, 지금 장 구간·호가 유형 `market_session` |
|
|
103
|
+
| 검색 | `search_stock_code`, `search_sector_code` |
|
|
104
|
+
| 백테스트 | `backtest_options`, `backtest_indicator_catalog`, `backtest_run`, `backtest_strategy_validate` / `list` / `load` / `save` / `delete` |
|
|
105
|
+
| 지표·차트 | `indicator_values` (RSI·MACD 등 최근 값), `chart_bars` (일·주·월·년봉), `yf_get_history` |
|
|
106
|
+
|
|
107
|
+
예: "삼성전자 최근 5년 골든크로스(5/20) 백테스트, 손절 7% 익절 20%로 해줘", "SK하이닉스 RSI랑 20일선 지금 얼마야?"
|
|
108
|
+
|
|
109
|
+
### MCP 프롬프트 (작업 템플릿)
|
|
110
|
+
|
|
111
|
+
자주 하는 작업의 진행 순서를 담은 템플릿입니다. Claude Desktop 은 입력창의 `+` 메뉴, Claude Code 는 `/kispilot:<이름>` 으로 고릅니다.
|
|
112
|
+
칸을 비워 두면 Claude 가 대화로 물어봅니다.
|
|
113
|
+
|
|
114
|
+
| 프롬프트 | 하는 일 |
|
|
115
|
+
|---|---|
|
|
116
|
+
| 오늘 시장 브리핑 (`market_briefing`) | 지수 · 투자자 수급 · 강한/약한 업종 · 등락률/거래량 상위 · 주요 뉴스 |
|
|
117
|
+
| 종목 종합 분석 (`stock_analysis`) | 시세 · 추세(이동평균·RSI·MACD·볼린저) · 수급 · 재무 · 긍정/위험 신호 |
|
|
118
|
+
| 백테스트 마법사 (`backtest_wizard`) | 전략 선택 → 실행 → 지수 대비 해석 → 파라미터 비교 → 저장 |
|
|
119
|
+
| 전략 만들기 (`strategy_builder`) | 말로 설명한 아이디어 → 커스텀 전략 JSON → 검증 → 백테스트 → 저장 |
|
|
120
|
+
| 주문 도우미 (`order_assistant`) | 장 구간 확인 → 시세·주문 가능 수량 → 주문 내용 확인 → (실전) 2단계 승인 |
|
|
121
|
+
| 보유 종목 점검 (`portfolio_review`) | 잔고 · 손익 · 종목별 추세/지표 · 쏠림 점검 (주문 안 함) |
|
|
122
|
+
|
|
123
|
+
<details>
|
|
124
|
+
<summary>직접 설정하려면</summary>
|
|
125
|
+
|
|
126
|
+
등록되는 내용은 "MCP 서버를 `kispilot mcp` 명령으로 실행하라" 는 한 항목입니다.
|
|
127
|
+
이 명령은 AI 클라이언트가 실행해서 표준 입출력으로 대화하므로, 터미널에서 직접 치면 아무것도 출력하지 않고 기다리는 것이 정상입니다.
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"mcpServers": {
|
|
132
|
+
"kispilot": {
|
|
133
|
+
"command": "<kispilot 실행 파일 전체 경로>",
|
|
134
|
+
"args": ["mcp"],
|
|
135
|
+
"env": { "KIS_ALLOW_REAL_ORDERS": "0" }
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
- 실행 파일 경로: Windows `where kispilot`, macOS·Linux `which kispilot`
|
|
142
|
+
- Claude Desktop: 설정 → 개발자 → 구성 편집 (`claude_desktop_config.json`)
|
|
143
|
+
- Claude Code: 프로젝트 폴더의 `.mcp.json` (예시: [.mcp.json.example](https://github.com/dongju923/kispilot/blob/main/.mcp.json.example))
|
|
144
|
+
- `uv` 사용자는 설치 없이 `"command": "uvx", "args": ["kispilot", "mcp"]`
|
|
145
|
+
|
|
146
|
+
</details>
|
|
147
|
+
|
|
148
|
+
### 주문 안전장치 (에이전트)
|
|
149
|
+
|
|
150
|
+
AI 모델이 스스로 도구를 부르기 때문에 웹 콘솔보다 보수적으로 동작합니다.
|
|
151
|
+
|
|
152
|
+
1. 주문 도구의 기본값은 **모의투자**입니다.
|
|
153
|
+
2. 실전 주문은 MCP 서버 환경변수 `KIS_ALLOW_REAL_ORDERS=1` 을 사용자가 직접 넣어야 켜집니다.
|
|
154
|
+
3. 켜져 있어도 바로 나가지 않습니다. 주문 내용과 확인 번호를 먼저 돌려주고, 사용자가 승인한 뒤 `order_confirm` 을 불러야 전송됩니다 (3분 안, 1회용).
|
|
155
|
+
|
|
156
|
+
## 데이터 출처와 저장 위치
|
|
157
|
+
|
|
158
|
+
- 과거 일봉·분봉: [yfinance](https://github.com/ranaroussi/yfinance) (Yahoo Finance, 개인적·연구 목적 이용 권장), 최근 거래일은 KIS API로 보강
|
|
159
|
+
- 토큰 캐시·종목 마스터·커스텀 전략: 사용자 데이터 폴더 (`kispilot status` 에 표시, 환경변수 `KISPILOT_HOME` 으로 변경)
|
|
160
|
+
- 차트: [TradingView Lightweight Charts](https://github.com/tradingview/lightweight-charts) (Apache-2.0)
|
|
161
|
+
|
|
162
|
+
## 참고
|
|
163
|
+
|
|
164
|
+
- [한국투자증권 Open API](https://apiportal.koreainvestment.com) — 모든 시세·계좌·주문 기능은 이 API 를 호출합니다.
|
|
165
|
+
- [koreainvestment/open-trading-api](https://github.com/koreainvestment/open-trading-api) — 백테스트 기본 전략 구성(프리셋 종류)과 종목 마스터 파일 형식(필드 폭·열 이름)을 참고했습니다.
|
|
166
|
+
|
|
167
|
+
## 라이선스
|
|
168
|
+
|
|
169
|
+
[MIT](https://github.com/dongju923/kispilot/blob/main/LICENSE)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"] # license = "MIT" 같은 SPDX 표기·license-files 는 77 부터
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "kispilot"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "한국투자증권 Open API를 AI 에이전트(MCP)와 웹 콘솔에서 쓰기 위한 도구 모음 (비공식)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.11"
|
|
13
|
+
authors = [{ name = "Dong-Ju An" }]
|
|
14
|
+
keywords = ["kis", "korea-investment", "한국투자증권", "mcp", "trading", "backtest", "claude", "agent"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 3 - Alpha",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Operating System :: OS Independent",
|
|
21
|
+
"Natural Language :: Korean",
|
|
22
|
+
"Topic :: Office/Business :: Financial :: Investment",
|
|
23
|
+
]
|
|
24
|
+
dependencies = [
|
|
25
|
+
"requests>=2.31",
|
|
26
|
+
"python-dotenv>=1.0",
|
|
27
|
+
"keyring>=25",
|
|
28
|
+
"platformdirs>=4",
|
|
29
|
+
"pandas>=2.2",
|
|
30
|
+
"numpy>=1.26",
|
|
31
|
+
"yfinance>=0.2.40",
|
|
32
|
+
"starlette>=0.37",
|
|
33
|
+
"uvicorn>=0.30",
|
|
34
|
+
"websockets>=12",
|
|
35
|
+
"aiohttp>=3.9",
|
|
36
|
+
"mcp>=2.2,<3",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
kispilot = "kispilot.cli:main"
|
|
41
|
+
|
|
42
|
+
[project.urls]
|
|
43
|
+
Homepage = "https://github.com/dongju923/kispilot"
|
|
44
|
+
Repository = "https://github.com/dongju923/kispilot"
|
|
45
|
+
Issues = "https://github.com/dongju923/kispilot/issues"
|
|
46
|
+
Changelog = "https://github.com/dongju923/kispilot/releases"
|
|
47
|
+
|
|
48
|
+
[tool.setuptools.dynamic]
|
|
49
|
+
version = { attr = "kispilot.__version__" }
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.packages.find]
|
|
52
|
+
where = ["src"]
|
|
53
|
+
|
|
54
|
+
[tool.setuptools.package-data]
|
|
55
|
+
kispilot = ["app/ui/*.html", "app/ui/assets/*", "app/ui/assets/css/*", "app/ui/assets/js/*.js", "app/ui/assets/js/pages/*.js"]
|
kispilot-0.1.0/setup.cfg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""계좌 단위(종목 개별이 아닌 계좌 전체) 조회 API 모음.
|
|
2
|
+
|
|
3
|
+
from kispilot.api.account import (
|
|
4
|
+
inquire_balance_rlz_pl, inquire_account_balance,
|
|
5
|
+
inquire_period_profit, inquire_period_trade_profit,
|
|
6
|
+
inquire_intgr_margin, inquire_period_rights,
|
|
7
|
+
)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .account_inquire_balance_rlz_pl import inquire_balance_rlz_pl
|
|
11
|
+
from .account_asset_balance import inquire_account_balance
|
|
12
|
+
from .account_inquire_period_profit import inquire_period_profit
|
|
13
|
+
from .account_inquire_period_trade_profit import inquire_period_trade_profit
|
|
14
|
+
from .account_intgr_margin import inquire_intgr_margin
|
|
15
|
+
from .account_inquire_period_rights import inquire_period_rights
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"inquire_balance_rlz_pl",
|
|
19
|
+
"inquire_account_balance",
|
|
20
|
+
"inquire_period_profit",
|
|
21
|
+
"inquire_period_trade_profit",
|
|
22
|
+
"inquire_intgr_margin",
|
|
23
|
+
"inquire_period_rights",
|
|
24
|
+
]
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# 투자계좌자산현황조회[v1_국내주식-048]
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from kispilot.api.config import DOMAIN, CANO, ACNT_PRDT_CD, REAL_APPKEY, REAL_APP_SECRET
|
|
6
|
+
from kispilot.api.oauth.kis_token import load_token
|
|
7
|
+
from kispilot.api.utils.http_session import get_session
|
|
8
|
+
|
|
9
|
+
URL = "/uapi/domestic-stock/v1/trading/inquire-account-balance"
|
|
10
|
+
# ※ 모의투자 미지원 (실전투자 전용).
|
|
11
|
+
# ※ output1은 HTS(eFriend Plus) [0891] 계좌 자산비중(결제기준) 화면 아래 테이블과 동일.
|
|
12
|
+
# 자산종류별로 고정된 순서(주식/펀드/채권/... /예수금/합계 등 최대 20개, 21번 계좌는 17개)로 내려온다.
|
|
13
|
+
# ※ 응답 헤더에 tr_cont(F/M/D/E)가 있긴 하지만, 다음 페이지 요청에 필요한 CTX_AREA_FK100/NK100 같은
|
|
14
|
+
# 연속조회 키 파라미터 자체가 Query Parameter에 없다. output1이 최대 20개로 고정된 목록이라
|
|
15
|
+
# 실질적으로 연속조회가 필요 없는 것으로 보고, 페이지네이션 없이 1회 호출로 구현했다.
|
|
16
|
+
# ※ INQR_DVSN_1, BSPR_BF_DT_APLY_YN은 문서상 "공란입력"이 고정값이라 파라미터로 노출하지 않는다.
|
|
17
|
+
|
|
18
|
+
_TR_ID = "CTRP6548R"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# ── DataClass 정의 ──────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class ResponseBodyOutput1:
|
|
25
|
+
pchs_amt: Optional[str] = None # 매입금액
|
|
26
|
+
evlu_amt: Optional[str] = None # 평가금액
|
|
27
|
+
evlu_pfls_amt: Optional[str] = None # 평가손익금액
|
|
28
|
+
crdt_lnd_amt: Optional[str] = None # 신용대출금액
|
|
29
|
+
real_nass_amt: Optional[str] = None # 실제순자산금액
|
|
30
|
+
whol_weit_rt: Optional[str] = None # 전체비중율
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class ResponseBodyOutput2:
|
|
35
|
+
pchs_amt_smtl: Optional[str] = None # 매입금액합계(유가매입금액)
|
|
36
|
+
nass_tot_amt: Optional[str] = None # 순자산총금액
|
|
37
|
+
loan_amt_smtl: Optional[str] = None # 대출금액합계
|
|
38
|
+
evlu_pfls_amt_smtl: Optional[str] = None # 평가손익금액합계
|
|
39
|
+
evlu_amt_smtl: Optional[str] = None # 평가금액합계(유가평가금액)
|
|
40
|
+
tot_asst_amt: Optional[str] = None # 총자산금액
|
|
41
|
+
tot_lnda_tot_ulst_lnda: Optional[str] = None # 총대출금액총융자대출금액
|
|
42
|
+
cma_auto_loan_amt: Optional[str] = None # CMA자동대출금액
|
|
43
|
+
tot_mgln_amt: Optional[str] = None # 총담보대출금액
|
|
44
|
+
stln_evlu_amt: Optional[str] = None # 대주평가금액
|
|
45
|
+
crdt_fncg_amt: Optional[str] = None # 신용융자금액
|
|
46
|
+
ocl_apl_loan_amt: Optional[str] = None # OCL_APL대출금액
|
|
47
|
+
pldg_stup_amt: Optional[str] = None # 질권설정금액
|
|
48
|
+
frcr_evlu_tota: Optional[str] = None # 외화평가총액
|
|
49
|
+
tot_dncl_amt: Optional[str] = None # 총예수금액
|
|
50
|
+
cma_evlu_amt: Optional[str] = None # CMA평가금액
|
|
51
|
+
dncl_amt: Optional[str] = None # 예수금액
|
|
52
|
+
tot_sbst_amt: Optional[str] = None # 총대용금액
|
|
53
|
+
thdt_rcvb_amt: Optional[str] = None # 당일미수금액
|
|
54
|
+
ovrs_stck_evlu_amt1: Optional[str] = None # 해외주식평가금액1
|
|
55
|
+
ovrs_bond_evlu_amt: Optional[str] = None # 해외채권평가금액
|
|
56
|
+
mmf_cma_mgge_loan_amt: Optional[str] = None # MMF·CMA담보대출금액
|
|
57
|
+
sbsc_dncl_amt: Optional[str] = None # 청약예수금액
|
|
58
|
+
pbst_sbsc_fnds_loan_use_amt: Optional[str] = None # 공모주청약자금대출사용금액
|
|
59
|
+
etpr_crdt_grnt_loan_amt: Optional[str] = None # 기업신용공여대출금액
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class ResponseBody:
|
|
64
|
+
rt_cd: str # 성공 실패 여부
|
|
65
|
+
msg_cd: str # 응답코드
|
|
66
|
+
msg1: str # 응답메세지
|
|
67
|
+
output1: List[ResponseBodyOutput1] = field(default_factory=list) # 자산종류별 현황(배열, 최대 20개)
|
|
68
|
+
output2: ResponseBodyOutput2 = field(default_factory=ResponseBodyOutput2) # 계좌 자산 요약(단일)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# ── 요청 함수 ───────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
def inquire_account_balance() -> ResponseBody:
|
|
74
|
+
"""투자계좌 자산현황을 조회한다. (모의투자 미지원, 실전 계좌 전용)
|
|
75
|
+
|
|
76
|
+
HTS(eFriend Plus) [0891] 계좌 자산비중(결제기준) 화면과 동일한 데이터.
|
|
77
|
+
output1은 주식/펀드/채권/... /예수금/합계 등 자산종류별 현황이 고정된 순서로 최대 20개
|
|
78
|
+
(21번 계좌는 17개) 내려오고, output2는 계좌 전체의 자산/대출 요약이다.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
rt_cd/msg_cd/msg1과 자산종류별 현황(output1), 계좌 자산 요약(output2)을 담은 ResponseBody.
|
|
82
|
+
"""
|
|
83
|
+
token = load_token("real")
|
|
84
|
+
|
|
85
|
+
headers = {
|
|
86
|
+
"content-type": "application/json; charset=utf-8",
|
|
87
|
+
"authorization": f"Bearer {token}",
|
|
88
|
+
"appkey": REAL_APPKEY,
|
|
89
|
+
"appsecret": REAL_APP_SECRET,
|
|
90
|
+
"tr_id": _TR_ID,
|
|
91
|
+
"custtype": "P",
|
|
92
|
+
}
|
|
93
|
+
params = {
|
|
94
|
+
"CANO": CANO,
|
|
95
|
+
"ACNT_PRDT_CD": ACNT_PRDT_CD,
|
|
96
|
+
"INQR_DVSN_1": "",
|
|
97
|
+
"BSPR_BF_DT_APLY_YN": "",
|
|
98
|
+
}
|
|
99
|
+
response = get_session().get(DOMAIN["real"] + URL, headers=headers, params=params, timeout=10)
|
|
100
|
+
raw = response.json()
|
|
101
|
+
|
|
102
|
+
# 에러 응답(rt_cd != "0")은 output1/output2 키가 없거나 null일 수 있어 안전 파싱.
|
|
103
|
+
# 문서 표기가 Output1/Output2(대문자)라 실제 JSON 키가 소문자일 가능성을 대비해 둘 다 확인한다.
|
|
104
|
+
fields1 = set(ResponseBodyOutput1.__dataclass_fields__)
|
|
105
|
+
raw_output1 = raw.get("output1") or raw.get("Output1") or []
|
|
106
|
+
output1 = [ResponseBodyOutput1(**{k: v for k, v in item.items() if k in fields1}) for item in raw_output1]
|
|
107
|
+
|
|
108
|
+
fields2 = set(ResponseBodyOutput2.__dataclass_fields__)
|
|
109
|
+
raw_output2 = raw.get("output2") or raw.get("Output2") or {}
|
|
110
|
+
output2 = ResponseBodyOutput2(**{k: v for k, v in raw_output2.items() if k in fields2})
|
|
111
|
+
|
|
112
|
+
return ResponseBody(
|
|
113
|
+
rt_cd=raw.get("rt_cd", ""),
|
|
114
|
+
msg_cd=raw.get("msg_cd", ""),
|
|
115
|
+
msg1=raw.get("msg1", ""),
|
|
116
|
+
output1=output1,
|
|
117
|
+
output2=output2,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
# ── 실행 ────────────────────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
if __name__ == "__main__":
|
|
124
|
+
result = inquire_account_balance()
|
|
125
|
+
if result.rt_cd != "0":
|
|
126
|
+
print(f"조회 실패: {result.msg_cd} - {result.msg1}")
|
|
127
|
+
else:
|
|
128
|
+
for row in result.output1:
|
|
129
|
+
print(row)
|
|
130
|
+
print(result.output2)
|