
ä»®æ³é貚botã®ããã¯ãã¹ãã¯ãªãåãã€ãã®ã ââ 26çã䞊走ãããŠããŸã è ã¯ãªãããšåãããŸã§ã®å€±æãã°
ãã®èšäºã¯ç§èªèº«ã®èªå売買botã®å€±æèšé²ãšãPythonã«ããã·ãã¥ã¬ãŒã·ã§ã³ã§ãã çŽäžïŒã·ãã¥ã¬ãŒã·ã§ã³ïŒã®æçžŸã¯çŽ2é±éåãããªããè ããããšããå©çãåºããšãèšããŸãããæè³ã®å§èªãå©èšã§ã¯ãããŸããã
ã¯ããã«ïŒããã¯ãã¹ãã§ã¯åã£ãŠããã®ã«
ååã¯ç«¶éЬAIã®ãæåŸ å€è²·ããã®èœãšãç©ŽãæžããŸãããç§ã¯ä»¥åãJRA-VANã®ããŒã¿ã§ç«¶éЬAIãäœã£ãŠããã®ã§ãããããŸã¯ä»®æ³é貚ã®èªå売買botãèªåã§åãããŠããŸãã
ããã¯ãã¹ãã§ã¯è¯ãããã«èŠãããã§ãå®éã«åãããšãã»ãŒå šéšãè² ããããäœãããªãããã®2é±éã§èµ·ããããšããæ°åããšæ£çŽã«æžããŸãã
å ã«çµè«ã§ãã
ããã¯ãã¹ãã®ãåãã®å€ãã¯ãèšç®ãã¹ã§ã¯ãªããçãåæãããæ¥ããçŽå®ã«ãŒã«ãææ°æãçžå Žã®ææã詊ããæ°
26çã䞊走ãããçžå Žã®åããšéãå·®ãåŒããŠè©äŸ¡ããããã©ã®çã«ããŸã è ã¯ç¢ºèªã§ããªãã£ã
æ¬çªã®1çã¯13æ¥éã§è²·ãã0åãæ éã§ã¯ãªããäžãçžå Žã§æ¡ä»¶ãäžåºŠãæããªãã£ã
ç§ã®botã®æ§æ
ååŒæã¯bitbankãçŸç©ã®å建ãŠãã¢ã ããã¬ãã¬ããžãªã
売買ã«ãŒã«ã¯ãã¹ãŠã«ãŒã«ããŒã¹ïŒæ©æ¢°åŠç¿ã¯äœ¿ã£ãŠããªãïŒãPythonã§å®è£
26çãçŽäžïŒã·ãã¥ã¬ãŒã·ã§ã³ïŒã§äžŠèµ°ãããæ¬çªã§å®éã®ãéãåããã®ã¯ããã£ã³ããªã³ãã®1çã ããæ¬çªéå§ã¯2026幎10æ20æ¥
äº€ä»£ã®æ¡ä»¶ã¯ã14æ¥ä»¥äžã®èšé²ã30åŸåŸ©ä»¥äžãã§ããã売買2,000éããšæ¯ã¹ããéã§ã¯ãªã確çãïŒå€éæ€å®ã®è£æ£åŸïŒã0.95以äžããªã©ãæºãããŠãèªåã§ã¯æ¿ãããç§ã確èªããŠããæã§æ¿ãã
ã¡ãªã¿ã«ãå€åãäºæž¬ã«åŸé ããŒã¹ãã£ã³ã°ã詊ããŸãããAUCã¯0.62ã»ã©ã®åŒ±ãä¿¡å·ã¯åºãŸããããææ°æãè¶ ããå¹ ã¯ãããŸããã§ããããAIã§äºæž¬ããã°åãŠããã®æåã«ããã£ãšå°å³ãªèœãšã穎ããããããããŸãã
å1ïŒæå€ã¯ã倿®µã«è§Šãããã ãã§ã¯è²·ããªã
æåã«èŠã€ããåã¯ãçŽäžã®çŽå®ã«ãŒã«ã§ããã
æå€ã®è²·ãã眮ãããšããç§ã®çŽäžãã¬ãŒãã¯æåãèªåã®å€æ®µã«ååŒãå±ãããçŽå®ããšå€å®ããŠããŸããããšãããå®éã®ååŒæã§ã¯ãåã倿®µã«äžŠãã æ³šæã«ã¯é çªããããŸãã倿®µã«è§Šããã ãã§ã¯ãèªåã®çªãŸã§åã£ãŠããªãããšããããããŸãã
1åè¶³ã§ç¢ºããããšãããæå€è²·ãã®çŽå®ã®ãã¡ãè¿ãã«èªåã®å€æ®µãçªãæããååŒããã£ãã®ã¯çŽ56%ã ãã§ãããæ®ãã®çŽ44%ã¯ãè§Šããã ããã®ãæ¬åœã«è²·ãããæªããçŽå®ã§ãã
ããã§ãå ¬éååŒãèªåã®å€æ®µã1ç®çã以äžçªãæãããšãã ãçŽå®ããšå€å®ãå³ããããŸããã
ãã®å·®ãã©ããããå¹ãã®ããåæããŒã¿ã§ç¢ºãããã®ãå³1ã§ããäžãäžããäºåäºåã®ã©ã³ãã ãªå€åãïŒçžå Žã«åãããªãäžçïŒã§ãã3ç®çãäžã§è²·ãã3ç®çãäžã§å£²ããåãæŠç¥ããçŽå®ã«ãŒã«ã ãå€ããŠ1,000åŸåŸ©ãããŸããã

å³1ïŒåæããŒã¿ã«ããã·ãã¥ã¬ãŒã·ã§ã³ãå®åšã®çžå Žã§ã¯ãããŸãã
è§ŠãããçŽå®ïŒåç87.3%ã1åŸåŸ©å¹³å +1.23bpãçŽ¯èš +12.8%
çªãæãããçŽå®ïŒåç79.1%ã1åŸåŸ©å¹³å â3.82bpãçŽ¯èš â32.1%
åãã®ãªãçžå Žãªã®ã§ãæ¬åœã®æåŸ å€ã¯ã»ãŒãŒã以äžã®ã¯ãã§ããããã§ãçãçŽå®ã«ãŒã«ã ãšããæ»ã£ãæã ãè²·ãããããšã«ãªã£ãŠãã©ã¹ã«èŠããŸãã
éã«ãæ¬åœã«çŽå®ããæã¯ã倿®µãããã«äžãžæããŠããæã§ããè²·ã£ãçŽåŸã«ããäžæ®µäžããããããééžæãšåŒã³ãŸããå®éãç§ã®botã§ãå€å®ãå³ããããåŸãæå€ã§è²·ãã5ååŸã®å€åãããé »ç¹ã«åºãçŽãçã§çŽ2åæªãèŠããããã«ãªããŸããã
åçã80%ãè¶ ããŠããŠãè² ããããšããç¹ã«ã泚æããŠãã ããã
å2ïŒé·ãããã¯ãã¹ãã¯ãä»ã®çžå Žãèªããªã
ææã ãšæã£ãåã®ã²ãšã€ã¯ã2024幎1æããã®é·ãããã¯ãã¹ãã§ +188% ã§ããããšãããçŽè¿12ãæã ãåãåºããš +5.9%ããã®éã®æå€§äžèœã¯ 29% ã§ãã
å©çã®ã»ãšãã©ã¯éå»ã®äžãçžå Žã®äžææããæ¥ãŠããŠãä»ã®çžå Žã§åãããšãèµ·ããä¿èšŒã¯ãããŸãããæ©æ¢°åŠç¿ã§ãããã¬ãžãŒã ïŒçžå Žã®ç¶æ ïŒãå€ãããšãåŠç¿ããé¢ä¿ã厩ãããåé¡ãã®ãã®ã§ãã
æ¬çªã§åãããŠããçã¯ããBTCã4æéè¶³ã®é·æç§»åå¹³åããäžã«ããæã ãè²·ãããšããçžå Žãã£ã«ã¿ãŒä»ãã§ããéå§ãã13æ¥éããã®æ¡ä»¶ã¯äžåºŠãæãããè²·ãã¯0åã§ããã10æ29æ¥æç¹ã§ãéå§ä»¥éã®4æéè¶³58æ¬ã®ãã¡BTCãé·æå¹³åãäžåã£ãã®ã¯3æ¬ã ãã§ãã
åãæéããã®çã察象ã«ããéæãæã¡ã£ã±ãªãã«ããŠããã â8.18% ã§ãããåŸ ã£ãŠããããšã§äžããé¿ãã圢ã§ãããã ãããããäžãçžå Žã§äœãããªãã£ããã ãã§ãè ã®èšŒæã«ã¯ãªããŸããã
å3ïŒãã売買ããçã»ã©ãææ°æãšééžæã«é£ããã
bitbankã®çŸç©ææ°æã¯ãBTC/JPYãã¡ã€ã«ãŒ0.00%ã»ãã€ã«ãŒ0.10%ããã以å€ã®å建ãŠãã¢ã¯ã¡ã€ã«ãŒâ0.02%ã»ãã€ã«ãŒ0.12%ã§ãïŒ2026幎2æ2æ¥æç¹ã®å ¬åŒè¡šïŒãBTC以å€ã®ãã¢ãæè¡ã§åŸåŸ©ãããšãææ°æã ãã§0.24%ããããŸãã
衚1ã¯11æ2æ¥å€æç¹ã®æçžŸè¡šã®æç²ã§ãã

衚1ïŒA_v7ïŒæ¬çªïŒä»¥å€ã¯çŽäžã®æçžŸãçŽ13æ¥åã§ã幎çã«ã¯çŽããŸãã
1åè¶³ã®æ¥éš°è¿œããæãé »ç¹ã«åãã A_v1ã¯117åŸåŸ©ã§â33.57%
æå€ã§å¹³åååž°ãçã B_v1ã»B_v2ã¯çŽ1,000åŸåŸ©ãã€ã§â18.74%ã»â19.48%
æ¥éš°è¿œãã®äžèº«ãåãããšã1åŸåŸ©ã®å¹³åã¯ææ°æåã§ãâ0.15%ãææ°æèŸŒã¿ã§â0.39%ã§ãããè² ãã®çŽ4å²ã¯ææ°æã§ã¯ãªããããã¬ã€ã¯ããæã§è²·ããšæ»ããããããšèªäœã§ãã
å¹³åååž°ã®çã¯ãå°ããäœåºŠãåã¡ãããŸã«å€§ããè² ããã圢ã§ãB_v3ã¯ææªã®5%ã®åŸåŸ©ïŒ7åïŒã ãã§è² ãã®çŽ8å²ãå ããŠããŸãããåçãé«ãããšãšãè¯ãæŠç¥ã§ããããšã¯å¥ç©ã§ãã
å4ïŒ26æ¬äžŠã¹ãã°ãã©ããã¯è ãããããã«èŠãã
äžçªå±ãªãã®ã¯ããã ãšæã£ãŠããŸããçããããã䞊ã¹ããšãéã ãã§ã1æ¬ã¯è¯ãèŠããŸãã
ç§ã®æçžŸè¡šã¯ã2ã€ã®ç©å·®ãã§ãéããšãçžå Žããå·®ãåŒããŠããŸãã
çžå Žèª¿æŽåŸïŒæçžŸãããå¹³åããŠã³ã€ã³ãæã£ãŠããå²å à æã¡ã£ã±ãªãã®æçžŸããåŒã
ã©ã³ãã 売買ãšã®æ¯èŒïŒåãéæã»åãåŸåŸ©æ°ã»åãä¿ææéã»åãææ°æã§ãã¿ã€ãã³ã°ã ãã§ãããã«ãã2,000éããšæ¯ã¹ããããã«ãå šçã®ãã¡äžçªè¯ãã£ãã§ããããšæ¯ã¹ãŠè£æ£ãã
ããã§èŠããšã衚1ã®ãšãããè£æ£åŸã«0.95ãè¶ ããçã¯1æ¬ããããŸãããçŽäžã®äžäœã¯ã©ãããã»ãšãã©å£²è²·ããªãã£ãçãã§ããã
è£æ£ããªããšã©ããªããããbitbankã®å ¬éããŒãœã¯è¶³ïŒETH/JPYã»4æéè¶³ïŒã§è©ŠããŸãããã³ã€ã³æãã§å£²è²·ããã ãã®26æ¬ã2024幎1æã2025幎10æã«åœãŠã¯ããäžçªè¯ããã®ãéžã³ãŸãã

å³2ïŒbitbankå ¬éããŒãœã¯è¶³ã«ããã·ãã¥ã¬ãŒã·ã§ã³ãã©ã®çã«ãè ã¯ãããŸãã
äžçªã®çïŒ#16ïŒã¯83åŸåŸ©ã§ +101%ãåãæéã®ETHæã¡ã£ã±ãªãïŒ+85%ïŒããäžåã£ãŠããŸãããšããããã®åŸã®12ãæã§ã¯ â5%ã26æ¬äž7äœã§ããã

å³3ïŒè£æ£åãšè£æ£åŸã®ãéã§ã¯ãªã確çã
1æ¬ãã€ã§ããããšæ¯ã¹ããšã#16ã®éã§ã¯ãªã確ç㯠0.973ã26æ¬äž3æ¬ã0.95ãè¶ ããŸãããšãããã26æ¬ã®äžã®äžçªããšæ¯ã¹ãŠè£æ£ãããš 0.49ãã€ãŸãäºåäºåã§ãã
ç§ãç 究段éã§è©Šããèšå®ã¯ãçŽäžã®çãå«ããŠå°ãªããšã3,364éããããŸããè£æ£ãªãã®ã95%ãã¯ãããã ã詊ãã°ãããã§ãåºãŠããŸãã
å5ïŒãçžé¢ãé«ããã¯ãå åãã§ãããã§ã¯ãªã
ãBTCãäžãã£ãããETHãåŸãã远ããããã¯ãããšãã仮説ã詊ããŸããã
BTCãšETHã®åãè¶³ã®å€åãã®çžé¢ã¯0.83ã0.85ãšé«ãã®ã§ããã1ã12æéããããçžé¢ã¯0.04æªæºã§ã»ãŒãŒããäž¡è ã¯ãåæã«åããã®ã§ãã£ãŠããBTCãå ãã§ã¯ãããŸããã§ããã
æ®ã£ãŠããå°ããªäžãã¯ãæ¥éš°ã®åŸã«å°ãäžãããããå¢ããšãçžå Žå šäœã®äžãã§ãããæè¡ã®åŸåŸ©ã³ã¹ãïŒçŽ0.28%ïŒãšã»ãŒåã倧ããã§ãææ°æãæããšæ¶ããŸãã
çªå€ïŒããã¯ãã¹ãã«åºãŠããªãéçšã®å€±æ
çŽ1æéã®åæ¢ïŒæåã«åãããŠããããœã³ã³ãäžæåæ¢ãããã®éã¯å£²è²·ãã¿ã€ã ã¢ãŠãã®æèšãæ¢ãŸããŸãããéä¿¡1åããšã®äžéæéãšãåºãŸã£ããåèµ·åããèŠåŒµã圹ïŒwatchdogïŒãå ¥ãããã®åŸãèªå® ãµãŒããŒãžç§»ããŸãã
æå€§çŽ21åã®æ¥ç¶äžè¯ïŒèªå® ãµãŒããŒãé«è² è·ã®æã«åå解決ïŒDNSïŒã倱æããååŒæã«ã€ãªãããªãæéãåºãŸãããæã¡é«ããŒãã ã£ãã®ã§åœ±é¿ã¯ãããŸããã§ãã
鱿«ã®éæã®åºå ¥ãïŒå°ããéæã¯é±æ«ã«æ¿ã®éãïŒã¹ãã¬ããïŒãåºãããåºæºãå€ããŠèªåã§å¯Ÿè±¡ããå€ããŸããå¹³æ¥ã«æ»ããŸã
ã©ããããã¯ãã¹ãã«ã¯åºãŠããŸãããæã¡é«ãããæã«æ¢ãŸããšãååŒæã«çœ®ããæåãæ³šæã ããå®ãã«ãªããŸãã
ãã§ãã¯ãªã¹ãïŒèªåã®ããã¯ãã¹ããçãããã«
æå€ã®çŽå®ã¯ãçªãæããããã§å€å®ããŠããã
ææ°æã»ã¹ãã¬ããã»æ»ãããåŸåŸ©åæ°ãæããŠèŠç©ãã£ãã
æéå šäœã ãã§ãªããçŽè¿12ãæãäžãçžå Žã§ãæçžŸãèŠãã
æã¡ã£ã±ãªããšæ¯ã¹ãçžå Žã®åããå·®ãåŒããã
ã¿ã€ãã³ã°ã ãã§ãããã«ããå£²è²·ãšæ¯ã¹ãã
詊ããæ°ãæ°ããå€éæ€å®ã®è£æ£ãããã
åŠç¿ã«äœ¿ã£ãŠããªãæéïŒå°å°æéïŒã§ç¢ºãããã
ãçžé¢ããšãå è¡ããåºå¥ããã
botãæ¢ãŸã£ãæã«äœãå®ãã«ãªããæ±ºããŠããã
ãã¢ã®ã³ãŒã
å³1ãšåãèšç®ã§ãïŒåæããŒã¿ïŒã
# æå€ã®ãè§ŠãããçŽå®ããšã1ç®çãçªãæãããçŽå®ããæ¯ã¹ãïŒåæããŒã¿ïŒ
import numpy as np
rng = np.random.default_rng(1)
p = np.concatenate([[0], np.cumsum(rng.choice([-1, 1], size=3_000_000))]) # äžãäžãäºåäºå
TICK, MAKER, TAKER = 0.0002, -0.0002, 0.0012 # 1ç®çã=0.02%ãææ°æã¯bitbankçŸç©ã®ç
OFF, TP, WAIT, HOLD = 3, 3, 200, 400 # 3ç®çãäžã§è²·ãã3ç®çãäžã§å£²ã
def backtest(need): # need=0: è§ŠãããçŽå® / need=1: çªãæãããçŽå®
i, out = 0, []
while len(out) < 1000:
lim = p[i] - OFF
hit = np.nonzero(p[i+1:i+1+WAIT] <= lim - need)[0]
if not len(hit): i += WAIT; continue
j = i + 1 + hit[0]
up = np.nonzero(p[j+1:j+1+HOLD] >= lim + TP + need)[0]
if len(up): k = j + 1 + up[0]; r = TP * TICK - 2 * MAKER
else: k = j + HOLD; r = (p[k] - 1 - lim) * TICK - MAKER - TAKER
out.append(r); i = k
out = np.array(out)
print(f"need={need}: åç {(out>0).mean():.1%} å¹³å {out.mean()*1e4:+.2f}bp "
f"çŽ¯èš {np.prod(1+out)-1:+.1%}")
backtest(0); backtest(1)
å³2ã»å³3ãç°¡åã«ãããã®ã§ããä¹±æ°ã®äœ¿ãæ¹ãéããããæ°åã¯æ¬æãšå°ããããŸãïŒæå ã§ã¯äžçªã®çã+107.9%ãè£æ£å0.978ãè£æ£åŸ0.55ïŒã
# ã³ã€ã³æãã§å£²è²·ãã26æ¬ãããäžçªããéžã¶ãšãã©ããããè
ãããããã«èŠããã
import json, urllib.request, numpy as np
o = []
for y in (2024, 2025): # bitbankå
¬éAPIïŒETH/JPYã®4æéè¶³
d = json.load(urllib.request.urlopen(f"https://public.bitbank.cc/eth_jpy/candlestick/4hour/{y}"))
o += [(r[5], float(r[0])) for r in d["data"]["candlestick"][0]["ohlcv"]]
o = np.array([v for t, v in sorted(o) if t < 1761922800000]) # 2025-10-31ãŸã§
FEE = 0.0012
def trades(rng, n, hold): # éãªããªãããã«nåãholdæ¬ãã€æã€ïŒã¿ã€ãã³ã°ã¯ã§ãããïŒ
cuts = np.sort(rng.choice(len(o) - 1 - n * hold, n))
ent = cuts + np.arange(n) * hold + 1
return np.prod(o[ent + hold] / o[ent] * (1 - FEE) ** 2) - 1
rng = np.random.default_rng(0)
N, NB = 26, 2000
spec = [(int(rng.integers(40, 100)), int(rng.integers(3, 19))) for _ in range(N)] # åæ°, ä¿ææ¬æ°
real = np.array([trades(rng, n, h) for n, h in spec]) # 26æ¬ã®ãæçžŸã
base = np.array([[trades(rng, n, h) for _ in range(NB)] for n, h in spec]) # å2,000éãã®ã§ããã
p1 = (base < real[:, None]).mean(axis=1) # è£æ£åã®ãéã§ã¯ãªã確çã
rank = (base[:, :, None] > base[:, None, :]).mean(axis=1) # ã§ãããå士ã®é äœ
adj = (rank.max(axis=0)[None, :] < p1[:, None]).mean(axis=1) # 26æ¬ã®äžçªãšæ¯ã¹ãè£æ£åŸ
b = p1.argmax()
print(f"äžçªã®çïŒæçžŸ {real[b]:+.1%} è£æ£å {p1[b]:.3f} è£æ£åŸ {adj[b]:.2f} 0.95è¶
ã {int((p1>=0.95).sum())}æ¬")
ãŸãšã
2é±éåãããŠåãã£ãã®ã¯ãããŸã äœãåãããªãããšããããšã§ãããæ¬çªã®çã¯äžãçžå Žã§äžåºŠãè²·ãããçŽäžã®çã«ãè ã¯ç¢ºèªã§ããŠããŸããã
æ£çŽã«æžããšããã®botã¯ãŸã åããå§ããã°ããã§ããæ¬çªã¯çŽ2é±éãçŽäžã®çãåŸåŸ©æ°ãæ°åããæ°ååã®æ®µéã§ãçµ±èšçã«äœããèšãåãã«ã¯æ€èšŒæ°ããŸã£ããè¶³ããŸããããã®èšäºã®æ°åã¯ãä»ã®æç¹ã§ã¯ããèŠããŠããããšããéäžçµéãšããŠèªãã§ãã ããã
ãã ãäœãåãã€ãã®ãã¯èŠããŠããŸãããçŽå®ã®çããææ°æãçžå Žã®ææããããŠè©Šããæ°ã§ããäžãçžå ŽãçµéšãããŸã§ããã®ãŸãŸèšé²ãç¶ããŸãã
次åã¯ãçžå Žãã£ã«ã¿ãŒã®ãåŸ ã€ãå€æãæ¬åœã«å¹ããŠããã®ãããäžãçžå Žãæ¥ããæ€èšŒããäºå®ã§ãã
ãããããåãããªããã倱æãå«ããŠããŠããŠã貯ããŠãããŸããæ€èšŒæ°ãå¢ãããåãç©å·®ãã§çãåãããããŠããŸãèšäºã«ããŸããç¶ããæ°ã«ãªãæ¹ã¯ãã©ããŒããŠãããããšè¿œãããããããšæããŸãã
åè
bitbankãææ°æã https://bitbank.cc/guide/fee
bitbank Supportãã¡ã€ã«ãŒ/ãã€ã«ãŒãšã¯ïŒã https://support.bitbank.cc/hc/ja/articles/360004877453
bitbank å ¬éAPIïŒCandlestickïŒ https://github.com/bitbankinc/bitbank-api-docs/blob/master/public-api.md
Bailey & López de Prado (2014) "The Deflated Sharpe Ratio" Journal of Portfolio Management 40(5) https://doi.org/10.3905/jpm.2014.40.5.094
å 責äºé ïŒæ¬èšäºã¯ç§å人ã®èšé²ãšãåæããŒã¿ã»å ¬éããŒã¿ã«ããã·ãã¥ã¬ãŒã·ã§ã³ã§ããçŽäžã®æçžŸã¯çæéã®ãã®ã§ãéãšåºå¥ã§ããã幎çã®å©åãã瀺ããã®ã§ã¯ãããŸãããå°æ¥ã®å©çãä¿èšŒãããã®ã§ã¯ãªããæè³ã®å§èªãå©èšã§ããããŸãããæå·è³ç£ã¯äŸ¡æ Œå€åã倧ãããæå€±ãåºãå¯èœæ§ããããŸããååŒã¯ãèªèº«ã®å€æãšè²¬ä»»ã§è¡ã£ãŠãã ããã