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

개별종목별 거래량 컨트롤 예제

Europa 2021.09.28 20:34 조회수  422 추천 8

안녕하세요. 전략토론방에는 처음 게시물을 올립니다. (전략토론방에 최근 게시글이 너무 없어서 활성화를 의도하는 목적도 있습니다.)


알고리즘을 돌리다보면 거래액이 너무 커져서 시장에서 실제 거래될 수 없거나 혹은 시장 자체를 왜곡시킬 수준의 거래를 발생시키는 일이 자주 발생합니다. 실전 매매에서는 슬리피지를 아주 크게 만들거나, 혹은 실전 매매에 적용 불가능한 알고리즘이 됩니다.


이런 문제를 최대한 바로잡으려고 시도를 해 보았습니다. 각 개별종목별로 하루에 매매 시도하는 최대치를 일 거래량의 1% 정도로 셋팅해 두고 이를 강제하는 코드입니다. 아직 완전한 구현은 아닙니다. 배스킷의 최대 예산을 초과하지 않도록 매도와 매수를 보다 정밀하게 컨트롤해야 하지만, 가끔 매도보다 매수가 더 진행되서 오류를 출력하기도 합니다. 그래도 아마 실전에 적용하는 분들에게는 도움이 될 것 같아서 공유드립니다.


구현체는 인텔리퀀트에서 제공하는 기본 템플릿에 추가해 두었습니다. 기본 템플릿의 동작과 비교해 보시면 차이가 보입니다. 예를 들어, 아래 백테스트 결과를 보면, 매달 1일 리밸런싱임에도 불구하고, 1일에 리밸런싱을 충분히 마무리하지 못한 부분은 그 뒤로도 목표를 달성할때까지 매일 거래량을 컨트롤해가면서 매도, 매수를 진행한 것을 볼 수 있습니다.


감사합니다.

Created with Highcharts 4.2.7기본 알고리즘 + 거래량 컨트롤 예제KOSPIKOSDAQ2021-07-052021-07-122021-07-192021-07-262021-08-022021-08-092021-08-162021-08-232021-08-302021-09-062021-09-132021-09-202021-09-27-10%-5%0%5%10%powered by IntelliQuant
기본 알고리즘 + 거래량 컨트롤 예제powered by IntelliQuant
초기투자금액
500000000
수익률
-2.01%
연평균 수익률
-8.00%
연환산 표준편차
22.83%
베타
1.08
Sharpe Ratio
-0.45
(젠센) 알파
0.18
최대 손실폭
14.56%
KOSPIpowered by IntelliQuant
초기투자금액
 
수익률
-5.74%
연평균 수익률
-21.53%
연환산 표준편차
12.09%
베타
1.00
Sharpe Ratio
-2.17
(젠센) 알파
0.00
최대 손실폭
7.40%
KOSDAQpowered by IntelliQuant
초기투자금액
 
수익률
-0.98%
연평균 수익률
-3.95%
연환산 표준편차
16.39%
베타
1.01
Sharpe Ratio
-0.37
(젠센) 알파
0.21
최대 손실폭
8.69%
x
65
 
1
/**
2
이 코드는 인텔리퀀트 스튜디오 사용법을 설명하기 위한 예제입니다.
3
인텔리퀀트는 이 알고리즘의 수익률을 보장하지 않습니다.
4
그러나 정량적인 가설 -> 검증(시뮬레이션) -> 실증 과정을 통해
5
여러분이 보다 안정적인 높은 수익률을 낼 수 있을거라 확신합니다.
6
7
[전략 및 예제 코드]
8
예제 코드에서는 가치(Value) 팩터 지표들 중에서 대표적인 주가수익비율(PER)을 기준으로
9
투자 종목을 선정하는 방식을 사용합니다.
10
11
1. 일정 기준 이상 거래량과 시가총액을 가지고 있는 종목들 중 PER가 가장 낮은 10종목 매수
12
2. 매월 1일 리밸런싱 (종목 교체)
13
**/
14
15
var stock_basket;         // 주식 종목들을 관리하는 Basket 객체
16
var stock_num = 10;       // 주식 종목 수
17
var stock_weight = 0.95;  // 주식 비중 (거래비용 고려 현금 5% 확보)
18
19
var isFirst = true;       // 시뮬레이션 시작일에 바로 포트폴리오 신규 구성을 하기 위해 사용될 상태 변수
20
21
// Target basket. 거래량을 고려하여 매수, 매도 진행시, 리밸런싱데이때 이 목표를 맞추지 못하는 경우,
22
// 리밸런싱 데이가 아닌 날에도 추가 매수, 매도를 진행하도록 하기 위한 목적.
23
var target_basket;     
24
25
26
// 1) 시뮬레이션 초기화 함수 - 전략이 실행될 때 초기화를 위해 최초 한번 자동으로 실행
27
function initialize() {
28
    // 필요한 바스켓을 선언합니다. 이 바스켓을 통해 종목을 선정하고 주문을 수행합니다.
29
    // 바스켓을 사용하지 않고 직접 Account 객체에 매수/매도 주문을 낼 수도 있습니다.
30
31
    // 주식 종목을 담을 Basket 객체입니다. 10개의 종목을 담을 예정이며,
32
    // 초기 할당 금액은 전체(aum: Asset Under Management) 금액 중 95% 입니다.
33
    stock_basket = new Basket(IQAccount.getDefaultAccount(), stock_num, IQEnvironment.aum * stock_weight);
34
35
    // 주식 포트폴리오 구성 함수를 지정합니다.
36
    stock_basket.setPortfolioBuilder(stockPortfolioBuilder);
37
    
38
    IQAccount.getDefaultAccount().accountName = "기본 알고리즘 + 거래량 컨트롤 예제";
39
40
    // 리밸런싱 주기를 매월 1일, 혹은 1일 이후 가장 가까운 영업일로 설정
41
    IQDate.addRebalSchedule(IQDate.setMonthlyStart(1));
42
}
43
44
// 2) 팩터(factor) 지표 정의 - 종목 필터링 함수 및 포트폴리오 구성 함수에서 사용
45
// 주가수익비율(PER) 팩터 정의
46
function getPER(stock) {
47
    // 해당 종목의 종가 또는 당기순이익이 0인 경우에는 제외합니다.
48
    if (stock.getClose() === 0 || stock.getFundamentalNetProfit() === 0) {
49
        return -1;
50
    }
51
52
    // 주가수익비율을 계산한 결과를 getPER(stock) 함수를 호출한 곳으로 넘겨줍니다.
53
    return 1000 * stock.getMarketCapital() / (stock.getFundamentalNetProfit() * 4);
54
}
55
56
// 3) 필터링 함수 정의 - 필터링 조건에 따라 종목들의 포함 여부 판단
57
function stockFilter(stock) {
58
    // ETF 종목들을 제외합니다. 그리고 필요 시 관리코드(manage),
59
    // 대형/중형/소형 등의 구분코드(capLevel)도 필터링 조건으로 추가할 수 있습니다.
60
    // 자세한 내용은 Stock 객체 도움말(https://www.intelliquant.co.kr/help/ref/1)을 참고하세요.
61
62
  
63
...
64
(코드는 일부만 보여지며 전체 코드는 "내 알고리즘에 복사" 버튼을 클릭하여 복사할  있습니다. 
65
알고리즘 복사  일정한 포인트가 차감되어 게시자에게 보상해 드립니다.)
댓글 5
올리고서 보니 아래쪽의 '소형주 분할매수...' 구현과 비슷한 기능이네요. 그래도 참고하실 수 있도록 남겨두겠습니다.
Europa 2021.09.28 20:38
와오 감사합니다 참고할게요~
슈퍼공돌맨 2021.09.30 16:09
감사합니다. 참고해보겠습니다
강성준 2021.10.04 18:43
감사합니다~~ 도움이 되셨기를...
Europa 2021.10.05 07:43
오... 좋은 의도인것 같습니다 참고해보겠습니다!
대풍 2021.10.09 00:56
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글