전략 스크립트 기본 구성
인텔리퀀트의 전략 스크립트를 작성하는 것은 어렵지 않습니다.전략 시뮬레이션이 처음 시작하면 실행할 내용과,시뮬레이션 기간중 매일 매일 실행할 내용과,시뮬레이션이 종료되면 실행할 내용을 작성하면 됩니다.대부분의 경우 종료할 때 특별히 할일이 없으므로, 시작 할때와 매일매일 함수 두개만 작성하면 됩니다.
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() 함수
시뮬레이션 기간중 매일 매일 장이 종료되면 이 함수가 호출됩니다.이 함수에서 당일 혹은 이전의 시세를 참조하여 주문을 내는 방식으로 시뮬레이션을 진행합니다.인텔리퀀트는 실시간으로 장중에 주문을 내는 시뮬레이션 방식이 아닌, 장 종료 이후에 주문을 낼 것인지 판단하여 다음날 시가에 주문을 내는 것으로 가정하는 방식을 사용합니다.(주: 기본은 주문이 발생한 이후 다음날 시가 거래이지만, 옵션 설정을 통해 다음날 시가가 아닌 당일 종가로 매매하는 것으로 가정 할 수 있습니다. trade station을 사용해 보신 분들은 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만개의 로그까지만 허용합니다. 더 이상의 로그는 가장 최근 메시지부터 삭제됩니다.
너무 많은 로그를 출력할 경우 웹브라우저의 과부하로 문제가 생길수 있습니다.