Search

IQDate

목차

개요

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 기준으로 yearsmonths개월 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 객체를 생성하여 반환하는 팩토리 함수들입니다. 반환된 DateRuleaddRebalSchedule()에 전달해 스케줄을 등록합니다.

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 객체 — 매월 특정 일에 콜백 함수를 등록하는 타이머 방식