커뮤니티
내가 만든 전략들과 지식을 공유하고 토론합니다.

과거 주가(시장) 데이터를 날짜로 지정해서 조회하는 방법 (개정판)

Joseph 2022.02.28 21:04 조회수  270 추천 1

지난 글 (https://www.intelliquant.ai/article/1017?forum=0) 에서, 과거 주가(시장) 데이터를 조회하는 방법으로 특정 날짜를 지정해서 조회할 수 있도록 임시방편으로 함수를 만들어, 동작과 사용법에 대한 이해를 위해 알고리즘을 공유했었습니다.


인텔리퀀트의 이번 정기 업데이트를 통해 과거 참조가능 거래일이 600일까지 늘어남에 따라, 당시 공유했던 함수 중 getWorkingDayOffset(date) 도 더 정교하게 599일 전 데이터까지 정확히 참조 가능하도록 개선된 버전을 공유합니다.


아직 플랫폼에 내재화하지는 않았습니다. 여러분들께서 공유해 드리는 함수를 이용해서 사용하시는데 불편함이 없다고 피드백 주시면 의견 반영하여 플랫폼에 내재화하겠습니다.




Created with Highcharts 4.2.7AlgorithmKOSPIKOSDAQ2021-01-012021-02-012021-03-012021-04-012021-05-012021-06-012021-07-012021-08-012021-09-012021-10-012021-11-012021-12-012022-01-01-20%0%20%40%60%80%powered by IntelliQuant
Algorithmpowered by IntelliQuant
초기투자금액
10000000
수익률
66.52%
연평균 수익률
67.55%
연환산 표준편차
22.52%
베타
0.79
Sharpe Ratio
2.20
(젠센) 알파
0.50
최대 손실폭
14.03%
KOSPIpowered by IntelliQuant
초기투자금액
 
수익률
1.13%
연평균 수익률
1.14%
연환산 표준편차
16.16%
베타
1.00
Sharpe Ratio
-0.05
(젠센) 알파
0.00
최대 손실폭
14.11%
KOSDAQpowered by IntelliQuant
초기투자금액
 
수익률
5.77%
연평균 수익률
5.84%
연환산 표준편차
18.08%
베타
0.87
Sharpe Ratio
0.20
(젠센) 알파
0.04
최대 손실폭
12.98%
x
67
 
1
/**
2
이 코드는 인텔리퀀트 스튜디오 사용법을 설명하기 위한 예제입니다.
3
인텔리퀀트는 이 알고리즘의 수익률을 보장하지 않습니다.
4
그러나 정량적인 가설 -> 검증(시뮬레이션) -> 실증 과정을 통해
5
여러분이 보다 안정적인 높은 수익률을 낼 수 있을거라 확신합니다.
6
**/
7
8
var stock_basket;               // 주식 종목들을 관리하는 Basket 객체
9
var stock_num = 10;             // 주식 종목 수
10
var stock_weight = 0.95;        // 주식 비중 (거래비용 고려 현금 5% 확보)
11
12
var isFirst = true;             // 시뮬레이션 시작일에 바로 포트폴리오 신규 구성을 하기 위해 사용될 상태 변수
13
14
15
// 1) 시뮬레이션 초기화 함수 - 전략이 실행될 때 초기화를 위해 최초 한번 자동으로 실행
16
function initialize() {
17
    stock_basket = new Basket(IQAccount.getDefaultAccount(), stock_num, IQEnvironment.aum * stock_weight);
18
    stock_basket.setPortfolioBuilder(stockPortfolioBuilder);
19
20
    IQDate.addRebalSchedule(IQDate.setMonthlyStart(1));
21
}
22
23
// 2) 팩터(factor) 지표 정의 - 종목 필터링 함수 및 포트폴리오 구성 함수에서 사용
24
// 주가수익비율(PER) 팩터 정의
25
function getPER(stock) {
26
    if (stock.getClose() === 0 || stock.getFundamentalNetProfit() === 0) {
27
        return -1;
28
    }
29
    
30
    return 1000 * stock.getMarketCapital() / (stock.getFundamentalNetProfit() * 4);
31
}
32
33
34
35
36
// 3) 필터링 함수 정의 - 필터링 조건에 따라 종목들의 포함 여부 판단
37
function stockFilter(stock) {
38
    if (stock.isETF) {
39
        return false;
40
    }
41
42
    var filterMarketCapital = (stock.getMarketCapital() > 50000);   
43
    var filterTradingValue = (stock.getTradingValue() > 100);     
44
    var filterPER = (getPER(stock) > 0);                          
45
46
    return (filterMarketCapital &&  filterTradingValue && filterPER);
47
}
48
49
50
// 4) 포트폴리오 빌더 함수 정의 - 필터링 및 팩터 기반 종목 선정
51
function stockPortfolioBuilder(targetSize) {
52
    var universe = IQStock.filter(stockFilter);
53
    var sortedByPer = universe.slice().sort(function(a,b){return getPER(a) - getPER(b);}); 
54
    
55
    return sortedByPer.slice(0, targetSize);  
56
}
57
58
// 5) 리밸런싱 수행 - 시뮬레이션 기간 동안 장 마감 후 매일 자동으로 호출되는 함수
59
function onDayClose(now) {
60
    var offset = getWorkingDayOffset(getPastCalendar(now, 2, 0, 0));    // 1년전 오늘까지의 과거 영업일수
61
    // var offset = getWorkingDayOffset('2020-11-30');      // 날짜를 지정하는 경우 사용법
62
    
63
    var kospi = IQIndex.getIndex('001');    
64
    logger.debug('KOSPI @ ' +
65
...
66
(코드는 일부만 보여지며 전체 코드는 "내 알고리즘에 복사" 버튼을 클릭하여 복사할  있습니다. 
67
알고리즘 복사  일정한 포인트가 차감되어 게시자에게 보상해 드립니다.)
댓글 1
Joseph님 감사드립니다. 드디어 과거 주가를 마음대로 가져올수 있게 되었습니다^^
소포클레스 2022.03.01 22:31
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글