TradingBook은 append-only CSV 원장에 매수, 매도, 스탑 이동 내역을 기록하고
해당 로그만으로 현재 포지션, 평균 단가, 리스크, 실현 손익 등을 재현할 수 있는
초경량 커맨드라인 포트폴리오 트래커입니다.
# 프로젝트 루트에서 실행
python -m tradingbook.main
# 또는
python src/main.py- 최초 실행 시
data/폴더와data/trades.csv파일이 자동으로 생성됩니다. - 외부 패키지 없이 Python 3.9+ 표준 라이브러리만 사용합니다.
| 명령어 | 위치 인자 | 옵션 인자 | 설명 |
|---|---|---|---|
add |
TICKER QTY PRICE STOP |
NOTE, --date YYYY-MM-DD |
새로운 트랜치(매수) 추가 |
trim |
TICKER QTY |
--id LOT_ID, --price PRICE, NOTE, --date |
특정 트랜치에서 일부 매도 |
close |
TICKER |
--id LOT_ID, --price PRICE, NOTE, --date |
특정 트랜치를 전량 매도 (내부적으로 trim 호출) |
stop |
TICKER NEW_STOP |
--id LOT_ID, NOTE, --date |
트랜치의 스탑가 이동 |
split |
TICKER |
--id LOT_ID, --parts "QTY:STOP ...", --date |
기존 트랜치를 여러 개로 분할하여 서로 다른 스탑 지정 |
report |
없음 | 없음 | Ticker 단위 요약 리포트 (합산 뷰) |
status |
없음 | 없음 | Lot(ID) 단위 상세 리포트 (개별 트랜치 뷰) |
summary |
없음 | 없음 | status + report 통합 출력 |
모든 명령은 append-only 방식으로
data/trades.csv에 행을 추가하며,
프로그램은 매 실행 시 CSV를 읽어build_portfolio()로 상태를 재구성합니다.
📌 모든 수치(
qty,price,stop)는Decimal로 정밀하게 처리됩니다. 각 명령어는 CSV에 새로운 행을 추가하며, 기존 데이터를 수정하거나 삭제하지 않습니다.
- 사용자가
--id LOT_ID옵션을 주면, 프로그램이 자동으로note필드에id=LOT_ID형식으로 삽입합니다. - 사용자는
id=...를 직접 note에 입력할 필요가 없습니다. - note에는 원하는 메모를 자유롭게 덧붙일 수 있습니다.
tb trim QQQ 5 --id 3 --price 445.5 "scalp"
# → 저장되는 note: "trim id=3 scalp"❗ CSV를 수동 편집하거나 외부에서 임포트할 경우에는
id=N형식이 정확히 있어야 포트폴리오 복원 시 매도 대상 lot이 정확히 매칭됩니다.
# 1️⃣ 매수 ─ QQQ 10주 @ 430.25, 초기 스탑 418
tb add QQQ 10 430.25 418 "setup A"
# 2️⃣ 일부 매도 ─ lot id=3 에서 5주 매도 @ 445.50
tb trim QQQ 5 --id 3 --price 445.50 "partial"
# 3️⃣ 분할 스탑 관리 ─ lot id=3 을 5주+5주 로 나누고 각기 다른 스탑 지정
tb split QQQ --id 3 --parts "5:425 5:418"
# 4️⃣ 스탑 이동 ─ ❶번(남은) 트랜치(id=3) 스탑을 435.0 으로 조정
tb stop QQQ 435.0 --id 3 "trail-up"
# 5️⃣ 전량 매도 ─ lot id=5 완전 청산 @ 450.0
tb close QQQ --id 5 --price 450.0 "exit all"
# 6️⃣ 현재 트랜치 상세 확인
tb status
# 7️⃣ 전체 포트폴리오 요약 + 상세 한 번에 보기
tb summary여러 스탑으로 관리하려는 기존 트랜치를 split 명령으로 나눌 수 있다.
--parts 옵션에 수량:STOP 토큰을 공백으로 나열하면 된다. 첫 토큰은
남길 수량과 새 스탑을 의미하며 나머지는 새로 생성될 트랜치가 된다.
# lot id=3을 두 파트로 분할
tb split QQQ --id 3 --parts "5:420 5:415"분할 과정은 0원의 실현손익만 발생하므로 이후 status 나 report로
포지션을 그대로 추적할 수 있다.
| 설계 철학 | 설명 |
|---|---|
| Append-only 구조 | 모든 내역이 CSV에 남아 디버깅, 세무, 백테스트에 유리 |
| CLI 입력과 CSV 파싱의 분리 | --id는 내부적으로 note에 삽입되어 저장되며, 복원 시 note만으로 대상 lot 추적 가능 |
| Decimal 연산 사용 | 금융 수치 계산에서 float 오차 없이 정확한 결과 보장 |
| 명령 = 행 추가 | 불변성 기반 구조로 리스크 없는 리플레이 & 분석 가능 |