<技術メモ>printデバッグからの卒業

概要

pythonのデバッガの使い方
最近知り合ってよく一緒にプログラミングをする人に、VBA統合開発環境でいうところの「ブレークポイント」とかが使えることを教えてもらいました。
Python3.6 / Ubuntu16.04LTS

python3 -m pdb XXX.py

すると、コマンドが出てくる。

コマンドの種類 b <行数> : 指定した行数にブレークポイントを置く c : ブレークポイントまでプログラム実行 s : 1行すすめる(次の行が関数だった場合、関数に入って1行目) n : 1行すすめる(次の行が関数だった場合、関数に入ってreturnされるまで)

  • 便利だと思ったこと ブレークポイントをおいたところまでプログラムを実行し、「変数の確認」「その場でテスト」できる。

  • 使い方

a_str = "123"
b_int = 12

c = a_str + b_int
print(c)

f:id:kurupical:20170724062714p:plain 5行目まで進めて…

f:id:kurupical:20170724063215p:plain バグったところはその場でテスト
(String型とint型を足し算しているから、int型に型変換して足し算したらちゃんとできた)
→プログラムを修正して、再度走らせる

みたいな感じで、結構重宝しています。

株分析プログラムの進捗

株分析プログラムの進捗

  • プログラムは完成した。
    株データ取得→編集→読み込み→RNN(GRU)に学習させる→結果を予想する、というプログラムの流れは完成しました。
    テスト的に少量の株データを読ませると、ちゃんと学習して結果を予想しました。(データが少ないため学習結果はひどいものですが…。)
  • 全データ(4000銘柄×3年分)だとフリーズ
    昨日の晩に処理を走らせてそのまま寝ました。
    起きたらデータ読み込みの途中でフリーズしてました。。   windowsでいうタスクマネージャー的なものを開いてメモリの使用量を見ていたのですが、pythonだけでメモリを7.1GB使用していたようです。
    pandas.DataFrameに30万行×100行の二次元配列を入れようとしているのですが、そこが原因なのかもしれません。
    プログラムがどのようにメモリを使うのかちゃんと分かっていないので、これを機に勉強してみます。

分析データの加工

分析データの加工ができました。

株の値動きのデータと、株の情報(総資産や純利益等)を結合しました。

データに欠損や間違い?が多くて、それを分析するのにとても苦労しました。 あとデータの結合の方法も微妙です。(後で結合の方法や欠損データの補完については再検討の予定です。) 疲れてくるとソースコードがどんどん汚くなってくるのはダメですね。。

詳細を書きたいのですが、今日帰宅してからぶっ続けでやって燃え尽きたのでまた明日以降に…。

明日からはいよいよ加工したデータを学習させます。 ここからが本番ですが、ここまでたどり着くのにえらく苦労しました。。

目標と課題(日本株投資×DeepLearning)

目標

  • 深層学習(DeepLearning)を用いて、日本株の株価予想を行う

    課題

  • データの取得元
  • データ分析方法の勉強
  • 訓練データとテストデータの分け方
    • 悩み中…
      • 時系列でテストするのはナンセンスだと思っている (リーマンショック時の年のデータばかり学習させると悲観的になる)
      • 過去何日分から次の株価を予想するのか、学習量と学習精度のトレードオフ

        • 過去2日から次の1日を学習させる場合の学習データ → ([4/1, 4/2]), ([4/2, 4/3]), … 29個(30 - 2 + 1)の学習データ 過去7日から次の1日を学習させる場合の学習データ → ([4/1, 4/2, … , 4/7], [4/2, 4/3, … , 4/8], … 24個(30 - 7 + 1)の学習データ
  • 株価予測できたとして、実際どう運用するのか??
    • 悩み中…
      • 一定の期間 T 以内に、利益 B が出る場合のみトレード
      • スイングトレード(1週間 〜 1ヶ月)を想定
      • 決済タイミングはどうする?一定?損切り/利確ポイントあり?

文字コード変換

ダウンロードしてきたCSVファイル(Shift-JIS)をUTF-8に変換する

バージョン : python3.6

import codecs
def sjis_to_utf8(input_path, output_path):
    '''
    SJIS -> UTF-8 にコード変換。
        input_path : コード変換するファイルのパス
        output_path : コード変換したファイルを生成するパス
    '''
    input = codecs.open(input_path, "r", "shift_jis")
    output = codecs.open(output_path, "w", "utf-8")
    for line in input:
        output.write(line)
    input.close()
    output.close()

自己紹介と目的

自己紹介

  • 文系学部卒。
  • SIerで5年勤務(公共系パッケージ導入が主。Java/COBOLを扱うレガシーな業務システム。)
  • 趣味:株と麻雀。テキサスホールデム。卓球。
  • kaggleID:kurupical kurupical | Kaggle
  • GitHubID:kurupical(放置中…)

ブログ解説の目的

  • 技術の備忘録。