ともだちはすくないです

30代既婚男子。子供2人。日経先物トレードとかプログラミングとか英語とか

日経先物のデータをmysqlに格納しようとしたら売買代金でエラーになった

とあるwebサイトからスクレイピングして、日足の「始値」「高値」「安値」「終値」を取得。そしてmysqlに格納しようとしています。プログラムも作成し(なぜかプログラム作成はruby。。)いざデータベースに取り込む時に、、途中で異常終了しました。ターミナルのエラーメッセージ見てると以下のようなもの。(「7395934775」は、とある日の日経先物の売買代金です。)

`ensure_in_range': 7395934775 is out of range for ActiveRecord::Type::Integer with limit 4 (RangeError)

ふむふむ、どうやらint型では桁数が足りないとのこと。調べているとrubyのint型の範囲は「-2147483647〜2147483648」らしい。うん、これじゃ売買代金多い日は足りない。もっと大きな範囲を指定できる型にしないといけないようだ。

ということで「int」型を「bigint」型に変更します。mysqlのコマンドで「days」テーブルの売買代金「value」の型変更。

mysql> alter table days change value value bigint;


これで売買代金が多い日でもエラーなくmysqlに格納できるようになりました。

pythonで日経先物分析をするために、データを格納するmysqlを作成する①

pythonで日経先物のデータ分析をするためにはデータが必要です。普通の日経平均だとyahoo等のサイトから取ってこれるのですが、日経先物のデータを取ってこれるサイトは現状中々ありません。いくつかサイトはあるのですが、そのサイトが無くなったらオシマイ!って状況は避けたいので、自分用にmysqlを使って日経先物のデータを保存することにしました。ちなみに保存しようかなあと考えてるのは5分足、15分足、30分足、1時間足、日足くらいです。ということでデータベース構築を以下の手順でやりましたのでメモ。

ちなみにこの先の展望としては、「スクレイピング先物データ自動取得→データベースに格納」「そのデータを使ってpythonで分析」ってところでしょうか。しかし、まだ日経先物データのpythonでの分析はサイトがあまりないですね。素人がどれだけやってもしれてると思うけど楽しいし頑張ろうっと。正直、rubyよりも楽しいです。



mysqlのインストール

$ brew install mysql


mysqlのスタート

$ mysql.server start


パスワードの設定。いくつか質問でてきますが、全部YESでよいはずです。

$ mysql_secure_installation


mysqlを使用。このコマンド入れるとパスワード入力されるよう求められるので先程設定したパスワードを入力。これでmysqlのコマンドが入力できるようになります。

$ mysql -uroot -p


データベースを作成します。テーブル名は「nikkei」。これでデータベースが作成されました。確認は「Sequel Pro」を使ってます。」

mysql> CREATE DATABASE nikkei;

Sequel Pro




「nikkei」を選択します。

mysql> USE nikkei


データベースにテーブルを作成して項目を追加します。まずは日足(日中とナイトで分割)のテーブル(テーブル名:day)を作成します。必要な項目は「年月日」「日中・ナイト区分」「始値」「高値」「安値」「終値」「出来高」「売買代金」でしょうか。とりあえず年月日のみデータベースにカラムを作ってみます。(レコードのユニークキーになるidも指定します。)

mysql> CREATE TABLE day(
    -> id INTEGER     NOT NULL AUTO_INCREMENT,
    -> date DATE      NOT NULL,
    -> PRIMARY KEY(id)
    -> );


dayテーブルにカラムが出来ていることを確認します。

mysql>DESCRIBE day;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| date  | date    | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+


データベースにまず始値カラム名:start)のカラムを追加します。

ALTER TABLE day ADD start INTEGER;


カラムが追加されていることを確認します。
(startのNULLがYESでいいのかは疑問だけど)

mysql> DESCRIBE day;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| date  | date    | NO   |     | NULL    |                |
| start | int(11) | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+


全項目追加したらこんな感じ。

mysql> DESCRIBE day;
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| date      | date    | NO   |     | NULL    |                |
| day_night | int(1)  | YES  |     | NULL    |                |
| start     | int(11) | YES  |     | NULL    |                |
| high      | int(11) | YES  |     | NULL    |                |
| low       | int(11) | YES  |     | NULL    |                |
| end       | int(11) | YES  |     | NULL    |                |
| volume    | int(11) | YES  |     | NULL    |                |
| value     | int(11) | YES  |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+

ちなみに「日中・ナイト区分(day_night)」は、カラム追加するの忘れていたので、後から追加しました。そのときのコマンドはこちら。dateカラムの後に1桁で追加してます。

mysql> ALTER TABLE day ADD day_night INTEGER(1) after date;


「Sequel Pro」で見るとこんな感じ。「nikkei」データベースの「day」テーブルに各項目が出来てるのが確認できます。
f:id:trade-and-develop:20170220213959p:plain





次は日中足のテーブルを作成してみようと思います。以下は15分足。日足に時間だけ追加してます。それ以外はまったく同じ。同じように5分足、30分足、1時間足のテーブルも作成します。

mysql> CREATE TABLE minute_15(
    -> id INTEGER     NOT NULL AUTO_INCREMENT,
    -> date DATE      NOT NULL,
    -> time TIME      NOT NULL,
    -> day_night INTEGER,
    -> start INTEGER,
    -> high INTEGER,
    -> low INTEGER,
    -> end INTEGER,
    -> volume INTEGER,
    -> value INTEGER,
    -> PRIMARY KEY(id)
    -> );

テーブル名の変更は以下。

mysql> alter table salestable rename to salestable_back;

paizaでスキルチェックをやってみてるけど、おもしろい

転職活動中の30代既婚男子です。

僕は社会人歴10年位ですが、そのうちシステム開発の仕事をしていたのは5年ほどです。人によってはシステム開発ってあまりおもしろく無いのかもしれないけど、僕にとってはとても面白いものでした。いやね、決して自分が向いてるとは思わないですよ。でもプログラム読んで理解したり、それを人と話したり、そもそも何かを作っていくってことがとても面白かったんですよ。ということで現在転職活動中なんですが、システム関係の仕事に絞って探しています。システム開発やってなかったら、まじで転職できない30代になってたよ。(まだ転職できると決まったわけじゃないけど)

ということで転職活動の一環でpaizaをやってみてます。

paiza.jp



これのスキルチェックが結構面白いんですよ。自分のレベルを上げようと必死になってやってしまう感じです。で、そのレベルに応じて求人も紹介してくれるという。なかなか面白いサービスですね。ソースコードをpaizaに提出するので、企業側がプログラマ欲しいときは最適ですね。ちなみに僕は現在Bランクでした。ランクは中級プログラマ

Aランクの問題もやってみましたが、中々難しかったです。自分は万年B級だ。。苦笑


ということで、これからrubyの復讐して何か新しいサービス作ってみます。休職中の人がもう少し生きやすくなるようなインターネットを目指してます。

東京タラレバ娘はNANAの再現か

kindle東京タラレバ娘の漫画は読んでたんだけど年始からドラマも見ている。よくある恋愛話ではあるのだけれど、これを読んでいると、「女性がいかに男(恋愛対象になる男)に振り回されるのが好きか」といことがよく分かる。


僕はいま30代の前半(タラレバの主人公と同世代)で、僕が学生の時はアラサーが主人公の恋愛漫画はあまり無かった。正確に言うと、あったんだろうけど僕の目には入らなかった。僕が若かったから興味が無かっただけなのかもしれない。それと同じように今アラサーの僕は東京タラレバ娘を割と楽しんで見ることが出来るが、20代前半の人にはまったく興味のないものなのかもしれない。



僕が学生である10年ほど前の代表的な恋愛漫画に「NANA」という漫画がある。この漫画も東京タラレバ娘とまったく同じ構造だ。20代前半の主人公ナナ(通称ハチ。このブログではハチと呼ぶ)が色んな男に振り回される物語。一言で言えばそれだけ。女性として一番モテる時期に周りのイケメンバンドマンと恋に落ちてセックスしては傷ついて、ってのを繰り返す。ほんとにただそれだけの物語。


10年前に流行った「NANA」の主人公が20代前半で主な読者ターゲットも20歳前後だったはず。 だ。そして東京タラレバ娘は主人公が30代前半で主な読者ターゲットはアラサー。






あれ、10年前のダメ女であるハチが東京タラレバ娘になって帰ってきただけちゃうん




繰り返すが僕は10年前には「NANA」のハチと、そして現在は「東京タラレバ娘」の主人公と同世代だ。どうやら僕の世代の女性は(僕の世代に限らないかもしれないけれど)男に振り回されるのが本当に好きらしい。

そう考えると、ある程度のスペックの男性であれば、恋愛工学が一番効果的なのもいまの30代前半の女性なのかもしれない。恋愛工学やる人が30代前半女性をターゲットにするかはまた別の話だけれど。

※この文章での男とは女の恋愛対象になる男(セックスに困らない男)で、全男性の2割程度と思われる。女性は8割の男のことは男と思っていない悲しい現実がある。

※何も調べずに思ったことを書いたので、ネット界隈では当たり前の事実かもしれません。これを書き終わった後も特に調べるつもりはないです。興味ないので。

転職エージェントに行ってきて、人生について考える事(30代前半・男の場合)

rubypythonを勉強中(トレードはお休み中)の僕ですが、今日ついに転職エージェントに行ってきました。あれだけサラリーマン嫌だって言ってたのに、また会社で働くのかよという感じですが。実家の近くでサラリーマンとして働きながら実家の仕事も手伝って覚えていくというのが一番無難かなと。「お前は無難を選ぶのか、面白くねーな一」という声が自分の中から聞こえてきそうですが、無難じゃない人生が面白いとも限りません。結局、僕はなんだかんが言いながら無難にしか生きることができない人生かもしれません。


誰かが「人の沿ったレールに乗って生きるのは嫌だ」と言っていましたがレールに乗り続けるってのも大変です。僕は一つの会社で勤め続けるというレールから降り、どこかに乗り換えすることになりそうです。それでも普通に大学を卒業させてもらって就職するっていうレールに乗っていなかった人生は想像できないし、自分にレールをイチから作り出していく力があるとも思えません。僕みたいな凡人は結局、地道に努力していくしか無いのです。そして人生では、地道に努力できたり、なぜか人より有能になれる場所や分野を自分で探していくことが大事かなあと思ってます。間違っても自分が努力出来なかったり、人より有能になれない場所で生き続けてはダメだと思ってます。


「今の会社でダメなやつは他行ってもダメだ」とは言いますが、絶対そんなことないです。活躍できる場所はきっとあるはず。ダメそうなら早く逃げる勇気も大切です。トレードで言う損切です。ただし、損切貧乏になる可能性もあるのでその辺は自己責任で。



何はともあれ一歩前進という感じです。さて休職は3月末までとしているんだけど、問題は内定出た後(内定出るかどうかも分からんが)の会社への報告だな。4ヶ月くらい休職してて復職のタイミングで退職ってあまりにも常識ない奴か?まあ、しょうがないです。当然ですが会社への忠誠よりも、僕と家族の人生のほうが大事です。普通に復職してそれから転職活動してたら時代がどうなってるか分かりませんし。2017年中にはちょっと不景気の芽が出てくるかもしれないですし。3月末まで頑張ります。(将来チャンスがあったときのためにrubypythonの勉強も少しずつやっていきます)

pythonでシステムトレードの勉強をしているが難しい

先日ブログでも書いたこの本を使ってシステムトレードの勉強をしています。というか単純にプログラム組んで株価とかの分析していくのが楽しいからやっています。儲けるためのシステムを組むならこの本を1冊やる必要がないような気もしてます。システムトレードやってる人が全員、標準偏差とか対数収益率とか理解してるとは思えないし。いや、自分が知らないだけでシステムトレードで儲かっている人は全員理解してるのかもしれないけど。もしかしたらcisさんもその辺全部理解してトレードしてたりしてw

自分は文系卒業で数学はⅡBまでしかやってないから、本の内容がいまいちよく分からないしpythonを使っての分析がどれほど有用か判断できましぇん。。くっそ、高校のとき数学ちゃんと勉強しときゃよかったぜ。なぜ、俺は数学と理科が子どものころから得意だったのに、フジテレビのアナウンサーになりたいという訳の分からん夢で文系に進んだんだ。小学校のとき九九はクラスで2番目に覚えるの早かったんだぞ。

いまのところ分からないのは概ね以下の点です。

・そもそもなんで株価の分析に対数を用いるのか
・1年の対数変化率の標準偏差がなぜボラテリティなのか

完全に数学の知識のような気がします。たぶん標準偏差とか対数の概念が分かってない。。高校の時になんとなくやった気はするけどすっかり忘れてて理解できません。。なんとか理解したい。もはやトレードのためじゃなく理解することそれ自体が目的になってる気がする。理系の大学行って数学とか統計学を学び直したいなあ。


Python3ではじめるシステムトレード ──環境構築と売買戦略 | 森谷 博之 | ビジネス・経済 | Kindleストア | Amazon

pythonでドル円を取得してみた。

超簡単です。

import pandas_datareader.data as pdr

start = "2016/1/1"
end   ="2017/2/13"

fx = pdr.DataReader('DEXJPUS',"fred",start,end).dropna()
fx.tail(20)


出力結果はこちら。

f:id:trade-and-develop:20170214204205p:plain


ちなみに「dropna()」はデータが無い行を削除してくれるもの。これがないと12/26とか1/2とかの海外市場が休場のときに「N/A」と表示される。まあそれがあっても困りはしないんだけど、あっても意味はない。