Search

기본 전략 작성

전략 스크립트 기본 구성

인텔리퀀트의 전략 스크립트를 작성하는 것은 어렵지 않습니다.
전략 시뮬레이션이 처음 시작되면 실행할 내용과, 시뮬레이션 기간 중 매일 매일 실행할 내용과, 시뮬레이션이 종료되면 실행할 내용을 작성하면 됩니다.
대부분의 경우 종료할 때 특별히 할 일이 없으므로, 시작할 때와 매일 매일 함수 두 개만 작성하면 됩니다.

initialize() 함수

시뮬레이션이 시작되면 우선 initialize 함수가 실행됩니다.
만약 사용자가 initialize 함수를 정의하지 않으면 건너뛰게 됩니다. 또는 오타가 나서 함수명이 달라지면 역시 건너뛰게 됩니다.
보통의 경우에는 Basket 객체를 초기화하거나, 추후 계산에 필요한 값들을 초기화하는데 사용합니다.
주의: 자바스크립트 특성상, initialize 함수가 아닌 root 에 있는 스크립트들도 실행 초기에 실행이 됩니다. 그러나 이 경우에는 기본 계좌 등의 내부 초기화가 이루어진 상태가 아니므로 가급적 initalize 함수에서 초기화 하는 것을 권장합니다.
initalize 함수의 예제는 다음과 같습니다.
var stock_basket; var stock_weight = 0.95; function initialize() { IQEnvironment.stockCommission = 0.0015; // commission for stocks 0.0015 IQEnvironment.etfCommission = 0.0015; // commission for ETFs 0.0015 IQEnvironment.stockTax = 0.003; // trade tax for stocks logger.debug("strategy initialized."); // 로그를 출력합니다. // 1억짜리 새로운 계좌를 추가합니다. IQAccount.addAccount('1111', '두번째 전략', 100000000); // 새로운 Basket 객체를 생성합니다. stock_basket = new Basket(IQAccount.getAccount("1111"), 10, 10000000*stock_weight ); }
Plain Text
복사

onDayClose() 함수

시뮬레이션 기간 중 매일 시장이 종료되면 이 함수가 호출됩니다.
이 함수에서 당일 혹은 이전의 시세를 참조하여 주문을 내는 방식으로 시뮬레이션을 진행합니다.
인텔리퀀트는 실시간으로 장중에 특정 시세로 주문을 내는 방식이 아닌, 장 종료 이후에 주문을 낼 것인지 판단하여 다음날 시가에 주문을 내는 것으로 가정하는 방식을 사용합니다.
기본은 주문이 발생한 이후 다음날 시가 거래이지만, 옵션 설정을 통해 다음날 시가가 아닌 당일 종가로 매매하는 것으로 가정할 수 있습니다. TradeStation을 사용해 보신 분들은 onClose 옵션과 atMarket 옵션을 생각하시면 됩니다.
실전에서 다음날 시가가 아닌 장중 임의의 시간에 매매하게 되면 시뮬레이션과 차이가 발생할 수 있습니다. 그러나 시뮬레이션 기간이 길어질수록 그 차이가 상쇄되어 전략의 성과를 판단하는데는 큰 문제가 되지 않게 됩니다.
onDayClose 함수는 시뮬레이션 기간 중 매일 호출됩니다. 1년정도 시뮬레이션 한다면 대략 250번 호출됩니다. 따라서 이 함수에서는 가급적 불필요한 계산을 하지 않는것이 테스트 속도를 높이는데 도움이 됩니다.
파라메터로 전달되는 now 객체는 Javascript의 Datetime 객체입니다.이를 통해 onDayClose 가 호출되는 시점을 판단할 수 있습니다. 예를 들어 매월 1일에 리밸런싱 하도록 하거나, 옵션 만기일에 맞춰서 거래할 경우 now 객체를 사용하시면 됩니다.
onDayClose 함수의 예제:
var isFirst = false; function onDayClose(now) { // IQDate.isRebalancingDay(now) // initialize에서 설정한 리밸런싱 주기 체크 // isFirst === true // 전략 최초 실행시 리밸런싱 실행 if (IQDate.isRebalancingDay(now) || isFirst === true) { // 1111 계좌 호출 var acc = IQAccount.getAccount("1111"); // 계좌의 총평가금액(평가액+예수금 모두) var totalEquity = acc.getTotalEquity(); // 계좌 총평가액에 맞춰 주식 비중 금액 재할당 stock_port.setBudget(totalEquity * stock_weight); // 포트폴리오 구성 함수 실행 stock_port.buildPortfolio(); // 전략 최초 실행이후 변경 isFirst = false; } }
Plain Text
복사

onComplete() 함수

onComplete()는 스크립트를 모두 실행시키고 난 후 종료하기 직전에 호출되는 함수입니다. 
백테스팅 시에는 사용자가 정의한 성과분석, 통계값 등을 로그 화면에 표출하는 식으로 활용될 수 있는데, 실전투자에서는 이 함수를 통해 어느 포트폴리오(Basket)를 매매 목록으로 저장시킬 것인지 아래와 같은 방법으로 지정해야 합니다.
... function onComplete() {                 ...     IQLive.addPortfolio(basket1,basket1_weight);     IQLive.addPortfolio(basket2,basket2_weight);     IQLive.addPortfolio(basket3,basket3_weight);                 ... } ...
Plain Text
복사
(붉은색으로 된 변수를 사용자 전략에 맞게 수정)

콘솔 로그 출력

스크립트를 실행하면서 디버깅등에 필요한 출력은 logger 객체를 사용합니다.
function onDayClose(now) { logger.debug("now : " + now.toString()); }
Plain Text
복사
logger 객체는 debug, info, error 3가지 종류의 로그 기능을 제공합니다.콘솔창에서는 3가지 로그중 원하는 로그 종류만 필터링 하는 기능을 제공합니다.주의할 점은 콘솔창은 1만개의 로그까지만 허용합니다. 더 이상의 로그는 가장 최근 메시지부터 삭제됩니다.
너무 많은 로그를 출력할 경우 웹브라우저의 과부하로 문제가 생길수 있습니다.