키움증권 Open API - 차트 데이터 함수 수정
지난 포스팅에서 백테스팅 절차에 대한 코드를 제작했었고 데이터를 저장하는 과정에 있어서 발생한 오류를 곧바로 수정하겠다고 했었다. 따라서 이번 포스팅에서는 클래스를 초기화하는 방법에 대해 살펴보고자 한다.
무슨 문제에요?
종목코드: 001210
저장일자: 20210608
최신일자: 20210702
종목코드: 001210 데이터가 구식 데이터입니다.
date open high low close volume trade_volume
0 20210702 3280 3295 3220 3245 56122 183
1 20210701 3255 3280 3200 3280 98289 318
2 20210630 3305 3335 3165 3260 192283 621
3 20210629 3375 3375 3305 3310 107630 359
4 20210628 3350 3445 3345 3370 145110 493
... ... ... ... ... ... ... ...
9652 19850109 5752 5752 5722 5722 3320 1
9653 19850108 5843 5879 5692 5843 19092 4
9654 19850107 5540 5843 5540 5843 15260 3
9655 19850105 5225 5540 5207 5540 8439 1
9656 19850104 5238 5238 5238 5238 17 0
[9657 rows x 7 columns]
date open high ... MA20 MA60 MA120
0 19850104 5238 5238 ... NaN NaN NaN
1 19850105 5225 5540 ... NaN NaN NaN
2 19850107 5540 5843 ... NaN NaN NaN
3 19850108 5843 5879 ... NaN NaN NaN
4 19850109 5752 5752 ... NaN NaN NaN
... ... ... ... ... ... ... ...
9652 20210628 3350 3445 ... 3315.75 3008.583333 2883.625000
9653 20210629 3375 3375 ... 3334.00 3019.250000 2884.208333
9654 20210630 3305 3335 ... 3349.50 3029.583333 2884.375000
9655 20210701 3255 3280 ... 3359.75 3040.250000 2884.000000
9656 20210702 3280 3295 ... 3367.00 3050.666667 2883.958333
[9657 rows x 14 columns]
종목코드: 001210 데이터베이스에 저장되었습니다.
001230
종목코드: 001230
저장일자: 20210608
최신일자: 20210702
종목코드: 001230 데이터가 구식 데이터입니다.
date open high low close volume trade_volume
0 20210702 3280 3295 3220 3245 56122 183
1 20210701 3255 3280 3200 3280 98289 318
2 20210630 3305 3335 3165 3260 192283 621
3 20210629 3375 3375 3305 3310 107630 359
4 20210628 3350 3445 3345 3370 145110 493
... ... ... ... ... ... ... ...
18330 19880513 7703 7703 7703 7703 0 0
18331 19880512 7703 7703 7703 7703 0 0
18332 19880511 7336 7336 7336 7336 0 0
18333 19880510 7043 7043 7043 7043 0 0
18334 19880509 6969 6969 6969 6969 0 0
[18335 rows x 7 columns]
date open high ... MA20 MA60 MA120
0 19850104 5238 5238 ... NaN NaN NaN
1 19850105 5225 5540 ... NaN NaN NaN
2 19850107 5540 5843 ... NaN NaN NaN
3 19850108 5843 5879 ... NaN NaN NaN
4 19850109 5752 5752 ... NaN NaN NaN
... ... ... ... ... ... ... ...
18330 20210630 22300 22550 ... 12693.25 12804.250000 12576.041667
18331 20210701 22250 22250 ... 12710.75 13121.250000 12635.625000
18332 20210701 3255 3280 ... 12700.50 12775.916667 12640.958333
18333 20210702 22050 22900 ... 13640.50 12745.916667 12694.708333
18334 20210702 3280 3295 ... 12737.75 12751.416667 12699.916667
[18335 rows x 14 columns]
종목코드: 001230 데이터베이스에 저장되었습니다.
맨 밑에 있는 결과물을 보면 20210702와 20210701이 각각 두 개가 포함되어 있다는 사실을 확인할 수 있다. 하지만 그 값들을 자세히 보면 종목코드 001210의 데이터가 001230의 데이터에 포함되어 있다는 것을 의미한다. 즉, 001210 데이터를 조회할 때 발생했던 결과값들이 남아있고 그대로 001230의 데이터에 함께 포함된다는 것이다. 다시 말해, 데이터를 조회할 때 해당 값이 초기화되지 않아서 이전에 입력했던 값이 그대로 사용된다는 것이다.
일반적으로 class 내부의 def __init__ 안에서 정의된 변수는 해당 class가 호출되었을 때 해당 변수의 값을 초기화시킨 후에 그 아래의 코드를 실행하는 것이 맞다. 하지만 지금은 그 절차가 이루어지지 않고 있는 것이다. 특정 값을 조회하면 조회할수록 값들은 계속해서 누적되어 표시되는 것이다. 따라서 우리는 해당 변수의 값을 초기화할 필요가 있다.
해결방법
이는 어렵지 않게 해결할 수 있다. 기존에는 아래의 두 변수가 class 아래의 def __init__(self)에 정의되어 있었으나, 각각의 변수를 차트 데이터를 요청하는 곳(def rq_chart_data()와 rq_min_chart_data()의 아래)으로 옮기면 된다.
- [일봉 데이터] self.day_data = {'date':[], 'open':[], 'high':[], 'low':[], 'close':[], 'volume':[], 'trade_volume':[]}
- [분봉 데이터] self.min_data = {'date':[], 'open':[], 'high':[], 'low':[], 'close':[], 'volume':[], 'trade_volume':[]}
수정 후의 코드
def rq_chart_data(self, itemcode, date, justify):
self.day_data = {'date':[], 'open':[], 'high':[], 'low':[], 'close':[], 'volume':[], 'trade_volume':[]}
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", itemcode)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "기준일자", date)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", justify)
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "hello", "opt10081", 0, "0101")
self.tr_event_loop = QEventLoop()
self.tr_event_loop.exec_()
time.sleep(request_term)
while self.remained_data == True:
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", itemcode)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "기준일자", date)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", justify)
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "hello", "opt10081", 2, "0101")
self.tr_event_loop = QEventLoop()
self.tr_event_loop.exec_()
time.sleep(request_term)
def rq_min_chart_data(self, itemcode, tic, justify):
self.min_data = {'date':[], 'open':[], 'high':[], 'low':[], 'close':[], 'volume':[], 'trade_volume':[]}
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", itemcode)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "틱범위", tic)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", justify)
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "rqname_opt10080", "opt10080", 0, "0101")
self.tr_event_loop = QEventLoop()
self.tr_event_loop.exec_()
while self.remained_data == True:
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "종목코드", itemcode)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "틱범위", tic)
self.kiwoom.dynamicCall("SetInputValue(QString, QString)", "수정주가구분", justify)
self.kiwoom.dynamicCall("CommRqData(QString, QString, int, QString)", "rqname_opt10080", "opt10080", 2, "0101")
self.tr_event_loop = QEventLoop()
self.tr_event_loop.exec_()
수정 후 결과값 재확인
이제는 일자가 중복되지 않고 각각의 데이터를 대상으로 잘 출력되는 것을 확인할 수 있다.
종목코드: 002710 데이터가 구식 데이터입니다.
date open high low close volume trade_volume
0 20210702 5250 5250 5100 5130 1053102 5441
1 20210701 4900 5100 4830 5060 1361478 6837
2 20210630 4850 4915 4805 4890 198535 966
3 20210629 4925 4940 4780 4815 206184 998
4 20210628 4815 4930 4800 4860 281518 1371
... ... ... ... ... ... ... ...
9652 19850109 700 700 700 700 0 0
9653 19850108 700 700 700 700 0 0
9654 19850107 700 700 700 700 0 0
9655 19850105 700 700 700 700 0 0
9656 19850104 700 700 700 700 0 0
[9657 rows x 7 columns]
date open high ... MA20 MA60 MA120
0 19850104 700 700 ... NaN NaN NaN
1 19850105 700 700 ... NaN NaN NaN
2 19850107 700 700 ... NaN NaN NaN
3 19850108 700 700 ... NaN NaN NaN
4 19850109 700 700 ... NaN NaN NaN
... ... ... ... ... ... ... ...
9652 20210628 4815 4930 ... 4725.50 4897.916667 4914.416667
9653 20210629 4925 4940 ... 4729.75 4897.166667 4906.541667
9654 20210630 4850 4915 ... 4739.25 4897.250000 4900.208333
9655 20210701 4900 5100 ... 4757.00 4904.000000 4894.875000
9656 20210702 5250 5250 ... 4780.25 4909.250000 4891.291667
[9657 rows x 14 columns]
종목코드: 002710 데이터베이스에 저장되었습니다.
002720
종목코드: 002720
저장일자: None
최신일자: 20210702
종목코드: 002720 데이터가 구식 데이터입니다.
date open high low close volume trade_volume
0 20210702 7990 7990 7790 7800 97362 763
1 20210701 7930 7940 7760 7900 134438 1056
2 20210630 7920 7940 7860 7910 128626 1015
3 20210629 7840 8030 7750 7820 270883 2139
4 20210628 7630 7900 7630 7820 347419 2717
... ... ... ... ... ... ... ...
9652 19850109 958 958 958 958 7007 0
9653 19850108 987 987 970 970 19373 1
9654 19850107 961 989 961 989 3050 0
9655 19850105 956 958 956 958 8986 0
9656 19850104 923 923 923 923 0 0
[9657 rows x 7 columns]
date open high low ... MA15 MA20 MA60 MA120
0 19850104 923 923 923 ... NaN NaN NaN NaN
1 19850105 956 958 956 ... NaN NaN NaN NaN
2 19850107 961 989 961 ... NaN NaN NaN NaN
3 19850108 987 987 970 ... NaN NaN NaN NaN
4 19850109 958 958 958 ... NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ...
9652 20210628 7630 7900 7630 ... 7391.333333 7365.5 7420.166667 7992.250000
9653 20210629 7840 8030 7750 ... 7426.666667 7404.5 7426.833333 7979.066667
9654 20210630 7920 7940 7860 ... 7468.666667 7450.5 7437.000000 7962.175000
9655 20210701 7930 7940 7760 ... 7504.666667 7487.0 7449.000000 7944.800000
9656 20210702 7990 7990 7790 ... 7537.333333 7490.0 7455.666667 7928.983333
[9657 rows x 14 columns]
종목코드: 002720 데이터베이스에 저장되었습니다.
002760
종목코드: 002760
저장일자: None
최신일자: 20210702
종목코드: 002760 데이터가 구식 데이터입니다.
date open high low close volume trade_volume
0 20210702 2370 2370 2330 2330 326991 765
1 20210701 2360 2390 2340 2370 316167 745
2 20210630 2345 2385 2345 2360 433494 1024
3 20210629 2325 2350 2310 2345 352292 823
4 20210628 2320 2340 2310 2310 248285 576
... ... ... ... ... ... ... ...
8214 19891205 514 520 504 507 68847 0
8215 19891204 536 536 520 523 134579 1
8216 19891202 533 539 533 536 171651 1
8217 19891201 559 559 559 559 132399 1
8218 19891130 584 584 584 584 40810 0
[8219 rows x 7 columns]
date open high ... MA20 MA60 MA120
0 19891130 584 584 ... NaN NaN NaN
1 19891201 559 559 ... NaN NaN NaN
2 19891202 533 539 ... NaN NaN NaN
3 19891204 536 536 ... NaN NaN NaN
4 19891205 514 520 ... NaN NaN NaN
... ... ... ... ... ... ... ...
8214 20210628 2320 2340 ... 2397.25 2349.916667 2293.958333
8215 20210629 2325 2350 ... 2393.25 2351.083333 2292.750000
8216 20210630 2345 2385 ... 2392.00 2352.916667 2291.208333
8217 20210701 2360 2390 ... 2387.50 2355.666667 2289.875000
8218 20210702 2370 2370 ... 2380.25 2357.083333 2288.708333
'AUTO TRADE > Back test' 카테고리의 다른 글
백테스팅 구축 (4) - 일자별 차트 데이터 불러오기 (0) | 2021.07.04 |
---|---|
백테스팅 구축 (3) - 일자 계산하기 (0) | 2021.07.04 |
백테스팅 구축 - (2) 차트 데이터 가공하기 (0) | 2021.07.03 |
백테스팅 구축 - (1) 일자 변수 처리 및 차트 데이터 조회 (0) | 2021.07.03 |
백테스팅 전략 수립 시 주의사항 (0) | 2021.06.16 |
소중한 공감 감사합니다