Strategy portfolio on the Micro E-mini Russell 2000
Four systematic strategies trading together on the M2K, 10-minute chart. 3,316 simulated trades over 7.4 years, with the position closed at the end of the week.
Portfolio vs. M2K
Cumulative portfolio result in points, with one contract per setup (4 contracts in total), versus the raw continuous M2K series (unadjusted) multiplied by 4 to have the same exposure.
Performance by setup
Cumulative result of each of the four strategies. Click a setup to highlight it.
Statistics by setup
Same period and same order as the chart above.
| Setup | Side | Trades | Result (pts) | Max. drawdown (pts) | Result / DD | Profit factor | Win rate | Average per trade (pts) |
|---|---|---|---|---|---|---|---|---|
| Setup 01 | Long | 748 | 900 | 103 | 8,8x | 1.49 | 77% | 1.2 |
| Setup 02 | Long | 1514 | 2,589 | 421 | 6,1x | 1.20 | 54% | 1.7 |
| Setup 03 | Long | 524 | 1,838 | 208 | 8,8x | 1.56 | 57% | 3.5 |
| Setup 04 | Long | 530 | 1,783 | 216 | 8,2x | 1.54 | 58% | 3.4 |
Result by year
In index points, all strategies combined.
| Year | Trades | Result (pts) | Max. drawdown (pts) | Win rate |
|---|---|---|---|---|
| 2019 | 238 | 155 | 174 | 60% |
| 2020 | 434 | 1,364 | 232 | 65% |
| 2021 | 491 | 1,382 | 395 | 64% |
| 2022 | 523 | 655 | 317 | 60% |
| 2023 | 455 | 303 | 541 | 54% |
| 2024 | 468 | 829 | 343 | 59% |
| 2025 | 434 | 1,097 | 368 | 60% |
| 2026* | 273 | 1,326 | 192 | 60% |
* year in progress
Quarter-by-quarter result
26 of 30 quarters closed positive.
Month-by-month result
65 of 89 months closed positive. Hover over a bar to see the value.
Monthly map
In points. Green is a positive month, red is a negative one.
| Jan | Fev | Mar | Abr | Mai | Jun | Jul | Ago | Set | Out | Nov | Dez | Year | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2019 | -17 | 51 | 33 | -75 | 113 | -28 | 48 | 31 | 155 | ||||
| 2020 | 75 | -160 | 295 | 332 | 68 | 24 | 28 | 41 | 134 | 32 | 219 | 276 | 1,364 |
| 2021 | 371 | 283 | 297 | -134 | 119 | 251 | 89 | -11 | 85 | 108 | -49 | -27 | 1,382 |
| 2022 | -131 | 307 | 106 | -78 | 299 | -191 | 124 | -42 | 126 | 222 | 124 | -210 | 655 |
| 2023 | 174 | -98 | -145 | -12 | 100 | 206 | 162 | 20 | -217 | -248 | 144 | 218 | 303 |
| 2024 | 21 | 191 | 75 | -69 | 104 | 55 | 105 | 36 | 14 | -21 | 243 | 76 | 829 |
| 2025 | 210 | 86 | -80 | 206 | 142 | 133 | 13 | 194 | 216 | 1 | 97 | -120 | 1,097 |
| 2026 | 130 | 269 | 256 | 365 | 273 | 107 | -6 | 38 | -105 | 1,326 |
Result per trade
Average of 2.1 pts per trade, about 447 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 four above. It is plain Python, with no libraries, and runs on any CSV of 10-minute bars of the M2K. Each trade in the list can be checked against your own data.
05/2019 a 01/2023
- Trades
- 326
- Largest drop
- 568 pts
- Winning trades
- 43%
01/2023 a 09/2026
- Trades
- 274
- Largest drop
- 348 pts
- Winning trades
- 44%
# python m2k.py (CSV: time,open,high,low,close,contract,roll)
F="M2K_M10.csv"
a,b,c,d=.03,.015,90,768
L=open(F).read().splitlines()
H=L[0].split(",")
I=[H.index(k) for k in("time","high","low","close","contract","roll")]
B=[]
for s in L[1:]:
r=s.split(",")
t,h,l,x,k,z=[r[i] for i in I]
B.append((t,float(h),float(l),float(x),k,z=="True"))
N=len(B)
def q(t):
y,m,e=int(t[:4]),int(t[5:7]),int(t[8:10])
if m<3:y-=1
return (y+y//4-y//100+y//400+[0,3,2,5,0,3,5,1,4,6,2,4][m-1]+e)%7+1
G={};R={}
for x in B:
e=x[0][:10]
u=G.setdefault(e,[0,1e18])
u[0]=max(u[0],x[1]);u[1]=min(u[1],x[2])
R[e]=R.get(e,False) or x[5]
K=list(G)
Y={K[i]:G[K[i-1]] for i in range(1,len(K))}
W=[q(x[0]) for x in B]
V=[0]*N
for i in range(1,N):
V[i]=V[i-1]+(W[i]<W[i-1] or B[i][4]!=B[i-1][4])
n=S=0;z=-1;i=0
while i<N-1:
t,h,l,x,k,_=B[i]
m=int(t[11:13])*60+int(t[14:16])
p=(W[i]-1)*1440+m
f=i==N-1 or V[i+1]!=V[i]
if t[:10] not in Y or R[t[:10]] or p>=8400 or p<1380 or f or(W[i]==6 and m+10>=1170)or t[:10]==z:i+=1;continue
u,v=Y[t[:10]][0],Y[t[:10]][1]
if u<=v or not(x-v)/(u-v)*100>c or int(t[11:13])>=12:i+=1;continue
z=t[:10];g=x*(1-a);s=x*(1+b);j=i+1;w=B[j][3]
while j<N:
if V[j]!=V[i]:j-=1;w=B[j][3];break
T=B[j]
if T[2]<=g and T[1]>=s:raise SystemExit(T[0])
if T[2]<=g:w=g;break
if T[1]>=s:w=s;break
w=T[3]
if j==N-1 or V[j+1]!=V[j] or(W[j]==6 and int(T[0][11:13])*60+int(T[0][14:16])+10>=1170)or j-i>=d:break
j+=1
print("%s;%.1f;%.1f;%.1f"%(t,x,w,x-w))
n+=1;S+=x-w;i=j
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 four strategies remain confidential.
Want to talk?
I present the work in detail to anyone who is interested.
Contact