Statistics
  • 현재 접속자 52 명
  • 오늘 방문자 1,440 명
  • 어제 방문자 3,822 명
  • 최대 방문자 11,031 명
  • 전체 방문자 1,117,693 명
  • 전체 회원수 76 명
  • 전체 게시물 2,693 개
  • 전체 댓글수 4 개
AI강의사이트

코인 AI 자동 매매(퀀트 트레이딩) 전략에는 여러 가지 접근 방식이 있습니다. 대표적인 전략으로는 다음과 같은 것들이 있습니다. 1. 퀀트 매매 전략 종류

작성자 정보

  • 작성자 bryanai
  • 작성일

컨텐츠 정보

  • 조회 546

본문

코인 AI 자동 매매(퀀트 트레이딩) 전략에는 여러 가지 접근 방식이 있습니다. 대표적인 전략으로는 다음과 같은 것들이 있습니다.

1. 퀀트 매매 전략 종류

  1. 모멘텀 전략 (Momentum Trading)

    • 최근 상승(하락)한 종목을 매수(매도)하는 전략.
    • 이동 평균선(MA), 상대강도지수(RSI), MACD 등을 활용.
  2. 역추세 전략 (Mean Reversion)

    • 가격이 평균으로 회귀한다는 가정하에 저가 매수, 고가 매도.
    • 볼린저 밴드, 이동평균 이격도 활용.
  3. 아비트라지 (Arbitrage)

    • 거래소 간 가격 차이를 이용한 차익거래.
  4. 마켓 메이킹 (Market Making)

    • 매수/매도 호가를 지속적으로 제출하여 스프레드 수익을 획득.
  5. AI 기반 강화학습 전략

    • 딥러닝, Q-Learning, PPO 등의 알고리즘을 사용하여 최적 매매 전략 학습.

샘플 코드: 이동 평균 크로스오버 전략 (EMA Crossover)

이 코드는 9일 이동평균선(EMA)과 21일 이동평균선(EMA)이 교차하는 지점을 활용하여 매수/매도 신호를 생성하는 간단한 백테스트 코드입니다.

import pandas as pd
import numpy as np
import ccxt  # 거래소 API 사용 (바이낸스 예제)
import matplotlib.pyplot as plt

# 바이낸스에서 비트코인 데이터 가져오기
exchange = ccxt.binance()
ohlcv = exchange.fetch_ohlcv('BTC/USDT', timeframe='1h', limit=500)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

# 이동 평균 계산
df['ema_9'] = df['close'].ewm(span=9, adjust=False).mean()
df['ema_21'] = df['close'].ewm(span=21, adjust=False).mean()

# 매수/매도 신호 생성
df['signal'] = 0
df.loc[df['ema_9'] > df['ema_21'], 'signal'] = 1  # 매수
df.loc[df['ema_9'] < df['ema_21'], 'signal'] = -1  # 매도

# 백테스트 수행
df['returns'] = df['close'].pct_change()
df['strategy_returns'] = df['returns'] * df['signal'].shift(1)

# 누적 수익률 계산
df['cumulative_returns'] = (1 + df['strategy_returns']).cumprod()

# 결과 시각화
plt.figure(figsize=(12,6))
plt.plot(df['timestamp'], df['cumulative_returns'], label='Strategy Returns', color='blue')
plt.plot(df['timestamp'], (1 + df['returns']).cumprod(), label='Market Returns', color='gray', linestyle='dashed')
plt.legend()
plt.title("EMA Crossover Strategy Backtest")
plt.xlabel("Date")
plt.ylabel("Cumulative Returns")
plt.show()

설명

  1. 데이터 로드: ccxt 라이브러리를 이용해 바이낸스에서 BTC/USDT 가격 데이터를 가져옴.
  2. 이동 평균선 계산: 9일, 21일 지수이동평균선(EMA)을 계산.
  3. 매매 신호 생성: ema_9ema_21을 상향 돌파하면 매수(+1), 하향 돌파하면 매도(-1).
  4. 백테스트: 수익률을 계산하고 전략이 시장보다 더 좋은 성과를 내는지 확인.
  5. 결과 시각화: 누적 수익률 그래프를 그려 전략 성과를 비교.

추가 가능 전략

  • RSI + MACD 필터 추가
  • 딥러닝을 이용한 예측 모델 (LSTM, XGBoost 등)
  • Grid Trading 자동화
  • AI 강화학습을 활용한 최적화된 매매 전략 (Deep Q-Learning, PPO)

위 코드는 가장 기초적인 퀀트 전략이며, 실제 자동매매를 하려면 API 키 인증, 리스크 관리, 주문 체결 등을 추가해야 합니다.

좀 더 복잡한 AI 기반 전략이 필요하면 강화학습 기반의 매매 알고리즘도 만들 수 있습니다. 필요하면 알려주세요! ????


자바스크립트 


// === Import Required Libraries ===

const ccxt = require("ccxt");

const { ChartJSNodeCanvas } = require("chartjs-node-canvas");


// === Binance API Data Fetch ===

(async () => {

    const exchange = new ccxt.binance();

    const ohlcv = await exchange.fetchOHLCV("BTC/USDT", "1h", undefined, 500);


    const data = ohlcv.map(([timestamp, open, high, low, close, volume]) => ({

        timestamp: new Date(timestamp),

        open,

        high,

        low,

        close,

        volume

    }));


    // === Calculate Exponential Moving Averages (EMA) ===

    function calculateEMA(prices, period) {

        const multiplier = 2 / (period + 1);

        let ema = [];

        let prevEMA = prices[0]; // Start with the first price

        ema.push(prevEMA);


        for (let i = 1; i < prices.length; i++) {

            const currentEMA = (prices[i] - prevEMA) * multiplier + prevEMA;

            ema.push(currentEMA);

            prevEMA = currentEMA;

        }


        return ema;

    }


    const closePrices = data.map(d => d.close);

    const ema9 = calculateEMA(closePrices, 9);

    const ema21 = calculateEMA(closePrices, 21);


    data.forEach((d, i) => {

        d.ema9 = ema9[i];

        d.ema21 = ema21[i];

        d.signal = 0;

        if (ema9[i] > ema21[i]) d.signal = 1; // Buy

        if (ema9[i] < ema21[i]) d.signal = -1; // Sell

    });


    // === Backtesting ===

    let cumulativeReturns = 1;

    let cumulativeMarketReturns = 1;

    const returns = [];

    const marketReturns = [];


    for (let i = 1; i < data.length; i++) {

        const dailyReturn = (data[i].close - data[i - 1].close) / data[i - 1].close;

        const strategyReturn = dailyReturn * (data[i - 1].signal || 0);


        cumulativeReturns *= 1 + strategyReturn;

        cumulativeMarketReturns *= 1 + dailyReturn;


        returns.push(cumulativeReturns);

        marketReturns.push(cumulativeMarketReturns);

    }


    // === Visualization ===

    const chartJSNodeCanvas = new ChartJSNodeCanvas({ width: 1200, height: 600 });


    const config = {

        type: "line",

        data: {

            labels: data.map(d => d.timestamp.toISOString().slice(0, 10)),

            datasets: [

                {

                    label: "Strategy Returns",

                    data: returns,

                    borderColor: "blue",

                    fill: false

                },

                {

                    label: "Market Returns",

                    data: marketReturns,

                    borderColor: "gray",

                    borderDash: [5, 5],

                    fill: false

                }

            ]

        },

        options: {

            plugins: {

                title: {

                    display: true,

                    text: "EMA Crossover Strategy Backtest"

                }

            },

            scales: {

                x: {

                    type: "time",

                    title: {

                        display: true,

                        text: "Date"

                    }

                },

                y: {

                    title: {

                        display: true,

                        text: "Cumulative Returns"

                    }

                }

            }

        }

    };


    const imageBuffer = await chartJSNodeCanvas.renderToBuffer(config);

    require("fs").writeFileSync("backtest.png", imageBuffer);

    console.log("✅ Backtest chart saved as backtest.png");

})();


관련자료

댓글 0
등록된 댓글이 없습니다.
Notice
Member Rank