Strategy portfolio on Bitcoin
Nine systematic strategies trading together on Bitcoin futures (BIT), 10-minute chart. 3,808 simulated trades over 2.4 years, with a separate out-of-sample validation period.
History and validation
The history was used to build the portfolio. The out-of-sample period starts after the cutoff date and did not influence any choice.
History (in-sample)
1,710,395 pts
- Trades
- 3194
- Max. drawdown
- 100,071 pts
- Result / DD
- 17.1x
- Win rate
- 70%
Apr 23, 2024 to May 6, 2026
Out-of-sample (OOS)
323,411 pts
- Trades
- 614
- Max. drawdown
- 57,927 pts
- Result / DD
- 5.6x
- Win rate
- 73%
May 7, 2026 to Sep 18, 2026, no adjustment after the cutoff
Portfolio vs. Bitcoin
Cumulative portfolio result in points, with one contract per setup (9 contracts in total), versus the raw Bitcoin futures series (continuous BIT, unadjusted) multiplied by 9 for the same exposure.
Performance by setup
Cumulative result of each of the nine strategies. The dashed line marks the start of the out-of-sample period. Click a setup to highlight it.
Statistics by setup
Same period and same order as the chart above, history and out-of-sample combined.
| Setup | Side | Trades | Result (pts) | Max. drawdown (pts) | Result / DD | Profit factor | Win rate | Average per trade (pts) |
|---|---|---|---|---|---|---|---|---|
| Setup 01 | Short | 603 | 350,017 | 30,525 | 11.5x | 1.51 | 76% | 580 |
| Setup 02 | Short | 600 | 306,141 | 36,831 | 8.3x | 1.44 | 56% | 510 |
| Setup 03 | Short | 603 | 292,453 | 24,222 | 12.1x | 1.42 | 71% | 485 |
| Setup 04 | Short | 330 | 230,577 | 30,324 | 7.6x | 1.58 | 55% | 699 |
| Setup 05 | Short | 235 | 213,040 | 22,033 | 9.7x | 1.73 | 69% | 907 |
| Setup 06 | Short | 602 | 198,755 | 17,417 | 11.4x | 1.65 | 76% | 330 |
| Setup 07 | Short | 330 | 191,412 | 16,711 | 11.5x | 2.24 | 92% | 580 |
| Setup 08 | Short | 235 | 164,112 | 16,961 | 9.7x | 1.83 | 72% | 698 |
| Setup 09 | Short | 270 | 87,299 | 6,530 | 13.4x | 1.85 | 69% | 323 |
Result by year
In points, all strategies combined.
| Year | Trades | Result (pts) | Max. drawdown (pts) | Win rate |
|---|---|---|---|---|
| 2024 | 1080 | 387,707 | 96,573 | 70% |
| 2025 | 1547 | 1,042,270 | 100,071 | 69% |
| 2026* | 1181 | 603,830 | 64,391 | 72% |
* year in progress
Quarter-by-quarter result
10 of 10 quarters closed positive.
Month-by-month result
27 of 30 months closed positive. Hover over a bar to see the value.
Monthly map
In thousands of points. Green is a positive month, red is a negative one.
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2024 | 21.2 | 50.8 | -9.6 | 79.6 | 82.9 | 32.7 | 45.5 | 67.0 | 17.7 | 387.7 | |||
| 2025 | 59.7 | 97.8 | 122.7 | -20.7 | 48.8 | 136.7 | 157.0 | 32.0 | 113.4 | 75.4 | 183.6 | 35.9 | 1042.3 |
| 2026 | 104.5 | 77.0 | 19.1 | 61.7 | 139.2 | 50.2 | 91.9 | -10.3 | 70.7 | 603.8 |
Result per trade
Average of 534 pts per trade, about 1,584 trades per year.
Source code of a strategy
An example for technical audit: a research strategy, outside the portfolio and with more modest performance than the nine above. It is plain Python, with no libraries, and runs on any CSV of 10-minute BIT bars. Each trade in the list can be checked against your own data.
History
- Trades
- 349
- Largest drop
- 67,081 pts
- Winning trades
- 53%
Out-of-sample
- Trades
- 66
- Largest drop
- 41,753 pts
- Winning trades
- 52%
# python bit.py (CSV: datetime,open,high,low,close,roll)
F="BIT_M10.csv"
a,b,c,d,e=.025,.0175,50,60,1050
L=open(F).read().splitlines()
H=L[0].split(",")
I=[H.index(k) for k in("datetime","open","high","low","close","roll")]
D={}
for s in L[1:]:
r=s.split(",")
t,o,h,l,x,z=[r[i] for i in I]
D.setdefault(t[:10],[]).append((t,int(t[11:13])*60+int(t[14:16])+10,float(o),float(h),float(l),float(x),z=="True"))
K=list(D)
n=S=0
for k in range(1,len(K)):
P,T=D[K[k-1]],D[K[k]]
u=max(q[3] for q in P);v=min(q[4] for q in P)
if u<=v:continue
for i in range(len(T)-1):
t,m,_,_,_,x,z=T[i]
if z or m>=e or not(x-v)/(u-v)*100<c:continue
g=x*(1-a);s=x*(1+b);w=T[i+1][5]
for j in range(i+1,len(T)):
_,m,_,h,l,y,_=T[j]
if l<=g and h>=s:raise SystemExit(T[j][0])
if l<=g:w=g;break
if h>=s:w=s;break
w=y
if j-i>=d or m>=e or j==len(T)-1:break
print("%s;%.1f;%.1f;%.1f"%(t,x,w,x-w))
n+=1;S+=x-w
break
print(n,round(S))
Result in points, 1 contract, before costs. The simulation of the portfolio strategies follows the same entry, target, stop and exit mechanics; some have variations (such as a trailing stop) that do not appear in this example. The rules and parameters of the nine strategies remain confidential.
Want to talk?
I present the work in detail to anyone who is interested.
Contact