turtlechanのブログ

無知の私がLinuxをいじりながら書いていくブログ

Alpha Chart の株価更新に無尽蔵の日足データを使いたい

Alpha Chart の試用期間が終わるとデータ更新が「ダウンロード済みデータで更新」しかなくなります。
株価データ倉庫 の日足データが使えるが、更新が週一(日曜)なため毎日更新できない。
そこで、毎日更新している 無尽蔵 のデータを使えればいいなという話。

 

先に今回作ったやつ載せておきます。
ファイル: turtlechan_apcconv_v1.zip
解凍して '$ python apcconv.py' で起動。無尽蔵 の zipファイル を指定すればいいです。

起動画面

※ Python2 でも 3 でも動くはず。

はじめに

Alpha Chart で読み込める 株価データ倉庫 のtxtファイルを見てみたいと思います。
2020/01/06 のデータを参考にしています。

株価データ倉庫

ファイル名は 'y200106.txt' となっている。'y%y%m%d.txt' のようです。

中身はtsv形式のようです。タブで要素が区切られているやつですね。
一行目が、'20200106' なので '%Y%m%d'
二行目以降は

銘柄コード\t銘柄名\t始値\t高値\t安値\t終値\t出来高\r\n

 

以上の形式が Alpha Chart で読み込めるので、無尽蔵のデータをこのように整形すれば読み込める。
ついでに、無尽蔵 のcsvファイルも見ておきます。

 

無尽蔵

ファイル名は 'T200106.csv' なので 'T%y%m%d.csv'。

中身はcsv形式。カンマで要素が区切られているやつ。
一行目から以下の形式。

日付,銘柄コード,取引所別の数字,銘柄コード 銘柄名,始値,高値,安値,終値,出来高,取引所名\r\n

 

これを整形すれば良いのです。ちょろいですね。
無尽蔵の方には先物とか含まれていないけど、ないものはしかたないので無視。

今回作ったやつ

apcconv.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import zipfile
# Python のバージョンによって tk の分岐
if sys.version_info.major == 2:
    import Tkinter as tk
    import tkFileDialog as tkfd
elif sys.version_info.major == 3:
    import tkinter as tk
    import tkinter.filedialog as tkfd


class Converter(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        master.tk.call('wm', 'iconphoto', master._w, tk.PhotoImage(file='favicon.gif'))
        master.title('Turtlechan apcConv(仮)')
        master.geometry('+50+50')
        self.pack()
        self.create_widget()

    def create_widget(self):
        # ラベル
        self.lbl = tk.Label(self, text='入力:')
        self.strv_status = tk.StringVar()
        self.lbl_status = tk.Label(self, fg='#888', bd=1, relief=tk.SUNKEN, anchor=tk.E, textvariable=self.strv_status)
        # テキストボックス
        self.strv = tk.StringVar()
        self.ent = tk.Entry(self, width=60, textvariable=self.strv)
        self.strv.set(os.path.abspath(os.path.dirname(__file__)))
        # ボタン
        self.btn_fd = tk.Button(self, text='ファイル選択', command=self.push_fd)
        self.btn_conv = tk.Button(self, text='Convert', command=self.push_conv)
        # 配置
        self.lbl.grid(row=0, column=0)
        self.ent.grid(row=0, column=1)
        self.btn_fd.grid(row=0, column=2)
        self.btn_conv.grid(row=100, column=1)
        self.lbl_status.grid(row=102, column=0, columnspan=3, sticky=tk.W + tk.E + tk.N + tk.S)

    def push_fd(self):
        # ファイル選択ウィンドウ
        self.fp = tkfd.askopenfilename(filetypes=[('ZIPアーカイブ', '*.zip')])
        if len(self.fp) == 0:
            return
        else:
            self.strv.set(self.fp)

    def push_conv(self):
        # zipアーカイブの読み込み
        with zipfile.ZipFile(self.strv.get(), 'r') as zf:
            # Python のバージョンによって分岐
            data = [row.decode('shift-jis').split(',') if sys.version_info.major == 3 else row.split(',') for row in zf.open(zf.namelist()[0])]
        data = ['{0}\t{1}\t{2[0]}\t{2[1]}\t{2[2]}\t{2[3]}\t{3}'.format(row[1], row[3][4:].replace(' ', ''), row[4:8], float(row[8]) / 10000000 if int(row[1]) < 1300 else float(row[8]) / 1000) for row in data if row[8] != '0']
        # 書き出し
        with open(os.path.join(os.path.dirname(self.strv.get()), os.path.basename(self.strv.get()).split('.')[0].replace('T', 'y') + '.txt'), 'w') as f:
            f.write(os.path.basename(self.strv.get()).split('.')[0].replace('T', '20') + '\n')
            f.write('\r\n'.join(data))
        self.strv_status.set(self.strv.get() + '\t変換完了')


def main():
    root = tk.Tk()
    converter = Converter(root)
    converter.mainloop()


if __name__ == '__main__':
    main()

おわりに

Python3 で作ったファイルは Alpha Chart に読み込ませるとき銘柄名が文字化けします。
更新自体に問題はなさそうです。Python3 の文字列の扱い分からないんだよなぁ。。。

 

何かの参考になれば幸いです。