구글링등을 하다보면 오픈된 조건 검색식들을 제법 찾을 수 있습니다.
그중에 아래와 같이 pine script로 작성된 코드를 발견할 수 있었습니다.
s= sum(1);
cond1 = c(2) > o(2) * (1 + uprate1/100);
cond2 = c(1) > o(1) && o(1) >=c(2) && c(1) <= h(2);
a = valuewhen(1, cond1 & cond2 , o(1));
as = valuewhen(1, cond1 & cond2 , s);
index_line = if(s-as < nCandle && s-as >= 0 , a, 0);
crossup(c, index_line * (1 + uprate2 /100)) && (index_line > 0)
//--- parameter 설명 ----------
// uprate1 : 상승룰1
// nCandle : 봉의 개수를 나타내는 파라미터
// uprate2 : 상승률2
위 내용을 증권사 HTS에서 제공하는 수식관리자에 집어넣고 활성화를 시키면, 위 조건에 맞는 신호를 차트에 표시해 주는 식입니다.
간략하게 pine script의 문법을 알아보겠습니다.
Pine Script 간략한 문법
시고저종, o(n), h(n), l(n), c(n)
주식의 시가, 저가, 저가, 종가는 각각 영단어의 앞자리를 따서 o, h, l, c 라 합니다.
o(n), h(n), l(n), c(n) 처럼 n을 인자로 받으면, 각각 n일 전의 시고저종 값을 의미합니다.
따라서
cond1 = c(2) > o(2) * (1 + uprate1/100);
// 2일전의 종가(close)가 2일 전의 시가(open)에 상승률 uprate1 보다 큰 경우
cond2 = c(1) > o(1) && o(1) >=c(2) && c(1) <= h(2);
// 1일전의 종가(close)가 1일전의 시가(open)보다 크고, 즉, 1일전 캔들이 양봉이고
// 1일전 시가(open)가 그 전날 종가(close)보다 크며,
// 1일전 종가(close)가 2일전 고가(high) 이하인 조건
※ 참고로 "//" 를 이용하여 위처럼 주석을 달 수 있습니다.
valuewhen(nth, condition, data)
data 시계열에서 과거 방향(index가 줄어드는 방향)으로 condition이라는 조건을 nth 번째 만족하는 값을 말합니다. nth번째를 따질 때는 현재시점을 포함하여 셉니다. 자세한 내용은 valuewhen 함수, 파이썬으로는 어떻게 작성할까?
에서 다루었고, 글 valuewhen 함수, 파이썬으로는 어떻게 작성할까? #2
에서는 python code로 작성도 해봤습니다. 제일 위의 코드 중에서 valuewhen 문법에 대한 해석은 다음과 같겠죠.
a = valuewhen(1, cond1 & cond2 , o(1));
// 조건 cond1과 cond2를 동시에 '첫번째로' 만족하는 o(1)시계열의 값
// 예를 들어 오늘부터 5일전에 cond1, cond2조건을 동시에 만족한다면, 오늘에 6일전의 시가를 대응하는 것
as = valuewhen(1, cond1 & cond2 , s);
// 조건 cond1과 cond2를 동시에 '첫번째로' 만족하는 s 시계열의 값
// s 는 아래에서 자세히 설명
sum(a)
시계열의 초기 index부터 a를 누적해서 더한 시계열을 의미합니다.
즉, (a, 2a, 3a, ...)의 시계열이 생깁니다.
s= sum(1);
// (1,2,3,..., 마지막 index의 값) 이라는 시계열을 뜻함
따라서 종합하면
a = valuewhen(1, cond1 & cond2 , o(1));
as = valuewhen(1, cond1 & cond2 , s);
index_line = if(s-as < nCandle && s-as >= 0 , a, 0);
// s: 시계열의 초기index부터 1씩 늘어나는 시계열과
// as: 조건 cond1과 cond2를 동시 만족하는 시점의 s시계열의 값을 구하고
// s와 as 차이가 nCandle(=20) 미만으로 차이가 날 때,
// 그 날 전날의 시가인 o(1)를 기준라인(index_line) 으로 잡는다.
crossup(A,B)
말 그대로 A가 B를 상향돌파 (golden cross)하는 것을 뜻합니다.
crossup(c, index_line * (1 + uprate2 /100)) && (index_line > 0)
// 종가가 위에서 구한 기준선(index_line)이 상승률 uprat2위의 선을 상향 돌파하면
// 그리고 index_line 이 0 이 아닌 유효한 값일 때,
// 신호 완성!
pine script와 pandas dataframe의 관계
python의 pandas dataframe 프레임워크는 위에서 살펴본 pine script의 문법에 대응하는 함수를 많이 가지고 있는데요. 정리해 보면 아래와 같습니다.
df를 시고저종 데이터가 포함된 주식 데이터이고 날짜에 대해 오름차순으로 정렬되어 있는 데이터라 합시다. FinanceDataReader로 불러온 주식 데이터의 형태를 생각하면 됩니다.
pine script | python |
o(n) h(n) l(n) c(n) |
df.Open.shift(n) df.Open.shift(n) df.Open.shift(n) df.Open.shift(n) |
sum(1) | range(1,len(df)+1) : 1~ len(df) 까지 |
valuewhen | valuewhen 함수, 파이썬으로는 어떻게 작성할까? #2 |
crossup(A,B) | df.A.shift(1) < df.B.shift(1) && df.A > = df.B |
위 전략은 Spear Signal이라고 누군가 명명했더군요. 그래서 저도 이 명칭을 존중하도록 하겠습니다.
그렇다면 Spear Signal의 콘셉트는 무엇일까요?
Spear Signal
cond1 = c(2) > o(2) * (1 + uprate1/100);
cond2 = c(1) > o(1) && o(1) >=c(2) && c(1) <= h(2);
위 부분을 보면 어떤 기준이 되는 날의
1) 전전일은 양봉이고 , 시가대비 종가 비율이 uprate1라는 의미입니다.
2) 전일은 양봉이고, 전전일의 종가보다 전일의 시가가 크며, 전전일의 고가가 전일의 종가보다 크다는 의미죠.
캔들을 그려볼까요? 예제로 셀트리온제약(068760) 차트를 준비해 봤습니다.
캔들을 관찰하다 보니 Spear Signal을 띄울만한 봉들이 보이는군요. 바로 아래처럼요.
점선의 네모 박스 안의 세 개의 캔들을 확대하면 원 안의 세 캔들처럼 보입니다. 이것만 따로 떼어 볼까요?
기준일 $t$ 시점의 전일인 $t-1$ 시점과 전전일인 $t-2$ 시점을 보시죠.
1) $t-2$ 시점에서의 캔들은 우선 양봉이고, 어느 정도의 상승률을 기록한 장대양봉을 보여 줍니다. (조건 cond1)
2) $t-1$ 시점에의 캔들도 양봉!, 게다가 전전일 $t-2$시점의 종가 $c(2)$와 고가 $h(2)$사이에 양봉이 위치합니다(조건 cond2)
따라서 뭔가 spear 시그널이 뜬 상황이고, 이 때의 기준선인 index_line은 시점 $t-1$의 시가인 $o(1)$이 됩니다.
이런 시그널이
1) 오늘로부터 nCandle 이전에 발생하고,
2) index_line에 상승률 rate2 만큼 반영해 준 수치가 종가와 golden cross 가 되면,
매수 타점이 떴다고 생각하는 겁니다. 그림으로 그려보면,
뭔가 좀 복잡하죠? 과연 이 시그널이 잘 맞아 들어가는지 다음글에서 python code를 통하여 알아보도록 하겠습니다.
'주식분석 > Quant 분석(프로그래밍)' 카테고리의 다른 글
주식 전종목 어떻게 불러올까? 거래소 종목 불러오기 (0) | 2023.04.06 |
---|---|
막힌벽을 강하게 뚫어보자- 222일선 강하게 돌파하는 전략 (0) | 2023.04.04 |
valuewhen 함수, 파이썬으로는 어떻게 작성할까? #2 (0) | 2023.03.30 |
valuewhen 함수, 파이썬으로는 어떻게 작성할까? (0) | 2023.03.29 |
급등주 매수 신호 (0) | 2023.03.26 |
댓글