본문 바로가기

주식투자

python pandas 를 이용하여 이동평균선 계산

지난 포스팅에서 가져온 일봉/주봉 데이터를 이용하여 이동평균선을 계산해볼 수 있다.

 

 

[퀀트투자] 네이버 증권에서 일봉, 주봉 데이터 가져오기

이전 포스팅에서 pandas_datareader 를 이용하여 일봉 데이터를 조회하는 방법을 알아보았다. 이번에는 naver 의 url 을 이용하여 일봉과 주봉 데이터를 가져와서 parsing 하는 방법을 알아보려고 한다. xm

dkgkim.tistory.com

 

import requests
import pandas
from ast import literal_eval

code = "035720"

response = requests.get(f"https://api.finance.naver.com/siseJson.naver?symbol={code}&requestType=0&count=50&timeframe=day")
response_data = literal_eval(response.text.strip())
price_data = pandas.DataFrame(response_data[1:], columns=response_data[0])
price_data.index = price_data["날짜"]
price_data = price_data[["시가", "고가", "저가", "종가", "거래량"]]

결과

              시가      고가      저가      종가      거래량
날짜                                               
20211201  121500  123500  121000  122500  1482581
20211202  121500  123000  120000  122500  2028101
20211203  122000  124000  121500  123500  1488902
20211206  122500  122500  120500  121000  1477396
20211207  121500  122000  120000  120500  1218740
20211208  121500  123500  120500  121000  2288195
20211209  120500  122500  120000  122500  2338843
20211210  122000  122500  121000  122500   974383
20211213  123000  123000  120000  120000  1405089
...
20220127   87000   87500   82600   82600  3793749
20220128   82800   85600   82200   85000  2958280
20220203   87100   88300   85100   85100  3118696
20220204   85100   87500   84500   87100  1870626
20220207   87300   88000   85000   88000  2224116
20220208   88000   89200   86000   86500  2030457
20220209   86900   87300   85700   86100  1640629
20220210   86900   89400   86000   87300  3401352
20220211   87300   93600   85300   91700  7012496
20220214   90300   90800   87500   88800  3977340

 

이렇게 데이터를 조회해 왔다면, 한줄만 추가해주면 이동평균선을 구할 수 있다.

 

price_data["ma20"] = price_data["종가"].rolling(window=20).mean()

결과

              시가      고가      저가      종가      거래량      ma20
날짜                                                         
20211201  121500  123500  121000  122500  1482581       NaN
20211202  121500  123000  120000  122500  2028101       NaN
20211203  122000  124000  121500  123500  1488902       NaN
20211206  122500  122500  120500  121000  1477396       NaN
20211207  121500  122000  120000  120500  1218740       NaN
20211208  121500  123500  120500  121000  2288195       NaN
20211209  120500  122500  120000  122500  2338843       NaN
20211210  122000  122500  121000  122500   974383       NaN
20211213  123000  123000  120000  120000  1405089       NaN
20211214  118500  119000  117000  118500  1718411       NaN
...
20220127   87000   87500   82600   82600  3793749   96495.0
20220128   82800   85600   82200   85000  2958280   95120.0
20220203   87100   88300   85100   85100  3118696   93650.0
20220204   85100   87500   84500   87100  1870626   92430.0
20220207   87300   88000   85000   88000  2224116   91555.0
20220208   88000   89200   86000   86500  2030457   90880.0
20220209   86900   87300   85700   86100  1640629   90185.0
20220210   86900   89400   86000   87300  3401352   89720.0
20220211   87300   93600   85300   91700  7012496   89555.0
20220214   90300   90800   87500   88800  3977340   89135.0

 

pandas 에서 제공하는 rolling() mean() 함수를 이용하는 방법이다. rolling 함수의 window 파라미터는 데이터를 몇개의 데이터에 대한 계산을 수행할지에 대한 파라미터 이다. window=20 으로 설정하였고 mean() 함수를 호출하였으니, 20일 이동평균값을 구하는 것이다. 이렇게 해서 구해진 평균은 단순 이동평균값이다. 

 

만약 지수 이동평균을 구하고싶다면, 다른 함수를 사용하면 쉽게 구할 수 있다.

 

price_data["ma20"] = price_data["종가"].ewm(span=20).mean()

 

결과 

              시가      고가      저가      종가      거래량           ma20
날짜                                                              
20211201  121500  123500  121000  122500  1482581  122500.000000
20211202  121500  123000  120000  122500  2028101  122500.000000
20211203  122000  124000  121500  123500  1488902  122867.194005
20211206  122500  122500  120500  121000  1477396  122328.163965
20211207  121500  122000  120000  120500  1218740  121885.946659
20211208  121500  123500  120500  121000  2288195  121699.052382
20211209  120500  122500  120000  122500  2338843  121850.491752
20211210  122000  122500  121000  122500   974383  121962.762516
20211213  123000  123000  120000  120000  1405089  121647.925811
20211214  118500  119000  117000  118500  1718411  121173.875460
...
20220127   87000   87500   82600   82600  3793749   95267.324499
20220128   82800   85600   82200   85000  2958280   94274.650438
20220203   87100   88300   85100   85100  3118696   93388.898887
20220204   85100   87500   84500   87100  1870626   92782.538936
20220207   87300   88000   85000   88000  2224116   92321.961665
20220208   88000   89200   86000   86500  2030457   91761.880858
20220209   86900   87300   85700   86100  1640629   91217.724230
20220210   86900   89400   86000   87300  3401352   90841.523981
20220211   87300   93600   85300   91700  7012496   90923.894478
20220214   90300   90800   87500   88800  3977340   90720.252398

단순 이동평균을 구하는 것과 크게 다르지 않다. rolling() 을 호출 했던 것을 ewm() 으로 변경하였고, 기간을 window 로 주던 것을 span 으로 파라미터 이름을 변경해주어야 한다. span=20 으로 설정하였기 때문에 결과는 20일 지수 이동평균값이 된다.

 

pandas 에 정의된 함수들을 잘 활용하면, 주식 차트에서 활용하는 다른 지표들도 어렵지 않게 계산할 수 있다. 계산방법은 검색해보면 많지만 다 필요한 것은 아니다. 어떤 지표와 기준으로 종목을 찾을지에 대한 것이 더 중요하다고 생각된다.

주식은 어차피 예측가능한 부분이 아니기 때문에 어떤 공식을 사용하더라고 100% 정답을 맞출수는 없을 것이다. 하지만 투자를 하는데 있어서 퀀트투자를 활용하는 것은 성공확률을 높일 수 있는 방법이 되지 않을까 생각된다.