목차
개요
IQDate는 iQ 스튜디오 전략 코드에서 전역으로 접근 가능한 싱글톤 날짜 유틸리티 객체입니다.
영업일(거래일) 조회, 리밸런싱 주기 설정, 특정 날짜가 리밸런싱일인지 판별하는 기능을 제공합니다.
onDayClose(now) 함수는 영업일에만 호출되므로, 날짜 비교 시 now는 항상 거래일임이 보장됩니다. 리밸런싱 스케줄과 isRebalancingDay(now) 조합이 퀀트 전략의 핵심 리밸런싱 패턴입니다.
function initialize() {
IQDate.addRebalSchedule(IQDate.setMonthlyStart(1)); // 매월 1일 리밸런싱
}
function onDayClose(now) {
if (IQDate.isRebalancingDay(now)) {
// 리밸런싱 실행
}
}
JavaScript
복사
1. 영업일 조회
getPrevWorkingDay(date)
date 날짜의 이전 영업일을 반환합니다.
파라미터 | 타입 | 설명 |
date | Date | 기준 날짜 |
반환값: Date — 이전 영업일
function onDayClose(now) {
var prev = IQDate.getPrevWorkingDay(now);
logger.debug('전일 영업일: ' + prev);
}
JavaScript
복사
getNextWorkingDay(date)
date 날짜의 다음 영업일을 반환합니다.
파라미터 | 타입 | 설명 |
date | Date | 기준 날짜 |
반환값: Date — 다음 영업일
function onDayClose(now) {
var next = IQDate.getNextWorkingDay(now);
logger.debug('익일 영업일: ' + next);
}
JavaScript
복사
getPastCalendar(date, years, months, days)
date 기준으로 years년 months개월 days일 이전의 달력 날짜를 반환합니다. 거래일이 아닌 단순 달력 기준 날짜를 계산합니다.
파라미터 | 타입 | 설명 |
date | Date | 기준 날짜 |
years | number | 몇 년 전 (0이면 연 단위 이동 없음) |
months | number | 몇 개월 전 (0이면 월 단위 이동 없음) |
days | number | 며칠 전 (0이면 일 단위 이동 없음) |
반환값: Date — 계산된 과거 날짜
function onDayClose(now) {
var oneYearThreeMonthsAgo = IQDate.getPastCalendar(now, 1, 3, 0);
logger.debug('1년 3개월 전: ' + oneYearThreeMonthsAgo);
}
JavaScript
복사
2. DateRule 생성 함수
DateRule 객체를 생성하여 반환하는 팩토리 함수들입니다. 반환된 DateRule을 addRebalSchedule()에 전달해 스케줄을 등록합니다.
setDaily()
리밸런싱 주기를 매 거래일로 설정하는 DateRule을 생성합니다.
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setDaily()); // 매일 리밸런싱
JavaScript
복사
setWeekly(weekday)
리밸런싱 주기를 매주 특정 요일로 설정하는 DateRule을 생성합니다. 해당 요일이 휴일인 경우 그 다음 영업일에 리밸런싱합니다.
파라미터 | 타입 | 설명 |
weekday | number | 요일 코드. 1 = 월요일, 2 = 화요일, 3 = 수요일, 4 = 목요일, 5 = 금요일 |
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setWeekly(1)); // 매주 월요일 리밸런싱
IQDate.addRebalSchedule(IQDate.setWeekly(5)); // 매주 금요일 리밸런싱
JavaScript
복사
setMonthlyStart(day)
리밸런싱 주기를 매월 day일로 설정하는 DateRule을 생성합니다. 해당 일이 휴일인 경우 그 다음 영업일에 리밸런싱합니다.
파라미터 | 타입 | 설명 |
day | number | 매월 리밸런싱할 날짜 (1~31) |
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setMonthlyStart(1)); // 매월 1일
IQDate.addRebalSchedule(IQDate.setMonthlyStart(15)); // 매월 15일
JavaScript
복사
setMonthlyEnd(day_offset)
리밸런싱 주기를 매월 말일로부터 day_offset번째 이전 일로 설정하는 DateRule을 생성합니다. 해당 일이 휴일인 경우 그 이전 영업일에 리밸런싱합니다.
파라미터 | 타입 | 설명 |
day_offset | number | 말일로부터 며칠 이전. 0 = 말일, 1 = 말일 전날, 2 = 말일 2일 전 |
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setMonthlyEnd(0)); // 매월 말일
IQDate.addRebalSchedule(IQDate.setMonthlyEnd(2)); // 매월 말일의 2일 전
JavaScript
복사
setMonthlyTradingDays(day_offset)
리밸런싱 주기를 매월 day_offset번째 거래일로 설정하는 DateRule을 생성합니다.
파라미터 | 타입 | 설명 |
day_offset | number | 해당 월의 몇 번째 거래일인지. 1 = 첫 번째 거래일, 5 = 5번째 거래일 |
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setMonthlyTradingDays(1)); // 매월 첫째 거래일
IQDate.addRebalSchedule(IQDate.setMonthlyTradingDays(5)); // 매월 5번째 거래일
JavaScript
복사
setMonthlyTradingDaysEnd(day_offset)
리밸런싱 주기를 매월 말일로부터 day_offset번째 이전 거래일로 설정하는 DateRule을 생성합니다.
파라미터 | 타입 | 설명 |
day_offset | number | 말일 거래일로부터 몇 번째 이전 거래일인지. 1 = 마지막 거래일 전 거래일 |
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setMonthlyTradingDaysEnd(1)); // 매월 마지막 거래일
IQDate.addRebalSchedule(IQDate.setMonthlyTradingDaysEnd(5)); // 매월 끝에서 5번째 거래일
JavaScript
복사
setYearly(month, day)
리밸런싱 주기를 매년 특정 월·일로 설정하는 DateRule을 생성합니다. 해당 일이 휴일인 경우 그 다음 영업일에 리밸런싱합니다.
파라미터 | 타입 | 설명 |
month | number | 월 (1~12) |
day | number | 일 (1~31) |
반환값: DateRule
IQDate.addRebalSchedule(IQDate.setYearly(1, 2)); // 매년 1월 2일
IQDate.addRebalSchedule(IQDate.setYearly(5, 31)); // 매년 5월 31일
JavaScript
복사
3. 리밸런싱 스케줄 관리
addRebalSchedule(dateRule)
DateRule 객체를 리밸런싱 스케줄로 추가 등록합니다. 여러 번 호출하면 복수의 스케줄이 누적 등록됩니다.
파라미터 | 타입 | 설명 |
dateRule | DateRule | IQDate.set*() 함수로 생성한 날짜 규칙 객체 |
반환값: 없음.
function initialize() {
// 매주 월요일 + 매월 15일 — 두 스케줄 모두 등록
IQDate.addRebalSchedule(IQDate.setWeekly(1));
IQDate.addRebalSchedule(IQDate.setMonthlyStart(15));
}
JavaScript
복사
resetRebalSchedule()
addRebalSchedule()로 등록된 모든 DateRule을 제거하고 초기화합니다.
반환값: 없음.
IQDate.addRebalSchedule(IQDate.setMonthlyStart(1));
IQDate.resetRebalSchedule(); // 기존 스케줄 전부 제거
IQDate.addRebalSchedule(IQDate.setMonthlyStart(15)); // 새 스케줄로 재설정
JavaScript
복사
isRebalancingDay(date)
date가 등록된 리밸런싱 스케줄에 해당하는 날인지 판별합니다. true이면 리밸런싱 실행 조건이 충족된 것입니다.
파라미터 | 타입 | 설명 |
date | Date | 판별할 날짜. 보통 onDayClose(now)의 now를 전달 |
반환값: boolean — 해당 날짜가 리밸런싱일이면 true
휴일 처리 규칙 (리밸런싱 지정일이 휴일인 경우):
규칙 | 대체 영업일 |
setWeekly(w) | 해당 요일 다음 영업일 |
setMonthlyStart(d) | 해당 월 d일 다음 영업일 |
setMonthlyEnd(d) | 해당 일 이전 영업일 |
setYearly(m, d) | 해당 월 d일 다음 영업일 |
function initialize() {
IQDate.addRebalSchedule(IQDate.setMonthlyStart(1)); // 매월 1일 리밸런싱
}
function onDayClose(now) {
// onDayClose는 영업일에만 호출됨
if (IQDate.isRebalancingDay(now)) {
// 1월2일, 2월1일, 3월2일(3/1이 주말이면), 4월1일, ... 에 true
logger.info('리밸런싱 실행: ' + now);
}
}
JavaScript
복사
4. 활용 패턴
패턴 1: 한국 재무데이터 업데이트 시점 분기 리밸런싱
4월·6월·9월·12월 1일에 리밸런싱합니다.
function initialize() {
IQDate.addRebalSchedule(IQDate.setYearly(4, 1));
IQDate.addRebalSchedule(IQDate.setYearly(6, 1));
IQDate.addRebalSchedule(IQDate.setYearly(9, 1));
IQDate.addRebalSchedule(IQDate.setYearly(12, 1));
}
function onDayClose(now) {
if (!IQDate.isRebalancingDay(now)) return;
// 분기 리밸런싱 로직
}
JavaScript
복사
패턴 2: 복수 스케줄 — 주간 + 월간 병행
function initialize() {
IQDate.addRebalSchedule(IQDate.setWeekly(5)); // 매주 금요일
IQDate.addRebalSchedule(IQDate.setMonthlyStart(1)); // 매월 1일 (중복 시 한 번만 실행)
}
function onDayClose(now) {
if (!IQDate.isRebalancingDay(now)) return;
logger.debug('리밸런싱 실행: ' + now);
}
JavaScript
복사
패턴 3: 과거 날짜 조회 — 장기 모멘텀 계산
getPastCalendar()로 12개월 전 날짜를 구하고 해당 시점의 가격과 비교합니다.
function onDayClose(now) {
var stock = IQStock.getStock('A005930');
if (stock == null) return;
// 1년 전 달력 날짜를 기준으로 과거 데이터 비교 (loadPrevData 선행 필요)
var oneYearAgo = IQDate.getPastCalendar(now, 1, 0, 0);
logger.debug('1년 전 날짜: ' + oneYearAgo);
}
JavaScript
복사
패턴 4: 스케줄 동적 변경
시뮬레이션 도중 조건에 따라 리밸런싱 주기를 재설정합니다.
function initialize() {
IQDate.addRebalSchedule(IQDate.setMonthlyStart(1));
}
function switchToWeekly() {
IQDate.resetRebalSchedule();
IQDate.addRebalSchedule(IQDate.setWeekly(1)); // 월별 → 주별로 전환
logger.info('리밸런싱 주기를 주별로 변경');
}
JavaScript
복사
관련 API
•
DateRule 객체 — 날짜 규칙을 담는 데이터 객체 구조
•
Basket 객체 — buildPortfolio()와 함께 사용하는 포트폴리오 관리
•
IQTimer 객체 — 매월 특정 일에 콜백 함수를 등록하는 타이머 방식
