TQQQ · 비트코인 · 자동매매 봇 · 나눠 담기 · 실측 재현 페이지

TQQQ 봇 옆엔
비트코인 봇을 두세요

TQQQ 200일선 봇에 다 넣기 무서울 때, 남겨 둔 돈을 현금에 둘지, 비트코인 봇에 넣을지 돌려 봤습니다. 업비트 비트코인 원화 가격과 TQQQ × 원달러 환율 · 2018년 4월 15일 ~ 2026년 10월 23일 · 1,000만원 · 사고팔 때마다 편도 0.1%. 바이낸스(달러) 가격으로도 같이 돌렸습니다.

1억 5,970만원TQQQ 봇·비트코인 봇·현금에 1/3씩, 3개월마다 맞춤 (가장 깊은 하락 -31.8%)
5,131만원TQQQ 봇 1/2 + 현금 1/2 (-32.5%)
67/67시작한 달을 바꿔도 셋으로 나눈 계좌가 더 남은 달

설정 그대로

항목값
TQQQ 봇QQQ(나스닥100) 종가가 200일 단순 평균보다 위면 다음 날 TQQQ 보유, 아래면 팔고 현금
비트코인 봇비트코인 종가가 100일 단순 평균보다 위면 다음 날 보유, 아래면 팔고 현금
나누기TQQQ 봇 1/3 · 비트코인 봇 1/3 · 현금 1/3
맞추기3개월마다(1·4·7·10월 첫날) 세 곳을 다시 1/3씩으로 — 불어난 곳의 돈을 덜어 줄어든 곳으로
체결그날 종가로 판정, 다음 날 종가 수익부터 반영(종가 체결 가정) · 편도 수수료 0.1%
그 밖현물 매수만 · 레버리지 추가·공매도 없음 · 쉬는 돈은 현금(이자 0)

업비트판(원화) — 1,000만원이 어떻게 됐나

계좌2026-10-23가장 깊은 하락
A TQQQ 봇 100%1억 3,058만원-55.7%
B TQQQ 봇 1/2 + 현금 1/25,131만원-32.5%
C TQQQ 봇·비트코인 봇·현금 1/3씩1억 5,970만원-31.8%
(대조) 비트코인 봇 1/2 + 현금 1/21억 246만원-28.2%
(대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/41억 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/24,695만원-31.7%
C TQQQ 봇·비트코인 봇·현금 1/3씩1억 1,913만원-28.5%
(대조) 비트코인 봇 1/2 + 현금 1/27,177만원-22.6%
(대조) TQQQ 봇 1/2 + 비트코인 봇 1/4 + 현금 1/41억 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만원에 곱한 값입니다(환율 변화 미반영).

3개월마다 맞추기 한 번 — 2021년 봄

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개월마다 맞추는 일은 사람보다 봇이 잘 지킵니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기

과거 데이터를 돌려 본 결과이며 미래 수익을 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.