tossinvest-cli 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.
Files changed (39) hide show
  1. tossinvest_cli-0.1.0/.env.example +15 -0
  2. tossinvest_cli-0.1.0/.gitignore +22 -0
  3. tossinvest_cli-0.1.0/LICENSE +21 -0
  4. tossinvest_cli-0.1.0/PKG-INFO +266 -0
  5. tossinvest_cli-0.1.0/README.md +233 -0
  6. tossinvest_cli-0.1.0/docs/openapi.json +6458 -0
  7. tossinvest_cli-0.1.0/pyproject.toml +67 -0
  8. tossinvest_cli-0.1.0/src/toss_cli/__init__.py +3 -0
  9. tossinvest_cli-0.1.0/src/toss_cli/__main__.py +6 -0
  10. tossinvest_cli-0.1.0/src/toss_cli/api/__init__.py +1 -0
  11. tossinvest_cli-0.1.0/src/toss_cli/api/account.py +24 -0
  12. tossinvest_cli-0.1.0/src/toss_cli/api/market_data.py +48 -0
  13. tossinvest_cli-0.1.0/src/toss_cli/api/market_info.py +34 -0
  14. tossinvest_cli-0.1.0/src/toss_cli/api/order.py +172 -0
  15. tossinvest_cli-0.1.0/src/toss_cli/api/stock.py +17 -0
  16. tossinvest_cli-0.1.0/src/toss_cli/auth.py +129 -0
  17. tossinvest_cli-0.1.0/src/toss_cli/cli/__init__.py +1 -0
  18. tossinvest_cli-0.1.0/src/toss_cli/cli/_common.py +97 -0
  19. tossinvest_cli-0.1.0/src/toss_cli/cli/account.py +171 -0
  20. tossinvest_cli-0.1.0/src/toss_cli/cli/app.py +83 -0
  21. tossinvest_cli-0.1.0/src/toss_cli/cli/auth_cmd.py +61 -0
  22. tossinvest_cli-0.1.0/src/toss_cli/cli/info.py +40 -0
  23. tossinvest_cli-0.1.0/src/toss_cli/cli/market.py +115 -0
  24. tossinvest_cli-0.1.0/src/toss_cli/cli/order.py +235 -0
  25. tossinvest_cli-0.1.0/src/toss_cli/cli/repl.py +362 -0
  26. tossinvest_cli-0.1.0/src/toss_cli/cli/stock.py +33 -0
  27. tossinvest_cli-0.1.0/src/toss_cli/client.py +157 -0
  28. tossinvest_cli-0.1.0/src/toss_cli/config.py +123 -0
  29. tossinvest_cli-0.1.0/src/toss_cli/errors.py +56 -0
  30. tossinvest_cli-0.1.0/src/toss_cli/render.py +57 -0
  31. tossinvest_cli-0.1.0/src/toss_cli/sim.py +392 -0
  32. tossinvest_cli-0.1.0/tests/__init__.py +0 -0
  33. tossinvest_cli-0.1.0/tests/test_client.py +160 -0
  34. tossinvest_cli-0.1.0/tests/test_config.py +52 -0
  35. tossinvest_cli-0.1.0/tests/test_order_build.py +81 -0
  36. tossinvest_cli-0.1.0/tests/test_render_holdings.py +31 -0
  37. tossinvest_cli-0.1.0/tests/test_repl.py +103 -0
  38. tossinvest_cli-0.1.0/tests/test_shortcuts.py +62 -0
  39. tossinvest_cli-0.1.0/tests/test_sim.py +133 -0
@@ -0,0 +1,15 @@
1
+ # 토스증권 Open API 자격증명
2
+ # https://developers.tossinvest.com 콘솔에서 클라이언트를 등록하면 발급됩니다.
3
+ TOSS_CLIENT_ID=your-client-id
4
+ TOSS_CLIENT_SECRET=your-client-secret
5
+
6
+ # (선택) 기본 계좌 일련번호 (accountSeq). 지정하면 매번 --account 를 넘기지 않아도 됩니다.
7
+ # `toss account list` 로 확인할 수 있습니다.
8
+ TOSS_ACCOUNT_SEQ=
9
+
10
+ # (선택) API 베이스 URL. 기본값: https://openapi.tossinvest.com
11
+ # TOSS_BASE_URL=https://openapi.tossinvest.com
12
+
13
+ # (선택) 시뮬레이션 모드. 자격증명이 아직 없으면 1 로 설정하면
14
+ # `toss` 만 쳐도 모의 시세/주문으로 동작합니다. (또는 `toss --sim`)
15
+ # TOSS_SIM=1
@@ -0,0 +1,22 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ .venv/
9
+ venv/
10
+
11
+ # Test / coverage
12
+ .pytest_cache/
13
+ .coverage
14
+ htmlcov/
15
+
16
+ # Secrets & local state
17
+ .env
18
+ .env.local
19
+ *.token.json
20
+
21
+ # OS
22
+ .DS_Store
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 zihado
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.
@@ -0,0 +1,266 @@
1
+ Metadata-Version: 2.4
2
+ Name: tossinvest-cli
3
+ Version: 0.1.0
4
+ Summary: 토스증권 Open API CLI/REPL — 시세 조회부터 주문까지 (비공식)
5
+ Project-URL: Homepage, https://github.com/rescenedev/tossinvest-cli
6
+ Project-URL: Repository, https://github.com/rescenedev/tossinvest-cli
7
+ Project-URL: Issues, https://github.com/rescenedev/tossinvest-cli/issues
8
+ Author-email: zihado <zihado@gmail.com>
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: cli,repl,stock,toss,tossinvest,trading,토스증권
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Financial and Insurance Industry
15
+ Classifier: Natural Language :: Korean
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Office/Business :: Financial :: Investment
23
+ Requires-Python: >=3.10
24
+ Requires-Dist: httpx>=0.27
25
+ Requires-Dist: prompt-toolkit>=3.0
26
+ Requires-Dist: rich>=13.7
27
+ Requires-Dist: typer>=0.12
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest-mock>=3.12; extra == 'dev'
30
+ Requires-Dist: pytest>=8.0; extra == 'dev'
31
+ Requires-Dist: respx>=0.21; extra == 'dev'
32
+ Description-Content-Type: text/markdown
33
+
34
+ # tossinvest-cli
35
+
36
+ 토스증권 [Open API](https://developers.tossinvest.com/docs) 를 이용해 시세 조회부터 주문까지
37
+ 처리하는 커맨드라인 도구입니다. (비공식)
38
+
39
+ > ⚠️ **실거래 주의** — 이 도구는 실제 계좌에 주문을 전송합니다. `order buy`/`sell`/`modify`/`cancel`
40
+ > 은 기본적으로 확인 프롬프트를 거치며, `--dry-run` 으로 전송 없이 요청 내용을 먼저 확인할 수 있습니다.
41
+
42
+ ## 설치
43
+
44
+ ```bash
45
+ pip install tossinvest-cli # 또는: uv tool install tossinvest-cli
46
+ ```
47
+
48
+ 설치하면 `toss` 명령이 등록됩니다. (또는 `python -m toss_cli` 로도 실행 가능)
49
+
50
+ 소스에서 개발 설치:
51
+
52
+ ```bash
53
+ python -m venv .venv
54
+ source .venv/bin/activate
55
+ pip install -e ".[dev]"
56
+ ```
57
+
58
+ ## 설정
59
+
60
+ [토스증권 Open API 콘솔](https://developers.tossinvest.com)에서 클라이언트를 등록해
61
+ `client_id` / `client_secret` 을 발급받으세요.
62
+
63
+ `.env.example` 을 복사해 자격증명을 채웁니다:
64
+
65
+ ```bash
66
+ cp .env.example .env
67
+ ```
68
+
69
+ ```dotenv
70
+ TOSS_CLIENT_ID=your-client-id
71
+ TOSS_CLIENT_SECRET=your-client-secret
72
+ TOSS_ACCOUNT_SEQ=1 # 선택: 기본 계좌
73
+ ```
74
+
75
+ 설정 우선순위: **환경변수 > `.env`(현재 디렉터리) > `~/.toss-cli/config.toml`**.
76
+ 토큰은 `~/.toss-cli/token.json` 에 캐시되어 만료 전까지 재사용됩니다(권한 600).
77
+
78
+ 설정/토큰 상태 확인:
79
+
80
+ ```bash
81
+ toss auth status # 설정 확인 (시크릿 마스킹)
82
+ toss auth login # 토큰 강제 발급
83
+ toss auth logout # 토큰 캐시 삭제
84
+ ```
85
+
86
+ ## 대화형 셸 (REPL)
87
+
88
+ **`toss` 만 입력하면 바로 REPL 이 시작**됩니다. 매번 `toss ...` 로 새로 실행하는 대신,
89
+ 한 번 진입해 토큰·연결을 세션 내내 재사용하며 명령만 입력합니다.
90
+
91
+ ```bash
92
+ toss # 인자 없이 → REPL 시작
93
+ toss --sim # 시뮬레이션 모드로 REPL 시작 (자격증명 불필요)
94
+ toss -a 1 # 계좌 지정 후 REPL
95
+ toss repl # 명시적으로 REPL 시작
96
+ ```
97
+
98
+ ```text
99
+ SIM 토스증권 Open API REPL 계좌=1 · base=sim://local
100
+ toss> 005930 # 베어 심볼 → 현재가
101
+ toss> 005930 100 # 100주 시장가 매수
102
+ toss> 005930 -100 # 100주 시장가 매도 (음수=매도)
103
+ toss> 005930 100 70000 # 100주 지정가(70000) 매수
104
+ toss> m p 005930 # 숏컷: market price
105
+ toss> a h # 숏컷: account holdings
106
+ toss> order --help # 전체 옵션 도움말
107
+ toss> ? # 명령/숏컷 목록
108
+ toss> exit
109
+ ```
110
+
111
+ ### 숏컷
112
+
113
+ | 입력 | 동작 |
114
+ |---|---|
115
+ | `005930` | 현재가 조회 |
116
+ | `005930 000660` | 여러 종목 현재가 |
117
+ | `005930 100` | 100주 **시장가 매수** |
118
+ | `005930 -100` | 100주 **시장가 매도** (음수=매도) |
119
+ | `005930 100 70000` | 100주 **지정가(70000) 매수** |
120
+ | `005930 100 -y` | 확인 없이 매수 |
121
+ | `p` | **보유 종목** (수량·평단·현재가·평가손익·수익률·매수일) |
122
+ | `p -s 005930` | 특정 종목만 |
123
+ | `m p 005930` | `market price 005930` |
124
+ | `o b 005930 -q 10 -p 70000` | `order buy ...` |
125
+
126
+ 그룹 약어: `m`=market, `s`=stock, `i`=info, `a`=account, `o`=order. 6자리 숫자는 종목코드로 인식됩니다.
127
+
128
+ ### 메타 명령 / 동작
129
+
130
+ | 명령 | 설명 |
131
+ |---|---|
132
+ | `help` / `?` | 명령·숏컷 목록 |
133
+ | `:account <seq>` | 세션 계좌 변경 |
134
+ | `:json` | JSON 출력 토글 |
135
+ | `:tick [%]` | 모의 시세 이동 (sim 전용, 기본 +1%) → 손익 변화 확인 |
136
+ | `:reset` | 시뮬레이션 상태 초기화 (sim 전용) |
137
+ | `:clear` | 화면 지우기 |
138
+ | `exit` / `quit` / `Ctrl-D` | 종료 |
139
+
140
+ - 모든 CLI 서브커맨드/옵션/`--help` 가 셸 안에서 동일하게 동작합니다.
141
+ - 잘못된 명령이나 API 오류가 나도 셸은 종료되지 않습니다.
142
+ - prompt_toolkit 기반 **명령 히스토리**(`~/.toss-cli/repl_history`)와 **자동완성** 지원.
143
+
144
+ > 토스 Open API 는 현재 REST 만 제공하며 WebSocket/실시간 푸시는 지원하지 않습니다.
145
+
146
+ ## 시뮬레이션 모드
147
+
148
+ 자격증명이 아직 없으면 **시뮬레이션 모드**로 모든 기능을 체험할 수 있습니다.
149
+ 실제 API 를 호출하지 않고 결정적 모의 시세를 만들며, 주문은
150
+ `~/.toss-cli/sim_state.json` 에 저장돼 예수금·포지션·주문이 이어집니다.
151
+
152
+ ```bash
153
+ toss --sim # sim 모드 REPL
154
+ toss --sim market price 005930 # sim 모드 단발 실행
155
+ ```
156
+
157
+ - `.env` 에 `TOSS_SIM=1` 을 넣으면 자격증명 없이 `toss` 만 쳐도 sim 모드로 시작합니다.
158
+ - 자격증명이 아예 없을 때 `toss` 를 실행하면 자동으로 sim 모드로 전환됩니다.
159
+ - sim 모드의 주문은 확인 프롬프트 없이 즉시 접수되며 `[SIM]` 으로 표시됩니다.
160
+ - 시장가 주문은 즉시 체결, 지정가 주문은 미체결(PENDING) 상태로 보관됩니다.
161
+ - 매수 후 `:tick 5` 처럼 시세를 움직이면 `p`(보유 종목)에서 평가손익이 변합니다.
162
+ - `:reset` 으로 모의 예수금·포지션·주문을 초기화합니다.
163
+
164
+ ```text
165
+ toss> 005930 100 # 100주 매수 (체결가 15,900)
166
+ toss> :tick 5 # 시세 +5%
167
+ toss> p # 005930 100주 · 평가손익 +80,000 (+5.03%) · 매수일 표시
168
+ ```
169
+
170
+ > 실 API 의 보유종목 응답에는 매수일이 없어 실거래 모드에서 `매수일` 은 `-` 로 표시됩니다.
171
+
172
+ ## 사용법 (단발 실행)
173
+
174
+ 전역 옵션: `--account/-a <accountSeq>`, `--json`(원본 JSON 출력), `--version`.
175
+
176
+ ### 시세 (market)
177
+
178
+ ```bash
179
+ toss market price 005930 000660 # 현재가 (여러 종목)
180
+ toss market orderbook 005930 # 호가
181
+ toss market trades 005930 -n 20 # 최근 체결
182
+ toss market candles 005930 -i 1d -n 30 # 캔들 (1m | 1d)
183
+ toss market limits 005930 # 상/하한가
184
+ ```
185
+
186
+ ### 종목 정보 (stock)
187
+
188
+ ```bash
189
+ toss stock info 005930 AAPL # 기본 정보
190
+ toss stock warnings 005930 # 매수 유의사항
191
+ ```
192
+
193
+ ### 시장 정보 (info)
194
+
195
+ ```bash
196
+ toss info fx --base USD --quote KRW # 환율
197
+ toss info calendar KR --date 2026-06-03 # 거래 캘린더 (KR | US)
198
+ ```
199
+
200
+ ### 계좌/자산 (account)
201
+
202
+ ```bash
203
+ toss account list # 계좌 목록 (accountSeq 확인)
204
+ toss account holdings # 보유 주식
205
+ toss account buying-power -c KRW # 매수 가능 금액
206
+ toss account sellable 005930 # 매도 가능 수량
207
+ ```
208
+
209
+ ### 주문 (order)
210
+
211
+ ```bash
212
+ # 매수 — 지정가 (확인 프롬프트 후 전송)
213
+ toss order buy 005930 -q 10 -p 70000
214
+
215
+ # 전송 전 요청만 미리보기
216
+ toss order buy 005930 -q 10 -p 70000 --dry-run
217
+
218
+ # 시장가 매도, 확인 생략
219
+ toss order sell 005930 -q 10 -t MARKET -y
220
+
221
+ # 미국 주식 금액 기반 매수 (US MARKET 전용)
222
+ toss order buy AAPL --amount 100.5 -t MARKET
223
+
224
+ # 멱등성 키로 재전송 방지
225
+ toss order buy 005930 -q 10 -p 70000 --id my-order-001
226
+
227
+ toss order list -s OPEN # 미체결 주문
228
+ toss order get <orderId> # 주문 단건
229
+ toss order modify <orderId> -q 5 -p 71000 # 정정
230
+ toss order cancel <orderId> # 취소
231
+ toss order commissions # 매매 수수료
232
+ ```
233
+
234
+ #### 주문 규칙 (스펙 기준 사전 검증)
235
+
236
+ - `--quantity` 와 `--amount` 는 동시 사용 불가, 하나는 필수.
237
+ - `LIMIT` 은 `--price` 필수, `MARKET` 은 `--price` 사용 불가.
238
+ - 금액 기반(`--amount`) 주문은 US `MARKET` 전용.
239
+ - 1억원 이상 주문은 `--confirm-high-value` 필요.
240
+
241
+ ## 개발
242
+
243
+ ```bash
244
+ pip install -e ".[dev]"
245
+ pytest
246
+ ```
247
+
248
+ ## 구조
249
+
250
+ ```
251
+ src/toss_cli/
252
+ config.py 설정 로딩 (env / .env / toml)
253
+ auth.py OAuth2 토큰 발급 + 캐싱
254
+ client.py HTTP 클라이언트 (인증/429 재시도/에러)
255
+ errors.py TossApiError 모델
256
+ render.py rich 표/JSON 출력
257
+ api/ 엔드포인트 그룹별 래퍼
258
+ cli/ Typer 커맨드 그룹 (+ repl.py 대화형 셸)
259
+ ```
260
+
261
+ 전체 OpenAPI 스펙은 `docs/openapi.json` 에 보관되어 있습니다 (구현 기준 v1.1.1).
262
+
263
+ ## 면책
264
+
265
+ 비공식 도구입니다. 사용에 따른 거래 결과의 책임은 사용자에게 있습니다.
266
+ API 사양은 [공식 문서](https://developers.tossinvest.com/docs)를 따릅니다.
@@ -0,0 +1,233 @@
1
+ # tossinvest-cli
2
+
3
+ 토스증권 [Open API](https://developers.tossinvest.com/docs) 를 이용해 시세 조회부터 주문까지
4
+ 처리하는 커맨드라인 도구입니다. (비공식)
5
+
6
+ > ⚠️ **실거래 주의** — 이 도구는 실제 계좌에 주문을 전송합니다. `order buy`/`sell`/`modify`/`cancel`
7
+ > 은 기본적으로 확인 프롬프트를 거치며, `--dry-run` 으로 전송 없이 요청 내용을 먼저 확인할 수 있습니다.
8
+
9
+ ## 설치
10
+
11
+ ```bash
12
+ pip install tossinvest-cli # 또는: uv tool install tossinvest-cli
13
+ ```
14
+
15
+ 설치하면 `toss` 명령이 등록됩니다. (또는 `python -m toss_cli` 로도 실행 가능)
16
+
17
+ 소스에서 개발 설치:
18
+
19
+ ```bash
20
+ python -m venv .venv
21
+ source .venv/bin/activate
22
+ pip install -e ".[dev]"
23
+ ```
24
+
25
+ ## 설정
26
+
27
+ [토스증권 Open API 콘솔](https://developers.tossinvest.com)에서 클라이언트를 등록해
28
+ `client_id` / `client_secret` 을 발급받으세요.
29
+
30
+ `.env.example` 을 복사해 자격증명을 채웁니다:
31
+
32
+ ```bash
33
+ cp .env.example .env
34
+ ```
35
+
36
+ ```dotenv
37
+ TOSS_CLIENT_ID=your-client-id
38
+ TOSS_CLIENT_SECRET=your-client-secret
39
+ TOSS_ACCOUNT_SEQ=1 # 선택: 기본 계좌
40
+ ```
41
+
42
+ 설정 우선순위: **환경변수 > `.env`(현재 디렉터리) > `~/.toss-cli/config.toml`**.
43
+ 토큰은 `~/.toss-cli/token.json` 에 캐시되어 만료 전까지 재사용됩니다(권한 600).
44
+
45
+ 설정/토큰 상태 확인:
46
+
47
+ ```bash
48
+ toss auth status # 설정 확인 (시크릿 마스킹)
49
+ toss auth login # 토큰 강제 발급
50
+ toss auth logout # 토큰 캐시 삭제
51
+ ```
52
+
53
+ ## 대화형 셸 (REPL)
54
+
55
+ **`toss` 만 입력하면 바로 REPL 이 시작**됩니다. 매번 `toss ...` 로 새로 실행하는 대신,
56
+ 한 번 진입해 토큰·연결을 세션 내내 재사용하며 명령만 입력합니다.
57
+
58
+ ```bash
59
+ toss # 인자 없이 → REPL 시작
60
+ toss --sim # 시뮬레이션 모드로 REPL 시작 (자격증명 불필요)
61
+ toss -a 1 # 계좌 지정 후 REPL
62
+ toss repl # 명시적으로 REPL 시작
63
+ ```
64
+
65
+ ```text
66
+ SIM 토스증권 Open API REPL 계좌=1 · base=sim://local
67
+ toss> 005930 # 베어 심볼 → 현재가
68
+ toss> 005930 100 # 100주 시장가 매수
69
+ toss> 005930 -100 # 100주 시장가 매도 (음수=매도)
70
+ toss> 005930 100 70000 # 100주 지정가(70000) 매수
71
+ toss> m p 005930 # 숏컷: market price
72
+ toss> a h # 숏컷: account holdings
73
+ toss> order --help # 전체 옵션 도움말
74
+ toss> ? # 명령/숏컷 목록
75
+ toss> exit
76
+ ```
77
+
78
+ ### 숏컷
79
+
80
+ | 입력 | 동작 |
81
+ |---|---|
82
+ | `005930` | 현재가 조회 |
83
+ | `005930 000660` | 여러 종목 현재가 |
84
+ | `005930 100` | 100주 **시장가 매수** |
85
+ | `005930 -100` | 100주 **시장가 매도** (음수=매도) |
86
+ | `005930 100 70000` | 100주 **지정가(70000) 매수** |
87
+ | `005930 100 -y` | 확인 없이 매수 |
88
+ | `p` | **보유 종목** (수량·평단·현재가·평가손익·수익률·매수일) |
89
+ | `p -s 005930` | 특정 종목만 |
90
+ | `m p 005930` | `market price 005930` |
91
+ | `o b 005930 -q 10 -p 70000` | `order buy ...` |
92
+
93
+ 그룹 약어: `m`=market, `s`=stock, `i`=info, `a`=account, `o`=order. 6자리 숫자는 종목코드로 인식됩니다.
94
+
95
+ ### 메타 명령 / 동작
96
+
97
+ | 명령 | 설명 |
98
+ |---|---|
99
+ | `help` / `?` | 명령·숏컷 목록 |
100
+ | `:account <seq>` | 세션 계좌 변경 |
101
+ | `:json` | JSON 출력 토글 |
102
+ | `:tick [%]` | 모의 시세 이동 (sim 전용, 기본 +1%) → 손익 변화 확인 |
103
+ | `:reset` | 시뮬레이션 상태 초기화 (sim 전용) |
104
+ | `:clear` | 화면 지우기 |
105
+ | `exit` / `quit` / `Ctrl-D` | 종료 |
106
+
107
+ - 모든 CLI 서브커맨드/옵션/`--help` 가 셸 안에서 동일하게 동작합니다.
108
+ - 잘못된 명령이나 API 오류가 나도 셸은 종료되지 않습니다.
109
+ - prompt_toolkit 기반 **명령 히스토리**(`~/.toss-cli/repl_history`)와 **자동완성** 지원.
110
+
111
+ > 토스 Open API 는 현재 REST 만 제공하며 WebSocket/실시간 푸시는 지원하지 않습니다.
112
+
113
+ ## 시뮬레이션 모드
114
+
115
+ 자격증명이 아직 없으면 **시뮬레이션 모드**로 모든 기능을 체험할 수 있습니다.
116
+ 실제 API 를 호출하지 않고 결정적 모의 시세를 만들며, 주문은
117
+ `~/.toss-cli/sim_state.json` 에 저장돼 예수금·포지션·주문이 이어집니다.
118
+
119
+ ```bash
120
+ toss --sim # sim 모드 REPL
121
+ toss --sim market price 005930 # sim 모드 단발 실행
122
+ ```
123
+
124
+ - `.env` 에 `TOSS_SIM=1` 을 넣으면 자격증명 없이 `toss` 만 쳐도 sim 모드로 시작합니다.
125
+ - 자격증명이 아예 없을 때 `toss` 를 실행하면 자동으로 sim 모드로 전환됩니다.
126
+ - sim 모드의 주문은 확인 프롬프트 없이 즉시 접수되며 `[SIM]` 으로 표시됩니다.
127
+ - 시장가 주문은 즉시 체결, 지정가 주문은 미체결(PENDING) 상태로 보관됩니다.
128
+ - 매수 후 `:tick 5` 처럼 시세를 움직이면 `p`(보유 종목)에서 평가손익이 변합니다.
129
+ - `:reset` 으로 모의 예수금·포지션·주문을 초기화합니다.
130
+
131
+ ```text
132
+ toss> 005930 100 # 100주 매수 (체결가 15,900)
133
+ toss> :tick 5 # 시세 +5%
134
+ toss> p # 005930 100주 · 평가손익 +80,000 (+5.03%) · 매수일 표시
135
+ ```
136
+
137
+ > 실 API 의 보유종목 응답에는 매수일이 없어 실거래 모드에서 `매수일` 은 `-` 로 표시됩니다.
138
+
139
+ ## 사용법 (단발 실행)
140
+
141
+ 전역 옵션: `--account/-a <accountSeq>`, `--json`(원본 JSON 출력), `--version`.
142
+
143
+ ### 시세 (market)
144
+
145
+ ```bash
146
+ toss market price 005930 000660 # 현재가 (여러 종목)
147
+ toss market orderbook 005930 # 호가
148
+ toss market trades 005930 -n 20 # 최근 체결
149
+ toss market candles 005930 -i 1d -n 30 # 캔들 (1m | 1d)
150
+ toss market limits 005930 # 상/하한가
151
+ ```
152
+
153
+ ### 종목 정보 (stock)
154
+
155
+ ```bash
156
+ toss stock info 005930 AAPL # 기본 정보
157
+ toss stock warnings 005930 # 매수 유의사항
158
+ ```
159
+
160
+ ### 시장 정보 (info)
161
+
162
+ ```bash
163
+ toss info fx --base USD --quote KRW # 환율
164
+ toss info calendar KR --date 2026-06-03 # 거래 캘린더 (KR | US)
165
+ ```
166
+
167
+ ### 계좌/자산 (account)
168
+
169
+ ```bash
170
+ toss account list # 계좌 목록 (accountSeq 확인)
171
+ toss account holdings # 보유 주식
172
+ toss account buying-power -c KRW # 매수 가능 금액
173
+ toss account sellable 005930 # 매도 가능 수량
174
+ ```
175
+
176
+ ### 주문 (order)
177
+
178
+ ```bash
179
+ # 매수 — 지정가 (확인 프롬프트 후 전송)
180
+ toss order buy 005930 -q 10 -p 70000
181
+
182
+ # 전송 전 요청만 미리보기
183
+ toss order buy 005930 -q 10 -p 70000 --dry-run
184
+
185
+ # 시장가 매도, 확인 생략
186
+ toss order sell 005930 -q 10 -t MARKET -y
187
+
188
+ # 미국 주식 금액 기반 매수 (US MARKET 전용)
189
+ toss order buy AAPL --amount 100.5 -t MARKET
190
+
191
+ # 멱등성 키로 재전송 방지
192
+ toss order buy 005930 -q 10 -p 70000 --id my-order-001
193
+
194
+ toss order list -s OPEN # 미체결 주문
195
+ toss order get <orderId> # 주문 단건
196
+ toss order modify <orderId> -q 5 -p 71000 # 정정
197
+ toss order cancel <orderId> # 취소
198
+ toss order commissions # 매매 수수료
199
+ ```
200
+
201
+ #### 주문 규칙 (스펙 기준 사전 검증)
202
+
203
+ - `--quantity` 와 `--amount` 는 동시 사용 불가, 하나는 필수.
204
+ - `LIMIT` 은 `--price` 필수, `MARKET` 은 `--price` 사용 불가.
205
+ - 금액 기반(`--amount`) 주문은 US `MARKET` 전용.
206
+ - 1억원 이상 주문은 `--confirm-high-value` 필요.
207
+
208
+ ## 개발
209
+
210
+ ```bash
211
+ pip install -e ".[dev]"
212
+ pytest
213
+ ```
214
+
215
+ ## 구조
216
+
217
+ ```
218
+ src/toss_cli/
219
+ config.py 설정 로딩 (env / .env / toml)
220
+ auth.py OAuth2 토큰 발급 + 캐싱
221
+ client.py HTTP 클라이언트 (인증/429 재시도/에러)
222
+ errors.py TossApiError 모델
223
+ render.py rich 표/JSON 출력
224
+ api/ 엔드포인트 그룹별 래퍼
225
+ cli/ Typer 커맨드 그룹 (+ repl.py 대화형 셸)
226
+ ```
227
+
228
+ 전체 OpenAPI 스펙은 `docs/openapi.json` 에 보관되어 있습니다 (구현 기준 v1.1.1).
229
+
230
+ ## 면책
231
+
232
+ 비공식 도구입니다. 사용에 따른 거래 결과의 책임은 사용자에게 있습니다.
233
+ API 사양은 [공식 문서](https://developers.tossinvest.com/docs)를 따릅니다.