주식투자 프로그래밍(시스템 트레이딩) 2.7 #. 세력주 검색 프로그래밍

By | 2018-01-14

#. 세력주 검색 프로그래밍

직접 세력주를 발굴하는 프로그램을 개발하려면 보다 정교하게 캔들 데이터를 필터렁해야 한다. HTS에서 제공하는 검색 방법으로도 어느 정도 세력주를 찾을 수 있지만 HTS 검색 과정은 너무 단순해서 필요없는 군더더기 종목까지 제시하므로 사용자가 일일이 차트를 보면서 불필요한 종목을 제거해야 한다. 특히 세력주 검색이 힘든 이유는 세력주를 찾는 것이 어려운 것이 아니라 세력주가 아닌 불필요한 종목을 제거하기 위해서 날마다 저녁 늦게까지 많은 시간을 낭비하기 때문이다. 그래서 필자는 HTS 검색 기능의 단점을 보완해고자 불필요한 종목을 정교하게 필터링하는 세력주 발굴 프로그램을 개발하였는데 그 과정과 원리를 설명하겠다.
차트 검색을 하려면 검색 날짜 기준으로 과거 캔들 데이터를 가지고 여러 조건식을 적용하는데 보통 [이동평균값, 전일가격, 크로스, 고점, 저점, 평균거래량, 양봉 개수, 누적 상승율] 데이터를 확인해야 한다. 세력주 발굴 프로그램은 사람이 실제로 차트에 나타난 캔들 데이터를 분석하면서 세력주를 찾는 과정을 프로그램으로 구현한 것이므로 세력주 발굴에 필요한 정보를 미리 생성해두어야만 한다.
이동평균값은 현재 가격이 상승 추세를 나타내는 정배열 상태인지 아니면 하락을 의미하는 역배열 상태를 구별하기 위해서 필요한 값으로 일반적으로 많이 사용하는 이동평균값인 {5, 20, 60, 120, 240, 480} 날짜로 변수를 고정시켰다. 그런데 필자가 지정한 이동평균값은 정확한 의미에서 이동평균값이 아니라 바로 전날까지 가격을 합쳐놓은 값이다. 그것은 검색하는 순간 가격과 전날까지의 가격을 합쳐서 실시간으로 이동평균 가격을 재계산해줘야 정확한 평균값을 구할 수 있기 때문에 바로 전날까지의 가격 합계를 모아둔 것이다.

기간

이평값

검색 순간

5일

4일간 가격합

(4일 합 + 현재 가격) / 5 = 5일 평균값

20일

19일 가격합

(19일 합 + 현재 가격) / 20 = 20일 평균값

60일

59일 가격합

(59일 합 + 현재 가격) / 60 = 60일 평균값

N

(N 1) 일 가격합

[(N 1) 일 합 + 현재 가격] / N = N 일 평균값

5 실시간 이동평균값을 구하는 원리

차트분석에서 골드 크로스와 데드 크로스는 추세의 변화가 일어나는 변곡점의 신호를 해석하는 경향이 있다. 그런데 실제로 차트분석에서는 골드 / 데드 크로스가 나타났다고 해서 반드시 추세 전환이 일어나는 것이 아니기 때문에 크로스 자체만 가지고는 세력주를 판단하지는 않지만 크로스가 발생한 지점을 기점으로 등락률을 비교할 때 중요한 변수로 작용하기 때문에 단기 세력주 발굴에서는 5 / 20 일선을 체크해둔다.
주식시장에서 인기없는 주식은 상대적으로 투자에 참여하는 사람이 적어서 거래량이 줄어드는 경향이 있는데 특히 장기간 투자자들로부터 외면받아서 거래량이 부족한 종목을 소외주라고 부른다. 그런데 이와 같은 소외주 중에서 일부 종목에서 어느 날 갑자기 대규모 거래량이 발생하면 세력주 검색에 포착되기 쉽다. 하지만 이와 같이 평상시 거래량이 부족한 종목이 느닷없이 세력주 범위에 포착되면 중기적으로 시세를 분출하기보다는 단발적인 재료로 잠시 상승하다가 곧 바로 소외주로 돌아가버리는 경향이 있어서 조심해야 한다. 그렇지 않고 일시적으로 강한 흐름을 보이는 소외주를 강한 세력주로 착각하여 멋모르고 보유하면 거래량 부족으로 인하여 손절매조차 어려운 상황에 직면하기 때문이다. 그래서 좋은 세력주가 되려면 당일 거래량도 중요하지만 평균거래량도 뒷받침되어야 하고, 필자는 세력주 발굴을 위해서 평균거래량을 체크한다.
세력주 검색기는 먼저 증권사보로부터 종목 리스트를 받아서 전 종목에 대한 현재 가격 시세를 다운로드한 후에 각 종목별로 과거 캔들 데이터부터 세력주 조건을 알맞게 필터링하면서 적합한 종목을 출력한다. 그런데 과거 캔들 데이터로부터 세력주 조건을 실시간으로 다운로드하면서 필터링하려면 시간이 많이 걸리므로 전날 기준으로 미리 생성해두었다가 필요할 때마다 검색하는 것이 효과적이다. 따라서 필자는 세력주 검색기에 [세력주 분석용 데이터 만들기] 기능을 추가하였으며 이 기능을 수행시키면 (필자 컴퓨터 기준으로) 6분 정도 소요되므로 당일 처음으로 세력주를 검색하려면 6분간 분석용 데이터를 생성하는 동안 기다려야 하고 2번째 검색부터는 대략 4초 만에 검색이 끝난다.

그림 6 세력주 검색기

[그림 6 세력주 검색기]는 내부적으로 세력주를 넘어서 그날 시황 흐름을 분석할 수 있을 정도로 다양한 정보를 스캐닝하면서 세력주를 필터링한다. 세력주 매매기법 중에서 가장 강력하고도 널리 알려진 것은 상한가 매매기법인데 매수 시점에 따라서 크게 세분화되어 있다. 먼저 상한가에 진입하는 순간을 노려서 따라붙는 [상한가 따라잡기], 상한가 다음날 종가 무렵에 단봉(작은 캔들)에서 추격 매수하는 [강약 눌림목], 상한가 이후에 며칠간 조정을 보이면서 양봉으로 N 파동을 그리는 [상한가 눌림목], 연속 상한가 이후에 상한가가 풀리는 조정 구간인 [(상한가)급등주 눌림목] 매수 기법 등이 널리 알려졌다. 그런데 상한가 따라잡기는 데이트레이딩 수준의 단타 매매를 전문으로 전업투자자가 아니면 접근하기 어렵기 때문에 여기서는 다루지 않고 다음 번 연재에 계획된 [상한가 따라잡기]에서 [상한가 따라잡기용 신호기 프로그램]과 함께 자세하게 다룰 것이다.
실제로 인터넷에서 활동하는 수많은 세력주 전문가들이 추천하는 종목을 살펴보면 상한가와 밀접한 관련이 있다. 이 글을 보는 독자 중에서 세력주 전문가가 추천한 종목의 차트를 확인해보라. 과거 며칠 이내에 상한가 캔들이 포함되어 있는 것을 쉽게 볼 수 있을 것이다. 세력주 매매에서 상한가는 그 어떤 신호보다는 강력한 신호이기 때문에 상한가에 진입하는 종목을 유심히 관찰했다가 이후에 움직임을 살피면서 매수에 가담하는 투자자들이 적지 않다. 그런데 너무 오른 상태에서 상한가로 진입하는 종목을 추격 매수했다가 상한가가 무너지면서 급락할 경우에는 순식간에 크게 손실을 볼 수 있기 때문에 무작정 상한가 종목을 매수하는 것은 휘발유를 등에 지고 불 속에 뛰어드는 것만큼이나 위험한 행동이다. 따라서 무조건 아무 상한가 종목을 매수하기보다는 전고점 대비 충분히 조정을 받아서 상대적으로 가격이 낮아진 구간에서 발생하는 [첫 번째 상한가] 종목으로 압축하는 것이 안전하다.

[첫상한가]는 20일 이상 조용히 있다가 상한가에 진입하는 [20일 첫상한가]와 그보다 짧게 5일 이상 기간을 두고 상한가에 진입하는 [5일 첫상한가]로 구분한다. 20일 상한가는 최소한 20일 이상 조정을 거친 후에 발생하는 상한가이므로 세력의 은밀한 매집 흐름과 관련이 있을 수 있기 때문에 20일 첫상한가 이후에 상승 추세로 전환될 경우에는 눌림목 구간에서 매수하려는 전문 투자자들이 많다. 이에 반하여 5일 첫상한가는 5일 이전에 이미 한번 이상 상한가가 발생한 다음에 또 다시 상한가에 진입한 상태이므로 짧은 기간 안에 강력한 시세 분출 가능성이 높다. 특히 테마주나 급등주는 다단계 계단 상승을 위해서 상승 초입 구간에서 [5일 첫상한가]에서 매집 단계를 거친 후에 2차 급등 패턴이 자주 보인다.
상한가는 말 그대로 가격 제한 상승폭까지 오른 종목을 가리키는 만큼 강력한 시세를 반영한다고 볼 수 있다. 하지만 상한가에 진입한 종목이 모두 급등하는 것은 아니고 극히 일부 종목만 연속해서 급등하기 때문에 어설프게 상한가 종목을 매수했다가는 잦은 손실로 3개월도 안 걸려 깡통을 찰 것이다. 그래서 상한가 매수의 위험 부담을 줄이면서 동시에 강력한 시세 분출 가능성이 있는 종목에 접근하기 위해서는 상한가 이후에 발생하는 눌림목에서 매수하는 [상한가 눌림목] 기법이 있는데 [상한가 눌림목] 중에서도 상대적으로 가격과 기간 조정을 충분히 받은 첫 번째 상한가 이후에 나타나는 눌림목은 세력주 전문 투자자들의 단골 메뉴나 마찬가지다.
일반적으로 급등주는 빨리 크게 오른 종목을 가리키지만 세력주 관점에서 급등주란 연속 상한가로 오르는 종목을 의미한다. 세력성 급등주는 조정 구간이 짧고 조정 이후에는 또 다시 상한가로 상승하는 경우가 많아서 연속 상한가가 풀리는 구간이 눌림목의 역할을 하기 때문에 이 때 매수해야 한다. 이와 같이 연속 상한가로 급등하던 종목이 상한가가 풀릴 때를 [급등주 눌림목]이라고 한다. 급등주 눌림목 매매기법은 경험이 풍부한 노련한 전문 투자자들도 종종 실패할 정도로 굉장히 위험하고 어려운 방법이므로 여기서는 자세하게 다루지 않겠다. 다만 급등주 전문 투자자들을 위해서 [세력주 검색기]에서는 급등주 눌림목을 찾을 수 있도록 지원하고 있다. [세력주 검색기]는 [5일선 눌림목]과 [20일선 눌림목] 검색 기능을 지원하고 있는데 앞서 [눌림목 투자 기법]에서 충분히 설명하였기 때문에 [세력주 검색기]와 관련해서는 따로 설명하지 않겠다. 이 밖에도 [세력주 검색기]에는 다양한 기능을 제공하고 있는데 보다 자세한 것은 부록을 제공하는 소스 코드를 참조하기 바란다.

5/20일 첫상한가

2009년 8월 17일

상한가 눌림목

2009년 8월 19일

며칠 뒤 결과

신종

플루

테마

5일

*중앙백신

눌림목없이 급등

첫날부터 연속 상한가로 급등

20일

첫상

한가

파루

강한눌림목

눌림목 완성 후에 연속 상한가 급등

씨티씨바이오

제일바이오

테마주 후발주라서 눌림목 완성 후에 급등하지 못하고 단타성 급등락 반복

이-글 벳

대성미생물

강한눌림목

눌림목에서 상승하지 못하고 빠르게 하락

5일

*대한뉴팜

20일

첫상

한가

팜스웰바이오

약한눌림목

5일선 밑에서 눌림목 완성 (매수 세력 약함)

보령제약

X

*엔빅스

강약눌림목

강약(상한+음봉) 후에 연속 상한 급등

– 처음으로 백신 방역 테마에 진입 효과

어울림 네트, 이니텍, 체시스

X

상승없이 하락

X

파브코

눌림목

8월14일 첫상한가, 거래 부족 소외주

6 첫상한가와 상한가 눌림목

[표6 첫상한가와 상한가 눌림목]은 2009년 8월 17일 발생한 [5/20일 첫상한가]를 중심으로 이후에 나타나는 [상한가 눌림목]과의 연속성을 정리한 것이다. 17일 발생한 첫상한가 중에서 절반 이상은 [신종플루] 테마와 관련이 있는데 테마를 중심으로 첫상한가에 진입한 종목들은 2~3일 이내에 대부분 [상한가 눌림목]을 완성한 후에 2차 급등한 데 반하여 17일 첫상한가에 진입했어도 눌림목이 없거나 너무 약해서 상승하지 않은 종목들도 있다. 또한 신종플루라는 동일한 테마로 첫상한가에 진입했어도 [파루, 씨티씨바이오]처럼 강하게 눌림목을 형성한 이후에 2차로 급등한 종목이 있는가 하면 그렇지 않고 [대성미생물]처럼 약하게 눌림목을 형성한 이후에 짧게 상승을 마감한 종목도 있다. 이러한 차이는 상승에 가담한 세력의 힘의 차이로 해석할 수 있는데 개별적인 종목보다는 테마주에 매수 에너지가 강하기 때문이다. 또한 차트에서는 해석할 수 없는 차트 넘어서 심리분석적인 요인이 크게 작용하였다. 과거 [중앙백신]는 조류 독감 테마를 이끌면서 수백 % 급등했던 전력이 있었기 때문에 그것을 기억하고 있던 수많은 테마주 사냥꾼들이 조류 독감 백신 테마에 대한 학습 효과를 노리고 집단적으로 가담하면서 대장주로 발전한 것이다. 하지만 [대한뉴팜]은 오래 전부터 자원개발 테마로 갈라져서 수백 % 급등한 뒤로 조류 독감 테마와는 연동성이 떨어진 종목이라서 신종플루 테마에서는 그다지 강력한 흐름을 보이지 못했다. 마찬가지로 [제일바이오, 이-글벳]은 과거 조류 독감 때부터 대장주를 따라다니는 후발주로만 움직였기에 이번에도 여전히 신종플루 대장주인 [중앙백신]를 매수하지 못한 동호회가 뒤늦게 추격매수하면서 테마에 합류한 것으로 보인다. 한편 [엔빅스]는 과거 바이오 테마주가 급등할 때 뒤늦게 바이오 테마에 합류하면서 수백 % 급등했었고 조류 독감과는 거리가 멀었던 종목이지만 신종플루 테마가 급등할 때 플루 진단 키트 재료를 터트리면서 새롭게 진입한 종목이다.
이와 같이 boolhts로 구현한 [세력주 검색기]에 찾은 첫상한가와 눌림목을 살펴보았는데 기술적 분석은 정치, 경제, 사회적으로 이슈와 맞물리기도 하지만 과거 2~3년 흐름까지도 심리적으로 반영되기 때문에 차트만 가지고는 미래를 예측할 수가 없으므로 수년간 시장에 반영된 심리까지 읽어내야 한다. 또한 때로는 과거 패턴보다는 오늘 당장의 뉴스와 재료가 더 큰 위력을 발휘하기 때문에 차트분석 그 자체만으로는 한계가 많다.

그림 7 상한가 눌림목

[소스 리스트1 세력주 검색용 정보 생성]
p_mopa_r = p_mopa_avg->find_day(workdate);
p_mopa_c = p_mopa_avg->find_cross520(p_mopa_avg->get_head(), p_mopa_r); // 5+20일 크스를 찾는다.
if(p_mopa_c != nnull) { // 크로스 없음
p_day->calc_highlow(p_mopa_c->data.time, p_mopa_r->data.time, &highval, &lowval);
if(p_mopa_r->data.avg_5 > p_mopa_r->data.avg_20) { // 정배열
p_pre_c->value.pre_cross520_bound = highval;
}
else { // 역배열
p_pre_c->value.pre_cross520_bound = lowval;
}
}
if(get_avg(p_day_f, &avgamount, 5, ffalse) == ttrue) {
p_pre_c->value.avgamount5 = avgamount;// 5일 평균거래량
}
if(get_avg(p_day_f, &avgamount, 20, ffalse) == ttrue) {
p_pre_c->value.avgamount20 = avgamount;// 20일 평균거래량
}
import_predata_dayavg5(&p_pre_c->value, p_day_f, p_mopa_f);
p_lastup = p_day->find_lastupmax(p_day_f); // 직전 상한가
if(p_lastup != nnull) {
p_pre_c->value.pre_upmax.day = 1 + (p_day->find_recorder(p_day_f) – p_day->find_recorder(p_lastup));
p_pre_c->value.pre_upmax.val = p_lastup->value.pri.endval;
if(p_lastup == p_day_f) {
p_pre_c->value.series_maxnum = p_day->count_maxseries(p_day_f, ttrue);
}
}
p_pre_c->value.non_minuscandle_35d = p_day->count_nonminuscandle(predata_non_miniscandle_range);
p_day->count_pluscandle_n_ratesum(predata_pluscandle_range, p_day_f,
&p_pre_c->value.pluscandle_25d, &p_pre_c->value.ratesum_25d); // 25일간 (양봉수, 상승율합)

[소스 리스트2 세력주 필터링]
if(is_nowfxin_updown_upmax(p_nowfxin_w) == ttrue) { // 상한가
if(predata_yes.series_maxnum >= 1) {
this->m_nowanal.num_upmax_series++;// 연속상한가
}
// 첫상한가 처리
if(predata_yes.pre_upmax.day > 20) { // 20일첫상한가
if(calc_rate(predata_yes.pre_cross520.val,
(p_link->value.fixvalue.pri.endval – predata_yes.pre_cross520.val)) <= upmax_20day_precross_gab) {
this->m_nowanal.num_upmax_20day++;// 20일첫상한가-5일첫상한가는 빠짐
}
}
else if((predata_yes.pre_upmax.day == 0) || // 오늘 첫상한가
(predata_yes.pre_upmax.day > 5)) {
if(calc_rate(predata_yes.pre_cross520.val,
(p_link->value.fixvalue.pri.endval – predata_yes.pre_cross520.val)) <= upmax_5day_precross_gab) {
this->m_nowanal.num_upmax_5day++; // 5일첫상한가(직전크로스에서 35%이내만)
}
}
}
else {
if(is_nowlink_upmax_pause(p_link_yesday, p_link) == ttrue) {
this->m_nowanal.num_upmax_pause++; // 상한가눌림목
}
}
if(is_nowfxin_kangyak_second(p_nowfxin_w) == ttrue) {
if(is_nowlink_kangyak_strong(&predata_yes, p_link) == ttrue) {
this->m_nowanal.num_kangyakcandle++; // 강약패턴
}
if(is_nowfxin_rocketpause(p_nowfxin_w, &predata_yes) == ttrue) {
this->m_nowanal.num_rocket_pause1++; // 급등주눌림목
}
}

 

 


주식투자 프로그래밍(시스템 트레이딩)

이 글은 필자가 2005 ~ 2007년 개발했던 내용을 2009.10 ~ 2010.1 (월간) [마이크로소프트웨어]에 투고했던 내용을 정리해서 올린 것입니다.

  • 당시 가격제한폭(상한가/하한가)는 15% 적용(새로 고쳐야 함)

  • 소스코드 모두 제공

  • 실제 매매 가능

차례


1. 주식투자 프로그래밍(시스템 트레이딩)

1.1주식투자 프로그래밍(시스템 트레이딩) 

1.2 #. HTS와 시스템트레이딩

1.3 #. HTS 종속 시스템트레이딩

1.4 #. 범용 프로그램 언어 시스템트레이딩

1.5 #. 대신증권 [CYBOS PLUS]

1.6 #. 종목 리스트 다운로드

1.7 #. 현재 가격 시세 구하기


2. 주식투자 프로그래밍(시스템 트레이딩)

2.1 주식투자 프로그래밍(시스템 트레이딩)

2.2 #. 주식투자기법

2.3 #. 급등주와 테마주

2.4 #. 눌림목 투자 기법

2.5 #. 기술을 넘어서 심리분석

2.6 #. 캔들 프로그래밍

2.7 #. 세력주 검색 프로그래밍

2.8 다음에는 …


3. 주식투자 프로그래밍(시스템 트레이딩)

3.1 #. 초소형 미니 HTS와 모의투자

3.2 #. 모의투자 시스템

3.3 #. Boolhts 구조와 설계

3.4 #. 사이보스플러스 이벤트 처리기

3.5 #. 종목 선택창 만들기

3.6 #. 호가창 만들기

3.7 #. 체결창 만들기

3.8 #. 계정 로그인

3.9 #. 예수금 조회

3.10 #. 주문과 조회 처리

3.11 #. 매수와 매도 주문

3.12 #. 체결/미체결 잔고조회

3.13 #. 정정과 취소 주문

3.14 #. 주문 이벤트 핸들러

3.15 #. 통합 주문처리기


4. 주식투자 프로그래밍(시스템 트레이딩)

4.1 #. 금융공학과 상한가 따라잡기

4.2 #. 수학적 금융공학

4.3 #. 전산 금융공학 – 알람펀드

4.4 #. 전산 금융공학 – 스피드 트레이딩

4.5 #. 차익 시스템트레이딩

4.6 #. 확률 시스템트레이딩

4.7 #. 개별 종목 확률 시스템트레이딩

4.8 #. 상한가 따라잡기

4.9 #. 상한가 전화기

4.10 #. 특수 상한가 전화기

4.11 #. 멀티 상한가 전화기

4.12 다음에는 …


5. 주식투자 프로그래밍(시스템 트레이딩)

5.1 #. 주식 투자 트위터

5.2 #. 트위티언(Twittian) or 원시인

5.3 #. Open API 혁명, 트위터 (Twitter)

5.4 #. 한글트위터 twtkr.com

5.5 #. 주식 뉴스 발송 트위터

5.6 #. 주가 정보 발송 트위터

5.7 #. 주가 차트 등록 트위터

5.8 #. 트위터 이미지를 본문에 포함시기키

5.9 #. 대한민국 증권사에 바란다.

5.10 #. 모바일 혁명의 배후, KT에 바란다.

5.11 #. 연재를 마감하면서……


boolhts 소스코드(source code) 1 부 다운로드

boolhts 소스코드(source code) 2 부 다운로드

boolhts 소스코드(source code) 3 부 다운로드

boolhts 소스코드(source code) 4 부 다운로드

[boolhts 소스코드(source code) 5 부] 따로 없음

boolhts 통합 소스코드(source code) 다운로드(준비 중)


 

 

 

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Time limit is exhausted. Please reload CAPTCHA.