TQQQ · 비트코인 · 자동매매 봇 · 나눠 담기 · 실측 재현 페이지
TQQQ 200일선 봇에 다 넣기 무서울 때, 남겨 둔 돈을 현금에 둘지, 비트코인 봇에 넣을지 돌려 봤습니다. 업비트 비트코인 원화 가격과 TQQQ × 원달러 환율 · 2018년 4월 15일 ~ 2026년 10월 23일 · 1,000만원 · 사고팔 때마다 편도 0.1%. 바이낸스(달러) 가격으로도 같이 돌렸습니다.
| 항목 | 값 |
|---|---|
| TQQQ 봇 | QQQ(나스닥100) 종가가 200일 단순 평균보다 위면 다음 날 TQQQ 보유, 아래면 팔고 현금 |
| 비트코인 봇 | 비트코인 종가가 100일 단순 평균보다 위면 다음 날 보유, 아래면 팔고 현금 |
| 나누기 | TQQQ 봇 1/3 · 비트코인 봇 1/3 · 현금 1/3 |
| 맞추기 | 3개월마다(1·4·7·10월 첫날) 세 곳을 다시 1/3씩으로 — 불어난 곳의 돈을 덜어 줄어든 곳으로 |
| 체결 | 그날 종가로 판정, 다음 날 종가 수익부터 반영(종가 체결 가정) · 편도 수수료 0.1% |
| 그 밖 | 현물 매수만 · 레버리지 추가·공매도 없음 · 쉬는 돈은 현금(이자 0) |
| 계좌 | 2026-10-23 | 가장 깊은 하락 |
|---|---|---|
| A TQQQ 봇 100% | 1억 3,058만원 | -55.7% |
| B TQQQ 봇 1/2 + 현금 1/2 | 5,131만원 | -32.5% |
| C TQQQ 봇·비트코인 봇·현금 1/3씩 | 1억 5,970만원 | -31.8% |
| (대조) 비트코인 봇 1/2 + 현금 1/2 | 1억 246만원 | -28.2% |
| (대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/4 | 1억 7,465만원 | -35.1% |
| (대조) C 를 맞추지 않으면 | 1억 8,608만원 | -44.7% |
| (대조) C · 비트코인 50일 평균 | 1억 8,919만원 | -34.3% |
| (대조) C · 비트코인 200일 평균 | 1억 2,065만원 | -27.4% |
TQQQ 봇에 다 넣은 계좌보다도 셋으로 나눈 계좌가 더 남았습니다. 비트코인 봇 1/2 + 현금 1/2 계좌는 하락 폭이 조금 얕았고, 남은 돈은 셋으로 나눈 계좌가 더 많았습니다(시작한 달을 바꿔 67/67). 3개월마다 맞추지 않으면 돈은 더 남았지만 한때 절반 가까이 깎였습니다 — 맞추기는 하락 폭을 묶는 장치입니다.
| 계좌 | 2026-10-23 | 가장 깊은 하락 |
|---|---|---|
| A TQQQ 봇 100% | 1억 1,113만원 | -56.6% |
| B TQQQ 봇 1/2 + 현금 1/2 | 4,695만원 | -31.7% |
| C TQQQ 봇·비트코인 봇·현금 1/3씩 | 1억 1,913만원 | -28.5% |
| (대조) 비트코인 봇 1/2 + 현금 1/2 | 7,177만원 | -22.6% |
| (대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/4 | 1억 3,431만원 | -34.8% |
| (대조) C 를 맞추지 않으면 | 1억 1,294만원 | -37.8% |
| (대조) C · 비트코인 50일 평균 | 1억 2,774만원 | -36.8% |
| (대조) C · 비트코인 200일 평균 | 9,436만원 | -30.0% |
바이낸스 금액은 달러 가격의 배수를 1,000만원에 곱한 값입니다(환율 변화 미반영).
2021-03-31 계좌 4,576만원 중 비트코인 봇 2,390만원 (52.2%) 2021-04-01 맞춘 뒤 비트코인 봇 1,551만원 · 덜어 낸 돈 864만원 2021-06-30 C 계좌 4,902만원 · 맞추지 않은 계좌 4,681만원 2021-04-01 ~ 06-30 고점 대비 가장 깊은 하락: C 계좌 -14.7% · 맞추지 않은 계좌 -20.9%
3월 말 비트코인이 크게 올라 계좌의 절반 넘게가 비트코인 봇에 있었습니다. 4월 첫날 1/3로 되돌리며 덜어 낸 돈은 TQQQ 봇과 현금으로 갔고, 5월 비트코인 급락에서 비트코인 봇은 5월 12일 종가가 100일 평균 밑으로 내려가 그 종가에 팔고 나왔습니다. 6월 말 계좌는 맞추지 않은 계좌보다 더 남아 있었습니다.
| 계좌(업비트판) | 2026-10-23 | 가장 깊은 하락 |
|---|---|---|
| B TQQQ 봇 1/2 + 현금 1/2 이자·송금 | 5,786만원 | -32.4% |
| C TQQQ 봇·비트코인 봇·현금 1/3씩 이자·송금 | 1억 7,160만원 | -30.4% |
쉬는 돈(현금 몫과 봇이 팔고 쉬는 동안)에 연 2.5% 이자를 주고, 3개월마다 맞출 때 주식 계좌와 코인 계좌 사이를 건너가는 돈에 2%를 더 물렸습니다. 이자를 빼면 현금이 많은 쪽이 손해를 보고, 송금 비용을 빼면 셋으로 나눈 쪽이 덕을 봅니다 — 둘 다 넣어도 순서는 같습니다.
| 계좌(업비트판) | 세후 | 가장 깊은 하락 |
|---|---|---|
| A TQQQ 봇 100% 세후 | 1억 416만원 | -57.2% |
| B TQQQ 봇 1/2 + 현금 1/2 세후 | 4,617만원 | -32.5% |
| C TQQQ 봇·비트코인 봇·현금 1/3씩 세후 | 1억 5,060만원 | -33.2% |
TQQQ 실현 차익(신호로 팔 때 · 맞추기로 덜어 낼 때, 평균 단가)에 해외주식 양도세 22%(연 250만원 공제)를 이듬해 4월 첫날 계좌에서 뺐습니다. 코인은 현행 비과세로 계산했습니다(2027년 과세 예정). 개인별 세금 상황은 다릅니다.
돌리는 법: zip 을 풀고 python run_tqqqbtc.py
■ 업비트판 · 2018-04-15 ~ 2026-10-23 · 3개월마다 맞춤 · 편도 0.1% A TQQQ 봇 100% 1,000만원 → 1억 3,058만원 (가장 깊은 하락 -55.7%) B TQQQ 봇 1/2 + 현금 1/2 1,000만원 → 5,131만원 (가장 깊은 하락 -32.5%) C TQQQ 봇·비트코인 봇·현금 1/3씩 1,000만원 → 1억 5,970만원 (가장 깊은 하락 -31.8%) (대조) 비트코인 봇 1/2 + 현금 1/2 1,000만원 → 1억 246만원 (가장 깊은 하락 -28.2%) (대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/4 1,000만원 → 1억 7,465만원 (가장 깊은 하락 -35.1%) (대조) C 를 맞추지 않으면 1,000만원 → 1억 8,608만원 (가장 깊은 하락 -44.7%) (대조) C · 비트코인 50일 평균 1,000만원 → 1억 8,919만원 (가장 깊은 하락 -34.3%) (대조) C · 비트코인 200일 평균 1,000만원 → 1억 2,065만원 (가장 깊은 하락 -27.4%) ■ 바이낸스판 · 2018-04-15 ~ 2026-10-23 · 3개월마다 맞춤 · 편도 0.1% A TQQQ 봇 100% 1,000만원 → 1억 1,113만원 (가장 깊은 하락 -56.6%) B TQQQ 봇 1/2 + 현금 1/2 1,000만원 → 4,695만원 (가장 깊은 하락 -31.7%) C TQQQ 봇·비트코인 봇·현금 1/3씩 1,000만원 → 1억 1,913만원 (가장 깊은 하락 -28.5%) (대조) 비트코인 봇 1/2 + 현금 1/2 1,000만원 → 7,177만원 (가장 깊은 하락 -22.6%) (대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/4 1,000만원 → 1억 3,431만원 (가장 깊은 하락 -34.8%) (대조) C 를 맞추지 않으면 1,000만원 → 1억 1,294만원 (가장 깊은 하락 -37.8%) (대조) C · 비트코인 50일 평균 1,000만원 → 1억 2,774만원 (가장 깊은 하락 -36.8%) (대조) C · 비트코인 200일 평균 1,000만원 → 9,436만원 (가장 깊은 하락 -30.0%) ■ 업비트판 · 시작한 달을 2018-04 ~ 2023-10 로 바꿔 끝(2026-10-23)까지 C 가 B 보다 더 남은 시작 달: 67/67 C 가 비트코인 봇 1/2 + 현금 1/2 보다 더 남은 시작 달: 67/67 ■ 업비트판 · 3개월마다 맞추기 한 번 (C 계좌) 2021-03-31 계좌 4,576만원 중 비트코인 봇 2,390만원 (52.2%) 2021-04-01 맞춘 뒤 비트코인 봇 1,551만원 · 덜어 낸 돈 864만원 2021-06-30 C 계좌 4,902만원 · 맞추지 않은 계좌 4,681만원 2021-04-01 ~ 06-30 고점 대비 가장 깊은 하락: C 계좌 -14.7% · 맞추지 않은 계좌 -20.9% ■ 업비트판 · 현금 이자 연 2.5% + 주식↔코인 건너가는 돈에 2% 더 B TQQQ 봇 1/2 + 현금 1/2 이자·송금 1,000만원 → 5,786만원 (가장 깊은 하락 -32.4%) C TQQQ 봇·비트코인 봇·현금 1/3씩 이자·송금 1,000만원 → 1억 7,160만원 (가장 깊은 하락 -30.4%) ■ 업비트판 · 세금(TQQQ 해외주식 양도세 22% · 연 250만원 공제 · 코인 비과세) A TQQQ 봇 100% 세후 1,000만원 → 1억 416만원 (가장 깊은 하락 -57.2%) B TQQQ 봇 1/2 + 현금 1/2 세후 1,000만원 → 4,617만원 (가장 깊은 하락 -32.5%) C TQQQ 봇·비트코인 봇·현금 1/3씩 세후 1,000만원 → 1억 5,060만원 (가장 깊은 하락 -33.2%) 끝.
# -*- coding: utf-8 -*-
"""TQQQ 봇 + 비트코인 봇 — 남는 돈을 현금에 둘까, 비트코인 봇에 넣을까 (알고랩 재현 코드)
표준 라이브러리만 쓴다. zip 을 풀고: python run_tqqqbtc.py
규칙
TQQQ 봇 : QQQ(나스닥100) 종가 > 200일 단순 평균이면 다음 날 TQQQ 보유, 아니면 현금
비트코인 봇 : 비트코인 종가 > 100일 단순 평균이면 다음 날 보유, 아니면 현금
체결 : 그날 종가로 판정 → 다음 날 종가 수익부터 반영(종가 체결 가정) · 편도 0.1%
나누기 : 계좌 셋 — A TQQQ 봇 100% · B TQQQ 봇 1/2 + 현금 1/2 · C TQQQ 봇 1/3 + 비트코인 봇 1/3 + 현금 1/3
맞추기 : 분기 첫날(1·4·7·10월 1일) 정해 둔 비율로 되돌림 · 옮기는 금액에 편도 0.1%
현금 이자 0 · 세금은 마지막 절에서 따로
업비트판 = 업비트 KRW-BTC + TQQQ × 원달러 환율(원화)
바이낸스판 = 바이낸스 BTCUSDT + TQQQ(달러) — 금액은 달러 배수를 1,000만원에 곱한 값
기간 2018-04-15 ~ 2026-10-23 (data/ 에 얼려 둔 종가)
"""
import csv
import datetime as dt
import os
HERE = os.path.dirname(os.path.abspath(__file__))
START, END = dt.date(2018, 4, 15), dt.date(2026, 10, 23)
COST = 0.001
P0 = 10_000_000
def load(name):
out = {}
with open(os.path.join(HERE, "data", name), encoding="utf-8") as f:
for r in csv.DictReader(f):
out[dt.date.fromisoformat(r["date"][:10])] = float(r["close"])
return dict(sorted(out.items()))
def days(a, b):
d = a
while d <= b:
yield d
d += dt.timedelta(days=1)
def bot_returns(price, n, signal_px=None):
"""price: {날짜: 종가}(거래일만). signal_px 가 있으면 그 종가로 신호를 판정(TQQQ 봇은 QQQ).
돌려주는 값: {거래일: 그날 수익(보유분) − 전환 비용}, {거래일: 그날 보유 여부}"""
sp = signal_px or price
sd = list(sp)
sig, win, s = {}, [], 0.0
for d in sd:
win.append(sp[d]); s += sp[d]
if len(win) > n:
s -= win.pop(0)
sig[d] = 1.0 if len(win) == n and sp[d] > s / n else 0.0
pos, prev = {}, None
for d in sd: # 다음 날 보유 = 어제 신호
pos[d] = sig[prev] if prev is not None else float("nan")
prev = d
ret, last_px, last_pos = {}, None, None
for d in price:
p = pos.get(d, float("nan"))
if last_px is not None and p == p:
r = p * (price[d] / last_px - 1)
if last_pos is not None and last_pos == last_pos:
r -= abs(p - last_pos) * COST
ret[d] = r
last_px, last_pos = price[d], p
return ret, pos
def legs(market, n=100, with_b=False):
qqq, tqqq, fx = load("QQQ_1d.csv"), load("TQQQ_1d.csv"), load("USDKRW_X_1d.csv")
if market == "업비트":
px, f_last = {}, None
for d in tqqq:
f_last = fx.get(d, f_last)
px[d] = tqqq[d] * f_last
btc = load("KRW-BTC_1d.csv")
else:
px, btc = tqqq, load("BTCUSDT_1d.csv")
rt, pt = bot_returns(px, 200, signal_px=qqq)
rb, pb = bot_returns(btc, n)
cal = list(days(START, END))
def ffill(pos): # 보유 여부 — 주말·휴장일은 직전 값
out, h = [], 0.0
for d in cal:
v = pos.get(d, h)
h = v if v == v else h
out.append(h)
return out
hold_t = ffill(pt)
out = (cal, [rt.get(d, 0.0) for d in cal], [rb.get(d, 0.0) for d in cal], hold_t)
return out + (ffill(pb),) if with_b else out
def qkey(d):
return d.year * 4 + (d.month - 1) // 3
def mix(cal, tr, br, wt, wb, rebal=True, i0=0):
wc = 1 - wt - wb
vt, vb, vc = P0 * wt, P0 * wb, P0 * wc
eq, lv = [], []
for i in range(i0, len(cal)):
if rebal and i > i0 and qkey(cal[i]) != qkey(cal[i - 1]):
tot = vt + vb + vc
tot -= (abs(vt - tot * wt) + abs(vb - tot * wb)) * COST
vt, vb, vc = tot * wt, tot * wb, tot * wc
vt *= 1 + tr[i]
vb *= 1 + br[i]
eq.append(vt + vb + vc)
lv.append((vt, vb, vc))
return eq, lv
def mdd(eq):
pk, m = eq[0], 0.0
for v in eq:
pk = max(pk, v)
m = min(m, v / pk - 1)
return m * 100
def won(v):
m = round(v / 10_000)
eok, man = divmod(m, 10_000)
if eok and man:
return f"{eok}억 {man:,}만원"
if eok:
return f"{eok}억원"
return f"{man:,}만원"
def line(name, eq):
return f" {name:<34} 1,000만원 → {won(eq[-1])} (가장 깊은 하락 {mdd(eq):.1f}%)"
T = 1 / 3
ACC = (("A TQQQ 봇 100%", 1.0, 0.0), ("B TQQQ 봇 1/2 + 현금 1/2", 0.5, 0.0),
("C TQQQ 봇·비트코인 봇·현금 1/3씩", T, T), ("(대조) 비트코인 봇 1/2 + 현금 1/2", 0.0, 0.5))
for m in ("업비트", "바이낸스"):
cal, tr, br, _ = legs(m)
print(f"■ {m}판 · {START} ~ {END} · 3개월마다 맞춤 · 편도 0.1%")
for name, wt, wb in ACC:
print(line(name, mix(cal, tr, br, wt, wb)[0]))
print(line("(대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/4", mix(cal, tr, br, 0.5, 0.25)[0]))
print(line("(대조) C 를 맞추지 않으면", mix(cal, tr, br, T, T, rebal=False)[0]))
for n in (50, 200):
c2, t2, b2, _ = legs(m, n)
print(line(f"(대조) C · 비트코인 {n}일 평균", mix(c2, t2, b2, T, T)[0]))
print()
cal, tr, br, hold_t = legs("업비트")
print("■ 업비트판 · 시작한 달을 2018-04 ~ 2023-10 로 바꿔 끝(2026-10-23)까지")
win_b = win_d = tot = 0
y, mo = 2018, 4
while (y, mo) <= (2023, 10):
s = dt.date(y, mo, 1) if (y, mo) != (2018, 4) else START
i0 = next(i for i, d in enumerate(cal) if d >= s)
c = mix(cal, tr, br, T, T, i0=i0)[0][-1]
win_b += c > mix(cal, tr, br, 0.5, 0.0, i0=i0)[0][-1]
win_d += c > mix(cal, tr, br, 0.0, 0.5, i0=i0)[0][-1]
tot += 1
y, mo = (y + 1, 1) if mo == 12 else (y, mo + 1)
print(f" C 가 B 보다 더 남은 시작 달: {win_b}/{tot}")
print(f" C 가 비트코인 봇 1/2 + 현금 1/2 보다 더 남은 시작 달: {win_d}/{tot}")
print()
print("■ 업비트판 · 3개월마다 맞추기 한 번 (C 계좌)")
eq, lv = mix(cal, tr, br, T, T)
eq0, lv0 = mix(cal, tr, br, T, T, rebal=False)
ix = {d: i for i, d in enumerate(cal)}
a = lv[ix[dt.date(2021, 3, 31)]]
b = lv[ix[dt.date(2021, 4, 1)]]
print(f" 2021-03-31 계좌 {won(sum(a))} 중 비트코인 봇 {won(a[1])} ({a[1] / sum(a) * 100:.1f}%)")
print(f" 2021-04-01 맞춘 뒤 비트코인 봇 {won(b[1])} · 덜어 낸 돈 {won(a[1] - sum(a) * T)}")
print(f" 2021-06-30 C 계좌 {won(eq[ix[dt.date(2021, 6, 30)]])} · 맞추지 않은 계좌 {won(eq0[ix[dt.date(2021, 6, 30)]])}")
q0, q1 = ix[dt.date(2021, 4, 1)], ix[dt.date(2021, 6, 30)]
print(f" 2021-04-01 ~ 06-30 고점 대비 가장 깊은 하락: C 계좌 {mdd(eq[q0:q1 + 1]):.1f}% · 맞추지 않은 계좌 {mdd(eq0[q0:q1 + 1]):.1f}%")
print()
def mix_tax(wt, wb):
"""TQQQ 실현 차익에 해외주식 양도세(22% · 연 250만원 공제). 코인은 현행 비과세로 계산.
실현: TQQQ 봇이 신호로 다 팔 때 · 분기 맞추기에서 들고 있던 TQQQ 를 덜어 낼 때(평균 단가).
세금은 이듬해 4월 첫날 계좌에서 뺀다(5월 납부를 조금 앞당김 — 보수적)."""
wc = 1 - wt - wb
vt, vb, vc = P0 * wt, P0 * wb, P0 * wc
basis, real, owe, eq = vt, {}, 0.0, []
for i, d in enumerate(cal):
p, q = hold_t[i], hold_t[i - 1] if i else hold_t[0]
if i and p == 0 and q == 1:
real[d.year] = real.get(d.year, 0) + (vt - basis); basis = vt
if i and p == 1 and q == 0:
basis = vt
if i and qkey(d) != qkey(cal[i - 1]):
tot = vt + vb + vc
if d.month == 4 and owe > 0:
tot -= owe; owe = 0.0
tot -= (abs(vt - tot * wt) + abs(vb - tot * wb)) * COST
new_t = tot * wt
if new_t < vt and q == 1:
frac = (vt - new_t) / vt
real[d.year] = real.get(d.year, 0) + (vt - basis) * frac
basis *= 1 - frac
elif new_t > vt:
basis += new_t - vt
elif q == 0:
basis = new_t
vt, vb, vc = new_t, tot * wb, tot * wc
if d.month == 1 and (d.year - 1) in real:
owe += max(0.0, real[d.year - 1] - 2_500_000) * 0.22
vt *= 1 + tr[i]
vb *= 1 + br[i]
eq.append(vt + vb + vc - owe)
return eq
def mix_cost(wt, wb, r, x):
"""현금 이자 연 r(쉬는 봇 몫·현금 몫) · 맞추는 날 주식↔코인을 건너가는 돈에 편도 x 를 더 물린다."""
dr = (1 + r) ** (1 / 365) - 1
wc = 1 - wt - wb
vt, vb, vc = P0 * wt, P0 * wb, P0 * wc
eq = []
for i, d in enumerate(cal):
if i and qkey(d) != qkey(cal[i - 1]):
tot = vt + vb + vc
mv = abs(vb - tot * wb)
tot -= (abs(vt - tot * wt) + abs(vb - tot * wb)) * COST + mv * x
vt, vb, vc = tot * wt, tot * wb, tot * wc
vt *= 1 + tr[i] + (1 - hold_t[i]) * dr
vb *= 1 + br[i] + (1 - hold_b[i]) * dr
vc *= 1 + dr
eq.append(vt + vb + vc)
return eq
_, _, _, _, hold_b = legs("업비트", with_b=True)
print("■ 업비트판 · 현금 이자 연 2.5% + 주식↔코인 건너가는 돈에 2% 더")
for name, wt, wb in ACC[1:3]:
print(line(name + " 이자·송금", mix_cost(wt, wb, 0.025, 0.02)))
print()
print("■ 업비트판 · 세금(TQQQ 해외주식 양도세 22% · 연 250만원 공제 · 코인 비과세)")
for name, wt, wb in ACC[:3]:
print(line(name + " 세후", mix_tax(wt, wb)))
print()
print("끝.")
알고랩 Strategy Lab — 전략을 검증하고, 검증한 것만 자동매매로 옮깁니다. 두 봇을 켜 두고 3개월마다 맞추는 일은 사람보다 봇이 잘 지킵니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기
과거 데이터를 돌려 본 결과이며 미래 수익을 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.