---
title: 스냅샷
description: 특정 시점의 포트폴리오 가치를 기록합니다. 스냅샷은 총 시가와 개별 포지션이 일별로 어떻게 변하는지 추적할 수 있게 합니다.
---

export const drawdownRows = [
  { cmd: 'ATH',                desc: '전고점: 스냅샷 이력에서 기록된 최고 시가. 데이터 내 최댓값입니다.' },
  { cmd: '-1.6% from ATH',     desc: '현재 ATH 대비 얼마나 낮은지 백분율로 표시. 0이면 (녹색 "at all-time high"로 표시) 오늘이 새 고점. 드로다운 중일 때 빨간색.' },
  { cmd: 'max drawdown',       desc: '전체 스냅샷 이력에서 발생한 가장 큰 peak-to-trough 하락. 회복 전까지의 최대 백분율 하락. -10%이면 어느 시점에 국지 고점에서 10% 하락 후 회복했음을 의미. 0%에 가까우면 큰 하락이 없었음.' },
];

export const editDeleteRows = [
  { cmd: <code>firma edit snapshot</code>,          desc: '인터랙티브 피커: 날짜 → 티커 → 수정할 필드 선택' },
  { cmd: <code>firma delete snapshot [date]</code>, desc: '특정 날짜의 모든 항목 삭제. 날짜 생략 시 프롬프트 표시' },
];

export const claudeExchange = [{
  user: '지난 일주일 동안 포트폴리오 어떻게 움직였어?',
  ai: <p>
    포트폴리오는 7일간 <code>$143,218</code> → <code>$165,271</code>로 상승,{' '}
    <code>+$22,053 (+15.4%)</code>. 가장 좋은 날은 4/24 (<code>+$28,322</code>),
    광범위한 시장 랠리. TSLA는 일주일간 <code>+20.4%</code>.
  </p>,
}];

<Section label="firma add snapshot">
Finnhub에서 가격을 동기화한 뒤 모든 보유 종목의 현재 시가를 로컬 스냅샷
테이블에 기록합니다. 하루 한 번 (또는 필요할 때) 실행해 포트폴리오 가치
시계열을 만듭니다.

  <Terminal
    command="firma add snapshot"
    rows={[
      { type: 'val',  label: '→', value: 'Syncing prices...' },
      { type: 'beat', text: 'Snapshot recorded for 2026-04-26: 4 holdings.' },
    ]}
  />

  <Note>
    Finnhub API 키가 필요합니다. <code>firma config set finnhub-key &lt;key&gt;</code>로
    한 번 설정합니다. 스냅샷은 <code>~/.firma/firma.db</code>에 저장되며,
    같은 날 재실행이 아닌 한 동일 날짜는 덮어쓰지 않습니다.
  </Note>
</Section>

<Section label="firma show snapshot">
티커 없이 실행: 일자별 총 시가를 ASCII 막대 차트로 표시하며 전일 대비 변화도
함께 보여줍니다. 기간을 좁히려면 <code>--from</code>과 <code>--to</code>를 사용합니다.
외화로 변환하려면 <code>-c USD</code> 등을 추가합니다.

<div className="terminal">
  <div className="terminal-line">
    <span className="term-prompt">$</span>
    <span className="term-cmd">firma show snapshot</span>
  </div>
  <table className="term-table">
    <thead>
      <tr><th>DATE</th><th colSpan={2}>TOTAL MARKET VALUE</th><th></th></tr>
    </thead>
    <tbody>
      <tr className="sep"><td colSpan={4}/></tr>
      <tr><td className="td-muted">2026-04-20</td><td><span className="term-pre g">{'━'.repeat(20)}</span>{'────'}</td><td>$143,218</td><td/></tr>
      <tr><td className="td-muted">2026-04-21</td><td><span className="term-pre g">{'━'.repeat(22)}</span>{'──'}</td><td>$155,604</td><td className="td-green">+$12,386</td></tr>
      <tr><td className="td-muted">2026-04-22</td><td><span className="term-pre o">{'━'.repeat(20)}</span>{'────'}</td><td>$142,991</td><td className="td-orange">-$12,613</td></tr>
      <tr><td className="td-muted">2026-04-23</td><td><span className="term-pre o">{'━'.repeat(20)}</span>{'────'}</td><td>$139,720</td><td className="td-orange">-$3,271</td></tr>
      <tr><td className="td-muted">2026-04-24</td><td><span className="term-pre g">{'━'.repeat(24)}</span></td><td>$168,042</td><td className="td-green">+$28,322</td></tr>
      <tr><td className="td-muted">2026-04-25</td><td><span className="term-pre o">{'━'.repeat(24)}</span></td><td>$166,388</td><td className="td-orange">-$1,654</td></tr>
      <tr><td className="td-muted">2026-04-26</td><td><span className="term-pre o">{'━'.repeat(24)}</span></td><td>$165,271</td><td className="td-orange">-$1,117</td></tr>
      <tr className="sep"><td colSpan={4}/></tr>
    </tbody>
  </table>
  <pre className="term-pre" style={{ marginTop: '0.5rem' }}>
    <span className="td-muted">ATH  $168,042  2026-04-24  ·  </span>
    <span className="term-pre o">-1.6% from ATH</span>
    <span className="td-muted">  ·  max drawdown  -10.2%</span>
  </pre>
</div>
</Section>

<Section label="firma show snapshot <ticker>">
티커와 함께 실행: 종목별 시계열을 표시. 각 스냅샷 날짜의 보유 수량, 가격,
시가, 미실현 손익. 표 아래에 드로다운 요약 한 줄이 나옵니다.

<div className="terminal">
  <div className="terminal-line">
    <span className="term-prompt">$</span>
    <span className="term-cmd">firma show snapshot TSLA</span>
  </div>
  <table className="term-table">
    <thead>
      <tr><th>DATE</th><th>SHARES</th><th>PRICE</th><th>MKT VALUE</th><th>UNREALIZED P&amp;L</th></tr>
    </thead>
    <tbody>
      <tr className="sep"><td colSpan={5}/></tr>
      <tr><td className="td-muted">2026-04-24</td><td>392.0000</td><td>$350.40</td><td>$137,356.80</td><td className="td-green">+$40,879.04</td></tr>
      <tr><td className="td-muted">2026-04-25</td><td>392.0000</td><td>$347.18</td><td>$136,094.56</td><td className="td-green">+$39,616.80</td></tr>
      <tr><td className="td-muted">2026-04-26</td><td>392.0000</td><td>$344.97</td><td>$135,228.24</td><td className="td-green">+$38,750.48</td></tr>
      <tr className="sep"><td colSpan={5}/></tr>
    </tbody>
  </table>
  <pre className="term-pre" style={{ marginTop: '0.5rem' }}>
    <span className="td-muted">ATH  $137,356.80  2026-04-24  ·  </span>
    <span className="term-pre o">-1.6% from ATH</span>
    <span className="td-muted">  ·  max drawdown  -1.6%</span>
  </pre>
</div>

  <Note>
    기간을 제한하려면 <code>--from 2026-01-01 --to 2026-04-26</code>을 사용합니다.
    스크립트나 Claude에 머신 친화 출력을 주려면 <code>--json</code>을 추가합니다.
  </Note>
</Section>

<Section label="드로다운 라인 읽기">
모든 <code>firma show snapshot</code> 출력은 데이터 아래에 한 줄 드로다운
요약을 추가합니다. 각 부분의 의미는 다음과 같습니다:

  <CommandTable rows={drawdownRows} />

  <Note>
    드로다운은 기록된 스냅샷에서만 계산되며, 실시간 가격은 사용하지 않습니다.
    연속된 시계열을 위해 <code>firma add snapshot</code>을 매일 (또는 cron으로)
    실행합니다. 이력 갭이 있으면 그림이 거칠어집니다.
  </Note>
</Section>

<Section label="수정과 삭제">
  <CommandTable rows={editDeleteRows} />

  <Note>
    <code>firma rm snapshot</code>은 <code>firma delete snapshot</code>의
    별칭입니다.
  </Note>
</Section>

<Section label="Claude와 함께">
  <ChatDemo header="Claude Desktop · firma MCP 연결됨" exchanges={claudeExchange} />
</Section>
