ともだちはすくないです

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

pythonで2つの指標を比較してみる

こんにちは。転職活動もそろそろ佳境に入ってきた筆者です。おかげさまで転職活動は割りと順調に進んでいます。聞くところによると現在の求人数はリーマンショック前を上回るようです。そりゃ株価がこれだけ高ければ、やはり企業は調子がいいのでしょう。問題はこの好景気がどこまで続くかだけど、こればっかりは分からないね。俺とか転職エージェントの人とか企業の採用担当者みたいな経済の素人でさえも、「近いうちに不況になる」と思ってるから、そんなものはしばらく来ないのかもしれない。こればかりは分かりません。考えても無駄です。それが来た時にどうするかを考えましょう。



さて、本日は複数の指標を一つのグラフで比較してみました。日経とダウとか、日経と為替とか。日経とVIXとか。そんなときに便利ですが調べるのに時間かかったのでメモ。



まず2軸のグラフを作成するコードは以下のとおり。まず一つ目の軸をsubplotとして作り、その一つ目のグラフを「twinx()」することで2つ目の軸を作成する。

fig, ax1 = plt.subplots()
ax1.plot(x1,y1)

ax2 = ax1.twinx()
ax2.plot(x2,y2)



ということで「yahoo finance」から取得した米金利と日経を同じグラフに載せてみました。1990年からの長期チャートです。コード全文は以下。

import pandas_datareader.data as web
import matplotlib.pyplot as plt
import datetime

# 取得する日の範囲を指定する
start = datetime.datetime(1990, 1, 1)
end = datetime.datetime(2017, 3, 10)

# 指標の名前を設定(タイトルとラベルで使用)
a = "TNX"
b = "NIKKEI"

# Yahoo ファイナンスから、 米金利と日経のデータをとってくる。
f = web.DataReader('^TNX', 'yahoo', start, end)
d = web.DataReader('^N225', 'yahoo', start, end)

# データの日付
fs = f.index
ds = d.index

# 一つ目(米金利)のグラフ作成
fig, ax1 = plt.subplots(figsize=(20, 8))
ax1.plot(fs, f['Close'], color='g', label='${0}$'.format(a))
ax1.legend(loc='upper left')

# 2つ目(日経)のグラフ作成
ax2 = ax1.twinx()
ax2.plot(ds, d['Close'], color='r', label='${0}$'.format(b))
ax2.legend(loc='upper right')

plt.title("{0} / {1}".format(a, b))
plt.show()

結果はこちら。

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






ちなみにグラフを反転させるときは、反転させたいプロットのところで以下の文を挿入するとOK。日経とVIXを比較するときなんかはVIXを反転させたほうが見やすいと思う。

plt.gca().invert_yaxis() 



こうやっていろいろ遊んでるけど、なかなかシステムトレードのロジックを作るのは難しいなあと感じている今日この頃です。

mysqlに接続できない

こんにちは。久しぶりにシステム関係のブログを書きます。

mysqlにログインできないときってありますよね。僕の場合は久しぶりにmysqlを使おうとするとなぜかログインできません。自分の場合はこうやると使えるようになります。


エラー内容

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)


解決:ソケットファイルを作成。

$ sudo touch /tmp/mysql.sock



エラー内容

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)


解決:権限を変えてやる。

$ sudo chown -R _mysql:_mysql /usr/local/var/mysql




スタート

$ sudo mysql.server start

mysql -uroot

2月のトレード実績

こんばんは。最近あまり状態がよくなかった筆者です。今月は割りと調子よくて転職活動もはじめっちゃったりしてたんですが、3日前の日曜日から急に調子悪くなりまして、この3日間ほとんど家から出ておりませんでした。ついでに風呂にも入らず家族ともほとんど会話せずといった状態の悪さでした。いまはやっと回復して近くのスタバでブログを書いております。


さて早いもので2月も終了です。先月、たまたま利益が出たから書いたトレード実績ブログに引き続き、今月もトレード実績ブログを書きたいと思います。これを書くということは、そう利益が出ているということですw

ちなみに先月の実績はこちら。
trade-and-develop.hatenablog.com



さて今月の実績は以下のとおりです。弱小、休職中サラリーマントレーダーとしてはまずまずかと。去年の年始からトレード初めて2ヶ月連続プラスって初めてな気がします。ちなみに累計とは2017年の累計です。

【全体】
累計 +258,338円
今月 +79,754円


(スクショは2017年の累計損益です)

先物OP】
累計 +215,112円
今月 +105,724円

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


うーん、先物部門がマイナスになっています。あれ、先月時点で先物はプラス10万円以上あったんだが。。そのかわりオプションで大きな利益が出ています。もう先物やめてオプションだけにしたほうがいいような気がしています。


【FX】
累計 −16,700円
今月 −25,970円

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



【CFD】
累計  +59,926円
今月 取引なし

久しぶりにヤバそうなのが来た

どうもこんにちは。現在の会社を休職中で転職活動をしておりpythonを勉強している筆者です。先日、2月の給料が振り込まれましたが普段の8割くらいでした。有給が切れたからかな。こでじゃ3月の給料は入らないのか?まあ働いてないから仕方ないけど。まず傷病手当金の申請しなきゃ。しかし会社の健康保険組合のホームページ見たら、傷病手当金て申請してから支給まで最低でも2ヶ月かかるって。。これのどこが生活保障だよ。終わってるわ。



定期的に来る家庭イヤイヤ期でもあります。こんな時でもまったく自分でお金を稼ごうとしない嫁。。どんだけ人任せなんだよ。。専業主婦って終わってるわ。20代前半で結婚したのはまじで失敗だった。今30代前半の俺らは親がバリバリの専業主婦世代だからしょうがないかもしれないが、これから嫁は稼げるとしてもパートで年100万円。パートって仕事も減っていくだろうから、これからはそれすら厳しかもしれない。そんな女性の生活費を一生負担していくってどんな罰ゲームだよ。。勘弁してくれ。(いまは子どもが小さいから、子育てをあまりやってない俺が稼ぐのは当然だと思ってるが。)



ということで毒を吐きました。久しぶりに悪い感情が襲ってきてます。昨日までは元気だったんだけどな。こんな状態じゃ転職活動うまくいきっこない。はあ、もうやだ。久々にメンヘラって色んなことにすごく苛ついてます。明日になれば元気になるんだろうか。

python pandasの添字「[0:1]」と「iloc[0]」の違いについて

転職活動中ですが、相変わらずpythonのプログラム書いて遊んでます。さて今回は表題のことが気になったので試してみました。両方ともリスト(配列)の1レコード目を持ってくるという意味っぽいですが何が違うのでしょうか。サンプルのテストコードは以下のとおり。ちなみに完全に自分用のメモです。

import pandas.io.sql as psql

#データベース「nikkei」の「nk225days」テーブルから日時順に並び替えて、「年月日、時刻、終値」のデータを取り出す。
conn = mysql.connector.connect(user='root', password='yashiro3', host='localhost', database='nikkei')

sql = """SELECT date,time,start,end FROM nk225days WHERE end  <>  0 AND date > '20120101' order by date asc,time asc ;"""
n225fm = psql.read_sql(sql, conn) 

da0 = n225fm[0:1].date  # 1レコード目の日付
da1 =  n225fm.iloc[0].date

print(n225fm)

print("n225fm[0:1] = {0}".format(da0))
print("")
print("n225fm.iloc[0] = {0}".format(da1))


出力結果はこのとおり。その値だけを取り出したいときは「iloc」を使って指定するんだね。「[0:1]」って指定をすると確かに1レコード目が取り出されるんだけど、インデックス番号やら型情報も取り出すようです。

            date     time  start    end
0     2012-01-04 09:00:00   8535   8540
1     2012-01-04 16:30:00   8525   8505

(省略)

n225fm[0:1] = 0    2012-01-04
Name: date, dtype: object

n225fm.iloc[0] = 2012-01-04

SQLで時刻を指定して抽出する

結構な時間ハマったのでメモ。

データベースのカラムで時刻の項目を持ってるケースもあると思います。で、ある特定の時刻のデータを抽出したいケースってありますよね。SQLのWHERE句でこう書けばいけました。

 WHERE TIME_FORMAT(column_name, '%H:%i:%s') = '09:00:00'

これで時刻を指定して抽出できます。はじめ「convert」使って色々やってたんだけど、中々うまくいかなかったので誰かのお役に立てば。

MySQLに日経先物の5分足データCSVをインポートしたらフリーズした。

相変わらず日経先物の過去データを集めています。過去の日足および最近の日中分足はwebからスクレイピングで取得しました。

ちなみにスクレイピングはこちらのサイト様にお世話になりました。

k-db.com

(サイト運営者様、サーバーに負荷かけてしまったかもしれないです。申し訳ありません。)




ただし、日中分足については最近のデータ(30分足は過去4ヶ月。15分足、5分足は過去4日)しかweb上にありません。そのため過去のデータについては別のところから取得する必要があります。ということで、ここから過去の日中分足をダウンロード。2012年〜のデータがあります。
225labo.com




で、このCSVMySQLに格納するためのプログラムをrubyで書きました。MySQLのコマンドで単純にインポートしても良かったんですが、取引日を加工してMySQLに格納したかったので、プログラムでやりました。

require 'mechanize'
require "active_record"
require "date"
require "time"

ActiveRecord::Base.establish_connection(
  adapter:  "mysql2",
  host:     "localhost",
  username: "root",
  password: "xxxxxx",
  database: "nikkei",
)

class Test < ActiveRecord::Base
end

today = 0
tomorrow = 0

regist = 0
FILE_NAME = 'n225_5.csv'
File.open(FILE_NAME) do |file|
  file.each_line do |line|
    regist += 1
    vals = line.split(',')

#------取引日の加工----------#

#ナイト・セッション(24時まで)は当日の日付に変更する。
    if vals[1].to_i == 9
      today = vals[0]
    end
    if vals[1].to_i >= 16
      vals[0] = today
    end

#ナイト・セッションの24時以降は当日の翌日日付とする。(金曜ナイトの24時以降は土曜の日付となる。)
    if vals[1].to_i >= 0 && vals[1].to_i <= 5
      tomorrow = Date.parse(today)
      vals[0] = tomorrow + 1
    end

#30分足の場合、朝のスタート時間をデータ上8時半にする。(ほんとのスタート時間は8時45分)
    # if vals[1].to_i == 8
    #   vals[1] = "08:30:00"
    # end

#-----取引日の加工終了----------#


    attr = {date: vals[0], time: vals[1], start: vals[2], high: vals[3],low: vals[4],end: vals[5],volume: vals[6]}
    test  = Test.new(attr)
    if test.save
      puts "data insert done!! #{regist}"
    else
    #データの保存でエラーとなったときはABENDさせる。
      puts "error"
      exit(1);
    end
  end
  puts "data insert END!!"
end



こんなプログラムで30分足、15分足、5分足のCSVデータをMySQLに格納していきます。5分足については2012年〜のデータで約30万件ありました。。この30万件を処理してたら、MySQLが動かなくなります。。

MySQLがフリーズしたときは以下のようにやれば解決しました。これでようやくデータの準備は完了です。やっと分析フェーズに入れそうです。長かった。1週間くらいかかったぜ!!

mysql> show processlist;

+-----+------+-----------+--------+---------+------+----------+------------------+
| Id  | User | Host      | db     | Command | Time | State    | Info             |
+-----+------+-----------+--------+---------+------+----------+------------------+
|  11 | root | localhost | nikkei | Sleep   |   58 |          | NULL             |
|  12 | root | localhost | NULL   | Sleep   |   18 |          | NULL             |
| 116 | root | localhost | NULL   | Query   |    0 | starting | show processlist |
+-----+------+-----------+--------+---------+------+----------+------------------+

mysql> kill 11;
mysql> kill 12;