#004 pykrx 주식정보 활용(2) : Python, PostgreSQL
2020년쯤 주식을 다시 시작하면서 DART의 OPEN API를 이용하여 기업의 재무정보를 가져오고 부족한 정보는 네이버에서 스크래핑으로 가져와서 DB를 만들고 '마법공식', '신마법공식'이니 하면서 나름 데이터에 기반한 기계적인 트레이딩을 시도한 적이 있습니다.
그때는 코로나 이후 유동성으로 마구 올라가던 시장이라서 시장수익률에 미치지 못하는 결과에 중단했던 적이 있습니다. 그만큼 장기투자나 퀀트투자는 힘든 작업인 것 같습니다. 가장 힘든 게 마음을 다스리는 것이겠지요.
이번 pykrx 정보를 이용하려는 것은 단기적인 관점입니다. 어느 종목으로 수급이 몰리고, 어떤 종목이 수급에 비해 올라가지 않고 눌리고 있는지 등을 알아보고 투자할 종목을 찾아보려는 단기 트레이딩 관점입니다. 현인들이 이야기하는 좋은 기업에 장기투자하라는 조언과는 거리가 먼 방법이겠지요. 이점을 고려하시고 봐주시기 바랍니다.
지난 포스팅을 안 보신 분들은 먼저 보고 오시기를 추천드립니다.
2023.03.20 - [IT/파이썬 실전 (Python)] - #002 pykrx 주식 종목 정보 가져오기 : Python, PostgreSQL
#002 pykrx 주식 종목 정보 가져오기 : Python, PostgreSQL
#002 pykrx 주식 종목 정보 가져오기 : Python, postgreSQL 이번 포스팅은 파이썬으로 pykrx 라이브러리를 통해 주식 종목 정보를 가져와서 db에 저장하는 내용이다. 지난 포스팅에 키움 api 연결을 위해 파
doitsql.tistory.com
2023.03.25 - [IT/파이썬 실전 (Python)] - #003 pykrx 주식정보 활용(1) : Python, PostgreSQL
#003 pykrx 주식정보 활용(1) : Python, PostgreSQL
#003 pykrx 주식정보 활용(1) : Python, PostgreSQL 지난 포스팅에 pykrx 주식 종목정보를 가져와서 테이블에 저장하는 파이썬 프로그램을 소개했다. pykrx를 가져오는 방법, 라이브러리 설치 등은 지난 포스
doitsql.tistory.com
pykrx 정보 가져오는 배치 프로그램
하나의 파이썬 프로그램으로 작성했습니다.
초기적재 및 월요일부터 당일 데이터를 적재해 본 결과 오류는 없습니다.
코드가 2000라인 정도 되지만 어려운 부분은 없습니다.
843 라인을 보면, 일 배치 형태로 변수가 세팅되어 있는데 초기적재 시에는 막고 아래에 있는 변수를 풀고 원하는 날짜를 입력해서 실행하면 됩니다,
# 변수
s_date = date.today()
e_date = date.today()
# 초기적재
# s_date = datetime.date(2022, 9, 1)
# e_date = datetime.date(2023, 3, 22)
스크롤 압박으로 파일을 첨부합니다.
vacuum 작업
pykrx의 자료 중에 '투자자별 순매수 정보'가 한 번에 가져올 수 없는 구조라서 배치 수행 시에 update가 많이 일어납니다. update가 되면 기존 자료에 표시를 하고 새로운 자료가 insert 되는 구조입니다. 모든 dbms의 특징이라고 볼 수 있습니다.
vacuum작업은 다른 dbms의 reorg 작업과 같다고 이해하시면 됩니다.
auto vacuum을 설정하는 방법도 있지만 여러 사람이 사용하는 db가 아니라서 수동으로 정기적으로 해 주시면 됩니다.
4가지 방법 중 'DB 전체 full vacuum'을 해 주시면 됩니다. 시간은 1~2분 정도 걸립니다.
-- DB 전체 full vacuum
vacuum full analyze;
-- DB 전체 간단하게 실행
vacuum verbose analyze;
-- 해당 테이블만 간단하게 실행
vacuum analyze net_purchase;
-- 특정 테이블만 full vacuum
vacuum full net_purchase;
함수 생성
데이터 적재 후, from ~ to 종가와 등락률을 보고 싶다는 요구가 있어서 함수를 하나 만들었습니다.
SQL 문 한번 실행하시면 함수 만들어집니다.
-- 종가 조회
CREATE OR REPLACE FUNCTION public.inq_close(p_ticker char(6), p_std_date date, OUT p_close bigint)
RETURNS SETOF bigint
LANGUAGE sql
AS $function$
select close
from market_cap
where ticker = $1
and std_date = $2;
$function$
;
COMMENT ON FUNCTION public.inq_close IS '종가 조회';
활용 sql
데이터 적재가 완료되었으면 데이터를 조회해 볼 차례입니다.
3/20 ~ 3/24 사이에 외인_기관이 많이 순매수한 종목을 시가총액 대비 비율로 조회한 것입니다.
등락률은 시작일자와 종료일자 종가 사이의 등락률이니 감안하고 보시기 바랍니다.
추출된 종목에 대한 세부 점검은 꼭 필요한 절차입니다.
이러한 방법으로 투자 힌트를 찾아보겠다는 시도이니 참고만 하시기 바랍니다.
-- 순매수 순위
select a.ticker as 종목코드
, a.ticker_name as 종목명
, inq_close(a.ticker, min(b.std_date))
as from_종가
, inq_close(a.ticker, max(b.std_date))
as to_종가
, round(
(inq_close(a.ticker, max(b.std_date))
- inq_close(a.ticker, min(b.std_date))
) * 100. / inq_close(a.ticker, min(b.std_date))
, 2) as 등락률
, avg(b.cap) as 시가총액
, sum(c.fore_m) as 외인금액
, round(sum(c.fore_m) / avg(b.cap) * 100, 4)
as 외인차지비율
, sum(c.orgt_m) as 기관금액
, round(sum(c.orgt_m) / avg(b.cap) * 100, 4)
as 기관차지비율
, sum(c.fore_m + c.orgt_m)
as 외인_기관금액
, round(sum(c.fore_m + c.orgt_m) / avg(b.cap) * 100, 4)
as 외인_기관차지비율
, sum(c.pens_m) as 연기금금액
, round(sum(c.pens_m) / avg(b.cap) * 100, 4)
as 연기금차지비율
from ticker a -- 종목
, market_cap b -- 시가총액
, net_purchase c -- 투자자별 순매수
where a.ticker = b.ticker
and b.ticker = c.ticker
and b.std_date = c.std_date
-- and a.market = 'KOSPI'
and a.market = 'KOSDAQ'
and b.std_date between '2023-03-20' and '2023-03-24'
group by a.ticker
order by 외인_기관차지비율 desc
-- order by 외인차지비율 desc
-- order by 기관차지비율 desc
-- order by 연기금차지비율 desc
limit 100
;
▶ 결과
실제로 8개의 테이블 중에 3개의 테이블만 사용되었네요.
나머지 테이블도 어떻게 활용할지는 고민 중입니다.
이제 화면을 만들어 달라고 하는데 우선은 SQL로 수행 중입니다. 솔직히 파이썬 PYQT는 잘 몰라서 다시 배워야 합니다. 얼마나 걸릴지도 모르겠고요. 화면 프로그램은 기약이 없습니다.
감사합니다.
Do it! SQL을 찾아 주셔서 감사합니다. ♥ 댓글이 큰 힘이 됩니다. |
'IT > 파이썬 실전 (Python)' 카테고리의 다른 글
#003 pykrx 주식정보 활용(1) : Python, PostgreSQL (86) | 2023.03.25 |
---|---|
#002 pykrx 주식 종목 정보 가져오기 : Python, PostgreSQL (130) | 2023.03.20 |
#001 키움 API 환경 - 아나콘다 32bit 가상환경 만들기 (40) | 2023.03.18 |
댓글