도움말
인텔리퀀트의 사용방법과 메뉴얼입니다.

8. 기술적 분석 (Technical Analysis)

현재 인텔리퀀트 스튜디오에서 제공하는 기술적 분석 지표 함수는 아래와 같이 추세 지표, 모멘텀 지표, 변동성 지표, 시장강도 지표로 나누며, 자세한 사항은 도움말 API 레퍼런스의 Stock 객체(https://intelliquant.co.kr/help/ref/1) 부분을 참고해주세요.


1) 추세 지표

  • MA (Moving Average, 이동평균) - getMA(period)
  • EMA (Exponential Moving Average, 지수이동평균) - getEMA(period)
  • WMA (Weighted Moving Average, 가중이동평균) - getWMA(period)
  • MACD (Moving Average Convergence & Divergence, 이동평균수렴확산) - getMACD(fast, slow, signal)
  • ADX (Average Directional Movement Index, 평균방향운동지수) - getADX(period)

2) 모멘텀 지표

  • Stochastics (스토캐스틱) - getStochastic(fastK, slowK, slowD)
  • Williams%R (윌리엄스%R) - getWilliamsR(period)
  • CCI (Commodity Channel Index, 상품채널지수) - getCCI(period)

3) 변동성 지표

  • Bolinger Band (볼린저밴드) - getBolingerBand(period, devUp, devDown)
  • True Range (트루레인지) - getTrueRange()
  • ATR (Average True Range, 애버리지 투루레인지) - getATR(period)
  • Parabolic (파라볼릭) - getParabolic(acc, max)

4) 시장강도 지표

  • OBV (On Balance Volume, 누적균형거래량) - getOBV()
  • RSI (Relative Strength Index, 상대강도지수) - getRSI(period)

아래 예제는 추세 지표들 중에 하나인 이동평균 수렴확산(MACD) 지표를 이용하여 해당 종목을 매수/매도하는 방법입니다.
전체적인 내용은 한 종목의 MACD 값과 Signal 값을 비교하여 MACD가 Signal을 하향 돌파(데드크로스)하면 매도, Signal을 상향 돌파(골든크로스)하면 매수하게 됩니다.


var code = "A066570", name = "LG전자";    // 종목코드
var stock, stock_basket, graph;
var stock_weight = 0.9;                 // 주식비중
var target_num = 1;                     // 투자 종목 수
var initClose = 0;                      // 초기 종가
var intQty = 0;

function initialize() {
    IQAccount.getDefaultAccount().accountName = name + " MACD 반영 수익률";
    stock_basket = new Basket(IQAccount.getDefaultAccount(), target_num, IQEnvironment.aum * stock_weight);
    stock = IQStock.getStock(code);

    graph = IQGraph.createGraph(name + " 수익률");
    initClose = stock.getAdjClose();    // 누적 수익률 계산을 위해 초기 종가 저장
}

function _buildPortfolio(macd, signal, histogram) {
    var totalEquity = IQAccount.getDefaultAccount().getTotalEquity();   // 계좌 총 평가액
    var error = -99999999;  // 에러코드

    if (macd !== error) {
        // MACD 값이 Signal을 하향돌파(데드크로스)할 때 매도
        if (prevMacd > prevSignal && macd < signal) {
            stock_basket.leave(IQStock.getStock(code), intQty);  // 종목 매도
            logger.debug("[Sell] (signal -> macd) " + 'macd: ' + macd + ", signal: " + signal + ", histogram: " + histogram);

        // MACD 값이 Signal을 상향돌파(골든크로스)할 때 매수
        } else if (prevMacd < prevSignal && macd > signal) {
            logger.debug("[Buy] (macd -> signal) " + 'macd: ' + macd + ", signal: " + signal + ", histogram: " + histogram);
            if (stock_basket.getCurrentEggs().length === 0) {
                stock_basket.reset();
                intQty = parseInt((totalEquity / stock.getAdjClose()) * stock_weight);
                stock_basket.enter(IQStock.getStock(code), intQty);   // 종목 매수
            }
        }
    }
}

var enterForInit = false;               // 초기 실행 플래그
var fast = 12, slow = 26, signal = 9;   // 12일 단기 이동평균, 26일 장기 이동평균, 9일 시그널 이동평균
var prevMacd = 0, prevSignal = 0;       // 이전 MACD, Signal 저장

function onDayClose(now) {
    logger.debug(stock_basket.getCurrentEggs());
    graph.plot(((stock.getAdjClose() / initClose) - 1) * 100);	// 기본 수익률 그래프

    // MACD 값을 가져오는 함수입니다. 결과 값은 당일 MACD 값의 JSON 형태
    // {"macd":117.3,"signal":128.1,"hist":-10.8}, 문제가 있을 경우 -99999999
    var macdJson = stock.getMACD(fast, slow, signal);

    // MACD 및 Signal 값에 따라 매수/매도 수행
    _buildPortfolio(macdJson.macd, macdJson.signal, macdJson.hist);

    prevMacd = macdJson.macd;       // 현재 MACD 값 저장
    prevSignal = macdJson.signal;   // 현재 Signal 값 저장

    if (enterForInit == false) {    // 최초 진입일 경우 종목 매수
        stock_basket.reset();
        intQty = parseInt((IQEnvironment.aum / stock.getAdjClose()) * stock_weight);
        stock_basket.enter(IQStock.getStock(code), intQty);
        enterForInit = true;
    }

}