AUTO TRADE/Back test

키움증권 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

 

 


728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.