flask로 만든 주가 차트 배달 서버

소개



주가의 시계열 데이터가 들어있는 csv 파일이 있다면 mplfinance를 사용하면 파이썬이 실행되는 환경에서 주가 차트를 쉽게 표시 할 수 있습니다. 이 주가 차트를 웹 브라우저에서 언제든지 볼 수 있도록 하는 것이 본고의 취지입니다.

사용하는 것은 python, mplfinance, flask에서 이것들을 정리하고 docker-compose로 바삭하게 움직입니다.

실행 환경



디렉토리 구성
working_dir/
    Dockerfile
    docker-compose.yml
    opt/
        flask_chart.py
        share/
            data/
                1000/
                    1001.csv
                    1002.csv
                    ...
                2000/
                ...
                9000/
                    9001.csv
                    ...

data/디렉토리 안에, 1000/~ 9000/의 서브 디렉토리를 잘라 그 안에, 「증권 코드.csv」라고 하는 이름의 주가 일족 시계열 데이터가 놓여져 있는 것으로 합니다.

주가 일족 시계열 데이터의 csv 파일의 예는 다음과 같습니다.

1301.csv
2015/01/05,275,277,274,275,239000000
2015/01/06,274,275,270,272,480000000
2015/01/07,270,273,270,271,217000000
  ...
2020/11/25,2839,2846,2795,2831,27800000
2020/11/26,2820,2826,2801,2809,8700000
2020/11/27,2807,2825,2803,2819,22000000

Flask의 주가 차트 서버



Flask는 파이썬으로 웹 서버의 동작을 기술 할 수있어 매우 편리합니다. matplotlib로 만든 그래프를 Flask로 전달하는 예가 인터넷에 많이 있지만 matplotlib뿐만 아니라 mplfinance의 plot도 같은 방법으로 할 수 있습니다.

title=flask_chart.py
import os
import numpy as np
import io
from flask import Flask, send_file, request
from flask_cors import CORS
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

import pandas as pd
import mplfinance as mpf

app = Flask(__name__)
CORS(app)

# http://サーバ名:5000/
@app.route('/')
def root():
    return "Chart Server"

# http://サーバ名:5000/candle?code=1001&term=200&volume=True
@app.route("/candle")
def candle():
    code = request.args.get('code', default=None, type=int)
    term = request.args.get('term', default=200, type=int)
    volume = request.args.get('volume', default="True", type=str)
    code_dir = int(code/1000)*1000
    input_path = "/root/opt/share/data/" + str(code_dir) + "/" + str(code) + ".csv"
    df = load_stock_price_csv(input_path, term=term)
    image = io.BytesIO()
    if len(df)>1:
        mpf.plot(df, title=str(code), type='candle',
                 mav=[5, 25, 75], volume=str2bool(volume))
    plt.savefig(image, format='png')
    image.seek(0)
    return send_file(image, attachment_filename="image.png")

def str2bool(s):
     return s.lower() in ["True", "true", "TRUE", "1"]

def load_stock_price_csv(path, term=0):
    if os.path.exists(path):
        df = pd.read_csv(path, header=None, names=['Date','Open','High','Low','Close','Volume'], encoding='UTF-8')
    else:
        df = pd.DataFrame([[0, 0, 0, 0, 0, 0]])
        df.columns = ['Date','Open','High','Low','Close','Volume']
    df['Date'] = pd.to_datetime(df['Date'])
    df = df.set_index("Date")
    if term>0:
        df = df.tail(term)
    return df

if __name__ == '__main__':
     app.run(host='0.0.0.0', port=5000, debug=True)

http://서버명:5000/
에 의해 root()가 달립니다. 여기에서는 클라이언트가 "Chart Server"라는 문자열을 표시하게 합니다.

http://서버명:5000/candle?code=6897&term=200&volume=True
에 의해 candle()가 달립니다.

candle()에서는 url 매개변수를 추출하고, 이에 따라 mpl.plot()로 차트를 표시하고, 그것을 (메모리상의) image에 png로 저장해, 클라이언트에 돌려줍니다.

docker-compose로 구현



파이썬의 실행 이미지를 만들고 거기에서 flask 서버를 실행하고 있습니다.

title=Dockerfile
FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim
RUN pip install --upgrade pip && \
    pip install --upgrade setuptools && \
    pip install --upgrade Flask flask_cors mplfinance
CMD ["python", "/root/opt/flask_chart.py"]

주가 데이터가 있는 위치를 opt/share에 마운트합니다.

title=docker-compose.yml
version: '3'
services:
  chart:
    restart: always
    build: .
    container_name: 'chart'
    working_dir: '/root/opt'
    tty: true
    ports:
      - 5000:5000
    volumes:
      - ./opt:/root/opt
      - /home/samba/share/muzinzo:/root/opt/share

주가 서버 시작
$ docker-compose up -d --build

필요에 따라 서버의 5000번 포트를 열고, 웹 브라우저에서,

http://서버명:5000/candle?code=6897&term=120&volume=True

을 두드리면 주식 차트를 볼 수 있습니다.



매우 쉽게 주가 차트 배달 서버를 구축 할 수있었습니다. 서버에서 스크리닝 한 결과를 표시하거나 페이지를 데코하거나 꿈은 퍼집니다.

참고로 주가 데이터를 준비하거나 차트를 그리거나 졸문
  • docker-compose로 주가 데이터 자동 취득
  • 무진장으로부터 취득한 주가 데이터로 차트 표시

  • 도움이 될 수 있습니다.

    2020/02/11 추가



    그 후 조금 웹 앱처럼 보았습니다. 그렇다고 해도, 단순한 구현이므로, 굳이 추기할 정도의 것은 아닙니다. 소스는 GutHub에 두고 있습니다.

    2021/2/16 추가



    작성한 사이트를 Frozen-Flask로 정적 html 사이트로 변환하고 GitHub에 넣어 데모 사이트 을 만들어 보았습니다. 반응형 디자인이 아니기 때문에 PC 전용입니다. .



    이상

    좋은 웹페이지 즐겨찾기