Software Investor

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.

2,033,806 ptsHistoryOut-of-sample
500k1M1.5M2M20252026
2,033,806 ptsCumulative result
3,808Trades
20.3xResult / max. drawdown
100,071 ptsMaximum drawdown
1.57Profit factor
70%Winning trades
90%Positive months
20Longest losing streak

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.

Portfolio 2,033,806 pts · max. DD 100,071 ptsBitcoin ×9 722,520 pts · max. DD 3,323,160 pts
20252026Bitcoin ×9: 722,520 ptsCarteira: 2,033,806 pts-500k500k1M1.5M2M2.5M3M3.5M

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.

20252026Setup 01 · Short: 350,017 ptsSetup 02 · Short: 306,141 ptsSetup 03 · Short: 292,453 ptsSetup 04 · Short: 230,577 ptsSetup 05 · Short: 213,040 ptsSetup 06 · Short: 198,755 ptsSetup 07 · Short: 191,412 ptsSetup 08 · Short: 164,112 ptsSetup 09 · Short: 87,299 pts-100k100k200k300k400k

Statistics by setup

Same period and same order as the chart above, history and out-of-sample combined.

SetupSideTradesResult (pts)Max. drawdown (pts)Result / DDProfit factorWin rateAverage per trade (pts)
Setup 01Short603350,01730,52511.5x1.5176%580
Setup 02Short600306,14136,8318.3x1.4456%510
Setup 03Short603292,45324,22212.1x1.4271%485
Setup 04Short330230,57730,3247.6x1.5855%699
Setup 05Short235213,04022,0339.7x1.7369%907
Setup 06Short602198,75517,41711.4x1.6576%330
Setup 07Short330191,41216,71111.5x2.2492%580
Setup 08Short235164,11216,9619.7x1.8372%698
Setup 09Short27087,2996,53013.4x1.8569%323

Result by year

In points, all strategies combined.

YearTradesResult (pts)Max. drawdown (pts)Win rate
20241080387,70796,57370%
202515471,042,270100,07169%
2026*1181603,83064,39172%

* year in progress

Quarter-by-quarter result

10 of 10 quarters closed positive.

200kQ2/24: 62,325 ptsQ3/24: 195,128 ptsQ4/24: 130,253 ptsQ1/25: 280,151 ptsQ2/25: 164,863 ptsQ3/25: 302,359 ptsQ4/25: 294,897 ptsQ1/26: 200,541 ptsQ2/26: 251,079 ptsQ3/26: 152,210 ptsQ2/24Q4/24Q2/25Q4/25Q2/26

Month-by-month result

27 of 30 months closed positive. Hover over a bar to see the value.

50k100k150kApr/24: 21,197 ptsMay/24: 50,772 ptsJun/24: -9,643 ptsJul/24: 79,577 ptsAug/24: 82,884 ptsSep/24: 32,667 ptsOct/24: 45,494 ptsNov/24: 67,037 ptsDec/24: 17,722 ptsJan/25: 59,687 ptsFeb/25: 97,803 ptsMar/25: 122,661 ptsApr/25: -20,668 ptsMay/25: 48,848 ptsJun/25: 136,683 ptsJul/25: 156,953 ptsAug/25: 32,008 ptsSep/25: 113,398 ptsOct/25: 75,387 ptsNov/25: 183,599 ptsDec/25: 35,910 ptsJan/26: 104,459 ptsFeb/26: 77,021 ptsMar/26: 19,061 ptsApr/26: 61,706 ptsMay/26: 139,187 ptsJun/26: 50,186 ptsJul/26: 91,859 ptsAug/26: -10,347 ptsSep/26: 70,699 pts202420252026

Monthly map

In thousands of points. Green is a positive month, red is a negative one.

JanFebMarAprMayJunJulAugSepOctNovDecYear
202421.250.8-9.679.682.932.745.567.017.7387.7
202559.797.8122.7-20.748.8136.7157.032.0113.475.4183.635.91042.3
2026104.577.019.161.7139.250.291.9-10.370.7603.8

Result per trade

Average of 534 pts per trade, about 1,584 trades per year.

-10,860 to -10,113 pts: 6 trades-10,113 to -9,366 pts: 7 trades-9,366 to -8,619 pts: 17 trades-8,619 to -7,872 pts: 16 trades-7,872 to -7,125 pts: 22 trades-7,125 to -6,378 pts: 33 trades-6,378 to -5,631 pts: 60 trades-5,631 to -4,884 pts: 90 trades-4,884 to -4,137 pts: 97 trades-4,137 to -3,390 pts: 111 trades-3,390 to -2,643 pts: 135 trades-2,643 to -1,896 pts: 120 trades-1,896 to -1,149 pts: 133 trades-1,149 to -402 pts: 190 trades-402 to 345 pts: 161 trades345 to 1,092 pts: 586 trades1,092 to 1,839 pts: 861 trades1,839 to 2,586 pts: 448 trades2,586 to 3,333 pts: 445 trades3,333 to 4,080 pts: 76 trades4,080 to 4,827 pts: 66 trades4,827 to 5,574 pts: 38 trades5,574 to 6,321 pts: 32 trades6,321 to 7,068 pts: 12 trades7,068 to 7,815 pts: 13 trades7,815 to 8,562 pts: 10 trades8,562 to 9,309 pts: 8 trades9,309 to 10,056 pts: 2 trades10,056 to 10,803 pts: 6 trades10,803 to 11,550 pts: 7 trades0-10,860 pts+11,550 ptsLossesGains

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

270,159 pts
Trades
349
Largest drop
67,081 pts
Winning trades
53%

Out-of-sample

17,171 pts
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