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; } }