Three Weeks of Snapshots — Reading the 'Why' Behind the Numbers


About three weeks of snapshots have accumulated in loopery-portfolio, the personal asset analyzer I built to see Upbit (crypto) and Toss Securities (US stocks) on one screen. In the meantime I also reworked the portfolio itself.

This isn’t automated trading yet — I’m still buying and selling by hand. So this post covers two things at once: what I changed and why, and how those changes registered in the report’s numbers.

Writing it up, the two looked quite different. A good decision can show up as a bad number, and a loss can show up as an improved one.

These are personal finances, so all amounts are omitted — only percentages and quantity changes. Up/down colors follow the Korean convention: up is red, down is blue.

How the report is structured

The change report splits into four parts.

Section Question it answers Data used
1. Net worth trend Up or down overall, and what’s the crypto share? snapshots + per-day FX (fx_rates)
2. Upbit changes What did I buy and sell, and what came of it? position_snapshots + fills (trades) + daily closes
3. Toss changes What positions changed, and how against the benchmark (SPY)? position_snapshots + SPY scenario
4. Recording coverage How far can I trust the trend? Dates recorded

1. Net worth: almost flat

Net worth (KRW-converted)−1.4%09-07 → 09-28
Upbit (KRW)+11.3%09-07 → 09-28
Toss Securities (USD)−3.7%includes withdrawal
Crypto share19.4%from 17.2%

The two accounts moved in opposite directions. But the minus on Toss is not an investment loss — I took money out to spend where it was needed (explained in section 3). Adjust for that and the actual performance is better than the net worth figure suggests.

Conversion used the FX rate recorded on each day. Convert the past at today’s rate and past assets look wholesale different by however much the rate moved.

2. Upbit: putting the weight on Bitcoin

Direction: cut altcoins, push the BTC share as high as possible

For crypto I decided to raise the Bitcoin share as much as possible to keep the portfolio stable. Altcoins are far more volatile than BTC. Holding small amounts spread across several coins gives little diversification benefit and mostly just adds shake.

Date Trade
09-16 Small BTC buy with KRW
09-23 Sold all SOL → received BTC (BTC market)
09-26 Sold all XRP → received BTC (BTC market)
09-27 Small BTC buy with KRW
09-12
09-28
BTCETHSOL 8%XRP
Position weights by Upbit market value. Holdings went from four coins (BTC, ETH, SOL, XRP) to two (BTC, ETH), and BTC quantity grew 65%.

I swapped the altcoins directly into BTC on the BTC market rather than converting to won first. Routing through won means paying fees twice and accepting whatever the price does in between. I plan to keep raising the BTC share.

Watch out in the report: why unrealized P&L “improved”

Looking only at Upbit’s unrealized P&L rate, things improved a lot.

09-12 09-28
Unrealized P&L rate −18.2% −6.4%

BTC’s price over the same period was +7.4%. That alone doesn’t produce a 12pp improvement. The rest is losses dropping out of the unrealized calculation because they were realized.

Coin sold P&L rate at sale (estimated, KRW-converted)
XRP −25.5%
SOL +3.6%

The XRP loss was a loss that had already happened. Having decided to move into BTC, I accepted it and closed the position. But on a screen showing only unrealized P&L, that loss looks like it disappeared. Running the numbers, roughly 43% of the unrealized P&L improvement is this effect. The remaining 57% or so is the price actually rising.

On top of that, selling on the BTC market means proceeds are recorded in BTC. So they don’t show up in the existing KRW realized-P&L tally either. To see the won-denominated result you have to re-convert at that day’s BTC close in won (which is how the table above was estimated).

3. Toss Securities: spending the spare cash

What I did, and why

Position Change Return
QLD (2x Nasdaq) Essentially unchanged −0.6% → +6.1%
SGOV (ultra-short Treasuries) Sold entirely (~10% of the account) —
SPYM (S&P 500) New small position (~0.7% of the account) —

SGOV was the place I parked spare cash. Being ultra-short Treasuries, the price barely moves and it pays interest, so pulling from it any time costs nothing. This time I withdrew that spare cash to cover a Claude Code subscription. Part of it moved into SPYM.

I didn’t touch QLD, and over three weeks it came up to +6.1%.

Target weights: QLD 90% / safe assets 10%

Going forward the plan for the Toss account is QLD (growth) at 90% and safe assets — short-term Treasuries (SGOV) plus stable equity (SPYM) — at 10%.

09-12
09-28
Target
QLD (growth)Short-term Treasuries (SGOV) + stable equity (SPYM)
Weights by Toss Securities market value. Before the spare cash was spent (09-12), the split was almost exactly the target.

Right now, just after spending the spare cash, the QLD concentration is heavy. I intend to refill short-term Treasuries a little at a time as opportunities come, restoring the 10% safe allocation. QLD is 2x leveraged and falls hard in a down market. Simply having buffer capital you can draw on then is what makes it possible to hold.

Watch out in the report: a withdrawal looks like a loss

The report logged the Toss account at −3.7%. It also shows a comparison reading “about 4pp behind putting everything in SPY.” Neither number came from managing the account badly. They came from taking money out.

This analyzer compares the SPY scenario against purchase amount. It doesn’t separate deposits and withdrawals, so money leaving gets computed as a loss of the same size. On top of that, the Toss holdings API doesn’t return cash, so the cash balance always reads zero.

4. Recording coverage: the Chuseok gap

09-0609-1709-28
Days with a surviving snapshot (filled cells): 7 out of 23.

Between the Chuseok holidays and a busy stretch at work, there were many days I didn’t leave the computer on. I do have a scheduled task that takes a snapshot automatically each morning. But that task can wake a sleeping PC — it cannot wake a PC that is off. Neither Upbit nor Toss Securities has an API that returns past market values, so that period can’t be backfilled and stays blank.

Fortunately it didn’t affect any trading decisions, because I’m still buying and selling by hand rather than running automation. Snapshots are a record for looking back later; the trades themselves are all preserved in Upbit’s fill history. The Upbit analysis in this post is based on fills, so it’s accurate. The only thing blurred is the daily trend graph.

Summary

What I did How it registered in the report
Upbit Cleared altcoins to expand the BTC share (BTC 74%) Unrealized P&L −18% → −6% (~43% of it the effect of realizing the XRP loss)
Toss Spent spare cash (SGOV) on a Claude Code subscription −3.7%, behind SPY (withdrawal effect)
Trend Recording gap over the Chuseok holidays Only 7 of 23 days recorded

The portfolio direction is simple.

  • Crypto: concentrate in Bitcoin to lower volatility
  • Stocks: chase growth with QLD at 90%, keep short-term Treasuries and SPYM at 10% as buffer

And what I learned this time is that report numbers have to be read alongside why they came out that way. A good decision (spending spare cash) can register as a loss, and realizing a loss can register as an improvement.

Next up

Investing

  • Refill the Toss account’s safe assets (SGOV, SPYM) back toward 10%, a little at a time
  • Keep expanding the crypto BTC share

Analyzer

  • Display cash flows separately from investment returns
  • Convert BTC-market sales into won-denominated realized P&L for display
  • Mark days with no recording explicitly in the report

Comments