# Harbor Strategy Lab — Phase 1 BTC/USDT baseline

Retrieval timestamp: 2026-09-29T19:20:09.254224+00:00  
Source: Binance Spot public klines, BTCUSDT 1d UTC, [official API documentation](https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#klinecandlestick-data).  
Raw returned candles: 3,330; analyzed complete candles: 3,329; actual range: 2017-08-17 through 2026-09-28. Binance returned no BTCUSDT candle before 2017-08-17, so the requested 2017-01-01 start is unavailable.

## Reproduction files

The original one-off response rows and calculation code were not saved. I regenerated the fixed historical range once from Binance at the timestamp above and saved the analyzed rows and reproducibility script here:

- [Analyzed Binance daily candles (CSV)](https://resguardo-wallets-260926.tiweedmaster.chatgpt.site/strategy-lab/btcusdt-1d-2017-08-17_2026-09-28.csv)
- [Standard-library reproduction script](https://resguardo-wallets-260926.tiweedmaster.chatgpt.site/strategy-lab/reproduce.py)
- Exact command after saving this script and the companion CSV in the same folder: `python reproduce.py`
- Runtime used: Python 3.13.9; Python standard library only; no third-party dependencies or installs.
- Saved CSV file SHA-256 (includes header and CSV delimiters): `D973EC0128A9A2DA90F2BB328A91674A0EDB171926282C050C1C8D60210B0C53`.
- Canonical analyzed-row SHA-256 (12 fields, TSV rows, UTF-8, LF, no header): `c77e2638d9b2e38a8e2e3315d240e1fb774e76951bcf771b5bf45d76f35c8397`.

The script was rerun against the saved CSV. It reproduced both hashes and the tables below, including ending equity of $9,780.55 for the base-cost SMA strategy. The earlier in-memory run happened to have the same row hash and metrics; this report is bound to the newly saved CSV and its separate file-byte hash.

## Data integrity

- Duplicate open times: 0. Truncated candle records excluded: 1 (2018-02-08). Missing UTC daily rows after exclusion: 1 (2018-02-08). Other malformed/off-grid complete candles: 0.
- The excluded 2018-02-08 record has openTime 2018-02-08T00:00Z but closeTime 2018-02-08T00:28:14.788Z, not the 23:59:59.999Z day boundary. The simulation holds the previous available position across this omitted interval and resumes at the next complete daily open; that one-day gap delays a signal by one bar.
- Latest included candle: 2026-09-28; it closed at 2026-09-28T23:59:59.999000+00:00, before the retrieval timestamp. No partial 2026-09-29 candle is included.
- SHA-256 of the analyzed candle rows: c77e2638d9b2e38a8e2e3315d240e1fb774e76951bcf771b5bf45d76f35c8397. Canonicalization: 12 fields returned by Binance, tab-separated in chronological order, UTF-8, LF after each row.
- Retrieval: GET https://api.binance.com/api/v3/klines with symbol=BTCUSDT, interval=1d, startTime=1483228800000, limit=1000; paginate using last openTime + 1. End bound is one millisecond before 2026-09-29T00:00:00Z; candles are retained only if closeTime is no later than 2026-09-29T19:20:09.254224Z.

## Fixed rules

Start with hypothetical $1,000 at the first available candle’s open. At each complete daily open, target 100% BTC if the prior valid daily close has SMA20 > SMA100; otherwise target 100% cash. Averages use only historical daily closes; trade at the next available daily open. Hold the old position from prior close to the new open, apply the new target for open-to-close returns. BTC spot only: no leverage, shorts, borrowing, staking, live orders, wallet access, or transfers. Charge 25 bps per traded notional per side; stress 50 bps per side. Ending equity includes liquidation at the last closed candle’s close. Buy-and-hold enters at the first open and exits at the last close with the same costs; cash earns 0%. The first 100 valid closes are warm-up.

Annualized volatility and Sharpe use daily net returns times sqrt(365); Sharpe risk-free rate is zero. CAGR uses elapsed UTC time divided by 365.2425 days. Drawdown uses close equity including initial capital and fees. Exposure is share of analyzed bars 100% in BTC. Turnover is gross traded notional / average daily equity; orders count each side of each rebalance and end liquidation.

## Full-period results

| Costs | Portfolio | Net CAGR | Volatility | Sharpe | Max drawdown | BTC exposure | Gross notional | Turnover / avg equity | Orders | Fees | Ending equity |
|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| Base 25bp/side | SMA20/100 | 28.42% | 47.91% | 0.767 | -70.04% | 50.98% | $214,728.50 | 4033.7% | 36 | $536.82 | $9,780.55 |
| Base 25bp/side | Buy & hold | 38.51% | 66.91% | 0.825 | -83.19% | 100.00% | $20,545.15 | 225.3% | 2 | $51.36 | $19,496.29 |
| Base 25bp/side | Cash | 0.00% | 0.00% | n/a | 0.00% | 0.00% | $0.00 | 0.0% | 0 | $0.00 | $1,000.00 |
| Stress 50bp/side | SMA20/100 | 27.15% | 47.93% | 0.746 | -70.48% | 50.98% | $202,259.49 | 4018.7% | 36 | $1,011.30 | $8,935.72 |
| Stress 50bp/side | Buy & hold | 38.44% | 66.91% | 0.824 | -83.19% | 100.00% | $20,496.16 | 225.3% | 2 | $102.48 | $19,398.68 |
| Stress 50bp/side | Cash | 0.00% | 0.00% | n/a | 0.00% | 0.00% | $0.00 | 0.0% | 0 | $0.00 | $1,000.00 |

## Time-split results

Development retains the requested 2017–2020 label but starts with available data on 2017-08-17. Each split’s metrics are compounded from its own start equity; the SMA averages and position continue from previous history. Base case includes all portfolios; stress lists the SMA strategy.

| Period | Portfolio / cost | CAGR | Volatility | Sharpe | Max drawdown | BTC exposure | Gross notional | Orders | Fees | Equity start → end |
|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| Development 2017–2020 [2017-08-17–2020-12-31] | SMA20/100, Base 25bp/side | 42.61% | 58.48% | 0.913 | -70.04% | 47.32% | $12,545.86 | 11 | $31.36 | $1,000.00 → $3,314.56 |
| Development 2017–2020 [2017-08-17–2020-12-31] | Buy & hold, Base 25bp/side | 76.22% | 80.87% | 1.115 | -83.19% | 100.00% | $1,000.00 | 1 | $2.50 | $1,000.00 → $6,770.26 |
| Development 2017–2020 [2017-08-17–2020-12-31] | Cash, Base 25bp/side | 0.00% | 0.00% | n/a | 0.00% | 0.00% | $0.00 | 0 | $0.00 | $1,000.00 → $1,000.00 |
| Development 2017–2020 [2017-08-17–2020-12-31] | SMA20/100, Stress 50bp/side | 41.45% | 58.48% | 0.899 | -70.48% | 47.32% | $12,376.11 | 11 | $61.88 | $1,000.00 → $3,224.32 |
| Validation 2021–2022 [2021-01-01–2022-12-31] | SMA20/100, Base 25bp/side | 14.09% | 48.14% | 0.512 | -42.09% | 39.18% | $24,398.16 | 5 | $61.00 | $3,314.56 → $4,313.56 |
| Validation 2021–2022 [2021-01-01–2022-12-31] | Buy & hold, Base 25bp/side | -24.39% | 73.01% | -0.017 | -76.63% | 100.00% | $0.00 | 0 | $0.00 | $6,770.26 → $3,872.14 |
| Validation 2021–2022 [2021-01-01–2022-12-31] | Cash, Base 25bp/side | 0.00% | 0.00% | n/a | 0.00% | 0.00% | $0.00 | 0 | $0.00 | $1,000.00 → $1,000.00 |
| Validation 2021–2022 [2021-01-01–2022-12-31] | SMA20/100, Stress 50bp/side | 13.37% | 48.16% | 0.499 | -42.67% | 39.18% | $23,618.28 | 5 | $118.09 | $3,224.32 → $4,143.80 |
| Holdout 2023–latest [2023-01-01–2026-09-28] | SMA20/100, Base 25bp/side | 24.45% | 35.68% | 0.790 | -40.91% | 60.57% | $177,784.48 | 20 | $444.46 | $4,313.56 → $9,780.55 |
| Holdout 2023–latest [2023-01-01–2026-09-28] | Buy & hold, Base 25bp/side | 54.02% | 46.49% | 1.160 | -52.97% | 100.00% | $19,545.15 | 1 | $48.86 | $3,872.14 → $19,496.29 |
| Holdout 2023–latest [2023-01-01–2026-09-28] | Cash, Base 25bp/side | 0.00% | 0.00% | n/a | 0.00% | 0.00% | $0.00 | 0 | $0.00 | $1,000.00 → $1,000.00 |
| Holdout 2023–latest [2023-01-01–2026-09-28] | SMA20/100, Stress 50bp/side | 22.79% | 35.71% | 0.752 | -41.79% | 60.57% | $166,265.10 | 20 | $831.33 | $4,143.80 → $8,935.72 |

## Limitations

- This is not the complete requested 2017-01-01-through-latest interval: BTCUSDT daily history begins 2017-08-17. One malformed 2018-02-08 record was excluded, leaving one missing day; its signal timing is delayed to the next complete candle. These are material data limitations.
- Results describe a fixed historical rule, not future returns, guaranteed funding, or a trading recommendation. Fees are modeled as instructed; spread, slippage, market impact, taxes, outages, execution uncertainty, and custody risk are not included. Candle prices are references, not guaranteed fills. The rule is all-in/all-cash and can have large drawdowns.
- Simulation only. No live order, wallet connection, transfer, or real-money action occurred.


