/StockToolsPreview

C# 기반 주식 데이터 수집 및 전략 백테스팅 시스템

MIT LicenseMIT

StockToolsPreview


Made by DevTae

This is the repository that summarizes about my own project named DevTae/StockTools



Technical Contents

StockDatabase Project

Saving about 2367 stocks and 9,952,847 daily datas in File-System database

  • I have saved about a lot of stock datas in File-System database from Korea market (KOSPI, KOSDAQ) until 2023/02/17.
    • There are so many informations as like Stock Price, Volume, Adjusted Stock Price, MarketCap in each daily data.
    • Below this, that is the structure of class diagram.
    • Example code is here
📦Stock
 ┣ 📂StockInfo             // 종목에 대한 정보가 담겨 있음.
 ┃ ┣ 📂Market
 ┃ ┃ ┣ 📜Country           // ex. "한국주식(키움)", ...
 ┃ ┃ ┣ 📜Code              // ex. 0, 1, 2, ...
 ┃ ┃ ┣ 📜Name              // ex. "코스피", "코스닥", ...
 ┃ ┃ ┗ 📜Index             // Static Variable 에 있는 Country 배열의 Index
 ┃ ┣ 📜Code                // ex. "005930"
 ┃ ┣ 📜Name                // ex. "삼성전자"
 ┃ ┣ 📜DebutedDate         // ex. "20190301" (상장일)
 ┃ ┗ 📜ActiveSharesRatio   // ex. 60.5 (유통비율)
 ┣ 📂PriceData
 ┃ ┣ 📂DailyData
 ┃ ┃ ┣ 📜Date
 ┃ ┃ ┣ 📜Open              // 시가
 ┃ ┃ ┣ 📜AdjustedOpen      // 시가 수정주가
 ┃ ┃ ┣ 📜High              // 고가
 ┃ ┃ ┣ 📜AdjustedHigh      // 고가 수정주가
 ┃ ┃ ┣ 📜Low               // 저가
 ┃ ┃ ┣ 📜AdjustedLow       // 저가 수정주가
 ┃ ┃ ┣ 📜Close             // 종가
 ┃ ┃ ┣ 📜AdjustedClose     // 종가 수정주가
 ┃ ┃ ┣ 📜Volume            // 거래량
 ┃ ┃ ┣ 📜AdjustedVolume    // 수정 거래량
 ┃ ┃ ┣ 📜Shares            // 상장 주식 수
 ┃ ┃ ┣ 📜MarketCap         // 시가총액
 ┃ ┃ ┣ 📜AdjustedEvent     // 수정주가 이벤트 발생 코드 (in Kiwoom API docs)
 ┃ ┃ ┣ 📜AdjustedRatio     // 수정주가 변동 비율
 ┃ ┃ ┗ 📜CheckAdjusted     // 수정주가 변동 여부 확인 column
 ┃ ┗ 📂WeeklyData
 ┣ 📜LastUpdatedDate       // 마지막 업데이트 날짜
 ┣ 📜LastAdjustedDate      // 마지막 수정주가 변동 날짜
 ┗ 📜LastAdjustedIndex     // 마지막 수정주가 변동 index

preview2


Saving of 72% previous processing time in calculating indicator named Leading Span of Ichimoku about a data set of 10 million

There are two ways to get the Maximum and Minimum Value in Specific Range to calculate the Leading Span of Ichimoku (n : a number of all daily datas contained every stocks)

  • Calculate the Maximum and Minimum value using the Linear way

    • Whenever the index is changed, try to get a maximum and minimum value calculating every 52 elements
    • It would be needed the time Θ(52 * n) to calculate all daily datas on each stock
  • Calculate the Maximum and Minimum value using the Segment Tree Algorithm

    • Before calculating, make a Segment Tree (it needs Θ(n * log(n)))
    • Whenever the index is changed, try to get a maximum and minimum value using Segment Tree
    • It would be needed the time Θ(log(n) * n) to calculate all daily datas on each stock
  • Θ(52 * n) vs Θ(log(n) * n)

    • I estimated that n is the average of having daily datas on each stock
    • n = 9,952,847 daily datas / 2367 stocks = 4204
    • Θ(52 * n) = 218,608 vs Θ(log(n) * n) = 50,448
    • The winner is the Θ(log(n) * n)

While developing the logic, I applied the Segment Tree Algorithm.

As a result, I made a saving of 72% previous processing time about a data set of 10 million. (You could see the detailed process in here)

result_capture



StockBacktester Project

Using Delegate Pattern on Searching Stocks using Conditional Functions

  • Below codes are the examples of searching condition function

    // it will return true, when "20 SMA crosses up 60 SMA" using simple moving average "while remaining convergence"
    public static bool IsCrossUpCandle(ref DailyData[] dailyDatas, ref Indicator[] indicators, int start_index, int index)
    {
      if(index <= 0) return false;
    
      if(index - start_index < 5) return false;
    
      // 1. 20 SMA < 60 SMA * 1.05
      float SMA20, SMA60;
      if(float.TryParse(indicators[index].Values[(int)IndicatorDailyCode.SMA20], out SMA20)
      && float.TryParse(indicators[index].Values[(int)IndicatorDailyCode.SMA60], out SMA60)) {
        if(SMA20 < SMA60 * 1.05) {
          // 2. pivot close CrossUp
          float close_p = float.Parse(dailyDatas[start_index].AdjustedClose);
          float close_0 = float.Parse(dailyDatas[index].AdjustedClose);
          float close_1 = float.Parse(dailyDatas[index - 1].AdjustedClose);
          if(close_0 > close_p && close_1 < close_p) {
            return true;
          }
        }
      }
      return false;
    }
  • I used delegate variable for reducing code complexity when I needed to use a lot of conditional functions.

    public delegate bool CondFunc(ref DailyData[] dailyDatas, ref Indicator[] indicators, int point_index2, int index);
    ...
    // select condFunc using switch operation and so on
    CondFunc condFunc = IsCrossUpCandle;
    ...
    // get daily datas and indicator of stocks
    bool result = this.condFunc(ref dailyDatas, ref indicators, 5, 0);
    ...
    // search and analyze results ...
    ...

Using these backtesting datas to make own buying/selling strategy

  • It could be totally possible to analyze the price patterns of stock using this program with backtesting results.
    • Until now, I have studied and analyzed so many stocks and price patterns using this program
    • Moreover, I tried to analyze the stock price using Deep Learning Model.

stock-analysis-archive



Screenshots in 'StockDatabase' and 'StockBacktester' Project

  • Update the daily datas automatically from Kiwoom API and Naver Finance in asynchronous way

updatedailydata


  • Backtesting Simulation with many buying/selling strategy as like SMA Golden-Cross Signal (on the bottom right)

backtest


  • Showing the chart of searched backtesting results with many indicators like trendlines, theme clusters

viewthechart

21 12 28 모아텍 자동패턴분석



Information about Source Distribution

  • The source code of this project is saved on private repository, because I worried about the misusing some strategies in this project to their buying / selling decision.

  • Whenever if you have any questions for this project, contact me for anything using email.



The End

Thank you for reading!