昨年(2017/09頃)から 株取引を再開しようと思い立ち、それまで全くした事のないプログラミングを学び始めました。
50過ぎの初学者で、Qiitaの記事にとても助けて貰ったので少しでも恩返しをと思い投稿します。
お手柔らかに願います。
現在の環境
ハード)
機種名: Mac mini
プロセッサ名: Intel Core i5
プロセッサ速度: 2.8 GHz
プロセッサの個数: 1
コアの総数: 2
二次キャッシュ(コア単位): 256 KB
三次キャッシュ: 3 MB
メモリ: 16 GB
ソフトウェア)
システムのバージョン: macOS 10.13.4 (17E202)
Python version: 3.6.5 (default, Apr 29 2018, 14:06:19)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)]
pandas version: 0.22.0
matplotlib version: 2.2.2
NumPy version: 1.14.3
SciPy version: 1.0.1
IPython version: 6.3.1
scikit-learn version: 0.19.1
psql (PostgreSQL) 10.3
株価データの入手先)
https://csvex.com/
(スタンダード会員)
株価データの下準備までを備忘録として投稿します。
現在の流れ
* 日々の株価データを wget で取得し若干の手を加える。
* 得られる株価データは当日の分でしか無いので、一旦、PostgreSQL に格納する。
* 13週分(3ヶ月分)の株価他のテータを PostgreSQLからpandasのデータフレームとして読み込み 後は良しなに…。
株価データ 他の 取得。
(複数のデータをダウンロードしていますが省きます。)
日々の株価データ
d_price_url = 'https://csvex.com/kabu.plus/csv/japan-all-stock-prices/daily/japan-all-stock-prices.csv'
csvex の ユーザーIDとパスワードはshelveに保存しています。(他にもshelveにダウンロードした複数ファイルそれぞれのファイル作成日時を格納し、新旧判定に利用しています。ここでは割愛しています。)
csvex = shelve.open('/Users/*****/****/csvex')
csvex_id = csvex['csvex_id']
csvex_pass = csvex['csvex_pass']
csvex.close()
wget で 複数ファイルをダウンロードします。
for url in urls:
os.system(('wget
--http-user={0}
--http-passwd={1}
{2}
-P /Users//Downloads/
-NP /Users//Downloads/
-N') .format(csvex_id, csvex_pass, url))
取得した日々の株価ファイル
f = '/Users/****/Downloads/japan-all-stock-prices.csv'
UTF-8 に変換する。(Macなので…。)
os.system('nkf
-w
--overwrite
/Users/****/Downloads/japan-all-stock-prices.csv')
カラム名を準備します。 (適当です。)
columns = ['st_code','name','market','industry','trading_closed','stock_price','dbr_y','dbr_per','ld_cl_pr','start','high','low','vol','value','capi','low_lim','upp_lim']
株価csvファイルを d_prices に読み込む。(csvファイルには欠損があるので na_valuseを使います。1行目も飛ばします。)
d_prices = pd.read_csv(f, skiprows = 1, na_values = ('-',''), names = columns )
日付は pamdas の datetime に変換します。
d_prices['trading_closed'] = pd.to_datetime(d_prices['trading_closed'])
この時点でデータフレーム に任意の加工をします。
PostgreSQL に接続する。(user、tableご自分の環境に合わせてください)
engine = create_engine('postgresql://user@localhost:5432/table')
PostgreSQL にデータを追加。
d_prices.to_sql(
'daily_stock_price',
engine,
if_exists = 'append',
index = False)
ここまでがデータの作成部分ですね。
日々このファイルを走らせ、PostgreSQLにデータを追加します。
ここから先は ipython や jupyter notebook です。
PostgreSQLに接続。
conn = pg.connect('postgresql://user@localhost:5432/table')
Pandas に読み込むTable。
d_price = 'select
date, st_code, start, high, low, stock_price, vol, date_ymd, year, month, day, week_no, dotwek, youbi, name, industry
from
daily_stock_price
where week_no >= {}' .format(range_of_week_no)
where week_no >= {}' .format(range_of_week_no)の箇所で別途準備していた週番号で読み込み期間を指定しています。
PostgreSQL の Table 読み込む。
d_price = psql.read_sql(d_price, conn)
PostgreSQL との接続を切る。
conn.close()
株価の前日比、騰落率を銘柄毎に算出しています。
13週分のデータを読み込んでいるので 30万行位のデータフレームです。
日付でインデックスをかけて、証券コードで grouupby した物に同じ 株価データから 証券コードを重複を省いた stocks_name の行数だけ 前日比と騰落率を計算させています。
大体40分位です。
d_price.index = d_price['date_ymd']
gb = d_price.groupby('st_code')
n = len(stocks_name)
for i in tqdm(range(n)):
_name, _d_price = list(gb)[i]
_d_price['returns'] = pd.Series(_d_price.stock_price).pct_change()
_d_price['ret_index'] = (1 + _d_price.returns).cumprod()
returns = returns.append(_d_price)
出来上がった returns は 再度 PostgreSQL に格納しています。
他のデータフレームと結合したり、オリジナルの指標や条件でスクリーニングかけたり…。
後は良しなに…。