2017/06/01
_ kimono サービス
書籍実践 Webスクレイピング&クローリング を読んで、kimono というサービスの存在を知った。(^o^)/
- webサイトの画面を見ながら、スクレイピングしたい部分をマウスでなぞって指定
↓
- 指定箇所に対するスクレイピング動作を API化してくれる
↓
- 自作プログラムで簡単スクレイピング実現!
なんて便利なんだ \(^o^)/
と思って、色々とググってみたら、2016年 2月にサービス終了してた orz
本が出版された時期では有益なサービスだったんだろうけど、 書籍情報であるがゆえの問題点である「情報の陳腐化」には 逆らえない。
やはり Scrapy を勉強するしかないか ┐(´д`)┌ヤレヤレ
2017/06/06
すでに導入している Anaconda が 4.3.0のために Tensorflow で使えない Python3.6環境だったり、 Quadra を使いこなすために Tensorflow-gpu を導入しようとして失敗していたり、
ImportError: No module named '_pywrap_tensorflow_internal'
なんてエラーが出ていたり、他にも問題があったりしたけど、ようやっと環境を整えた。
Jupyter Notebook からも使えている感じ。\(^o^)/
結局のところ、公式ドキュメント をちゃんと読もうという結果だった (^^;;
私の仕事場での Python環境:
- Windows7 pro 64bit / Core i7-6700K
- ELSA Quadro2000M
- CUDA v8.0
- cuDNN v5.1
最終的に行った手順は以下の通り
- NVIDIA CUDA 8.0 Toolkitをインストールする。(なんと 1.3GB!!)
- cuDNN Downloadサイトから、cuDNN v5.1 をダウンロードする。
- NVIDIA Developer Membership に登録しないとダウンロードできないので、未登録な場合は新規登録する。
- リストの先頭にある最新版 v6.0 を間違ってダウンロードしないこと。
- →こっち。Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0
- ダウンロードした圧縮ファイルを、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 へまるごと展開
- tensorflow パッケージを導入する
C:> pip install --upgrade tensorflow C:> pip install --upgrade tensorflow-gpu
- Anaconda3 にて tensorflow 用の仮想環境を作成する
C:> conda info -e # conda environments: # root * C:\Anaconda3 C:> conda create -n tensorflow C:> activate tensorflow (tensorflow)C:> (tensorflow)C:> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.1.0-cp35-cp35m-win_amd64.whl (tensorflow)C:> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.1.0-cp35-cp35m-win_amd64.whl
- Pythonを起動してインストールできているか確認する
(tensorflow) C:>python
Python 3.5.3 |Continuum Analytics, Inc. (snip)
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2017-06-06 HH:MM:SS W c:\tf_jenkins ... library wasn't compiled to use SSE instructions,..
2017-06-06 HH:MM:SS W c:\tf_jenkins ... library wasn't compiled to use SSE2 instructions,...
(snip)
2017-06-06 HH:MM:SS W c:\tf_jenkins ... library wasn't compiled to use FMA instructions,...
2017-06-06 HH:MM:SS I c:\tf_jenkins ... Found device 0 with properties: name: Quadro M2000 ...
pciBusID 0000:01:00.0
Total memory: 4.00GiB
Free memory: 3.87GiB
2017-06-06 HH:MM:SS I c:\tf_jenkins ... DMA: 0
2017-06-06 HH:MM:SS I c:\tf_jenkins ... 0: Y
2017-06-06 HH:MM:SS I c:\tf_jenkins ... Creating TensorFlow device (/gpu:0) -> (device: 0, name: Quadro M2000, pci bus id: 0000:01:00.0)
>>>
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
参考にさせて頂いたサイト:
2017/06/08 為替データを PostgreSQL に取り込む
_ [Python][SQL]自前で為替データの検証をするために DBに取り込みたい
Python での読み取りだけでなく、他のプログラムからも保存データにアクセスしたい という思いもあり、お手軽な sqlite3 ではなくポスグレ(PostgreSQL) にしようと思う。
昔使ってたこともあるし、先日から JSONB といった新機能を使ってみたり、など、 個人的にはより使いこなしたいツールでもあるのよね。(^o^)/
為替データは GMOクリック証券のヒストリカルデータを使う。 サイトにログインしてから、ツール > ヒストリカルデータ へと進み、 2017年1月から今月までの月ごとの zipped データを取得して展開し、1つに結合して 2017.csvとして保存しておく。
というわけで、早速ポスグレへの取込方法をググって(I googled arround) とりあえず取り込んで見た。
% createdb forex % pgsql forex forex=# create table hdata ( forex-# id SERIAL primary key, forex-# Date Date, forex-# Time Time, forex-# Open double precision, forex-# High double precision, forex-# Low double precision, forex-# Close double precision, forex-# Volume bigint forex-# ); CREATE TABLE forex=# COPY hdata (Date, Time, Open, High, Low, Close) forex-# FROM '/path_to_csv/2017.csv' DELIMITER ',' CSV; COPY 160500 forex=# select * from hdata where date = '2017-01-10' limit 10; id | date | time | open | high | low | close | volume ------+------------+----------+---------+---------+---------+---------+-------- 6781 | 2017-01-10 | 00:00:00 | 116.415 | 116.465 | 116.406 | 116.459 | 6782 | 2017-01-10 | 00:01:00 | 116.459 | 116.499 | 116.455 | 116.471 | 6783 | 2017-01-10 | 00:02:00 | 116.471 | 116.485 | 116.406 | 116.415 | 6784 | 2017-01-10 | 00:03:00 | 116.415 | 116.433 | 116.379 | 116.405 | 6785 | 2017-01-10 | 00:04:00 | 116.405 | 116.413 | 116.362 | 116.364 | 6786 | 2017-01-10 | 00:05:00 | 116.364 | 116.375 | 116.306 | 116.333 | 6787 | 2017-01-10 | 00:06:00 | 116.333 | 116.346 | 116.296 | 116.305 | 6788 | 2017-01-10 | 00:07:00 | 116.305 | 116.312 | 116.257 | 116.276 | 6789 | 2017-01-10 | 00:08:00 | 116.276 | 116.301 | 116.246 | 116.266 | 6790 | 2017-01-10 | 00:09:00 | 116.266 | 116.291 | 116.258 | 116.274 | (10 行) forex=#
個人的には、volume 情報も欲しいところだけど、GMOクリック証券のヒストリカルデータには 含まれておらず、この点は我慢するしか無い (-_-;;
これで、今回の小さな目的は達成したけど、このアクセス性を活かした活用方法の アイデアがショボイことに今更ながら気づいた ┐(´д`)┌ヤレヤレ
参考にさせて頂いたサイト:
2017/06/09 PostgreSQLを勉強する
_ [SQL]為替データを SQLで取り込むべく、SQLを勉強ちう
テーブル構造は、先日作成したものをそのまま作成。
前提条件:
他プログラムからは hdata テーブルを用いたクエリを行う。
一方で為替データがどんどん更新されていくとして、そちらは hdata_new テーブルを用いる。
一定時間経過すると hdata_new の内容を hdata に対して上書きする。
- CSVファイルから hdata テーブルへ取り込む
COPY hdata (Date, Time, Open, High, Low, Close) FROM '/PathToCsv/2017.csv' DELIMITER ',' CSV;
- 取り込んだ行数を確認
SELECT COUNT(*) FROM hdata;
- 同じテーブル構造を持つ hdata_new との比較
- hdata にあって、hdata_new に無いデータ内容の確認
SELECT date,time,open,high,low,close,volume FROM hdata EXCEPT SELECT date,time,open,high,low,close,volume FROM hdata_new;
- hdata_new にあって、hdata に無いデータ内容の確認
SELECT date,time,open,high,low,close,volume FROM hdata_new EXCEPT SELECT date,time,open,high,low,close,volume FROM hdata;
- date, time が同一で、中身(為替データ)が異なるデータ数を確認
SELECT count(*) FROM hdata, hdata_new WHERE hdata.date = hdata_new.date AND hdata.time = hdata_new.time AND (not hdata.open = hdata_new.open OR not hdata.high = hdata_new.high...);
- 該当するデータを hdata から削除
delete FROM hdata USING hdata_new WHERE hdata.date = hdata_new.date AND hdata.time = hdata_new.time AND not hdata.open = hdata_new.open;
- hdata_new に有って、hdata に無いデータを追加
INSERT INTO hdata (date,time,open,high,low,close,volume) SELECT date,time,open,high,low,close,volume FROM hdata_new EXCEPT SELECT date,time,open,high,low,close,volume from hdata;
- 更新された結果を確認してみる
SELECT * FROM hdata ORDER BY date desc, time desc LIMIT 10;
2017/06/14 sqlite3 でも出来そう
_ [SQL]俄SQL使いでも、ググりながらなんとかデータ作成
ポスグレはたいそうだし、sqlite3のほうが軽い(と勝手に思っている)ので、 sqlite3 でも為替データ登録のための前準備処理が出来るか試してみた。
概要として、同じ日時であっても OHLC が異なる場合を想定し、 その場合は旧テーブルの行を削除しつつ、最新テーブルをコピーしてくる。
/* make hd, hd1 table. hd means Historical Data */ DROP TABLE IF EXISTS hd; DROP TABLE IF EXISTS hd1; DROP TABLE IF EXISTS hdtmp; create table hd ( id INTEGER PRIMARY KEY AUTOINCREMENT, Date TEXT not NULL, Time TEXT not NULL, Open REAL not NULL, High REAL not NULL, Low REAL not NULL, Close REAL not NULL ); create temp table hdtmp ( Date TEXT not NULL, Time TEXT not NULL, Open REAL not NULL, High REAL not NULL, Low REAL not NULL, Close REAL not NULL ); create temp table hd1 as select * from hd; /* import csv to temp table */ .import /PathToFOREXhistorical/2017.csv hdtmp /* insert values from hdtmp to hd with automated ID */ INSERT INTO hd (Date, Time, Open, High, Low, Close) SELECT * FROM hdtmp; DROP TABLE hdtmp; /* insert temp data to hd1 */ INSERT INTO hd1 VALUES(1, '2017/06/08', '05:58:00', 6,6,6,6); INSERT INTO hd1 VALUES(2, '2017/06/08', '05:59:00', 7,7,7,7); INSERT INTO hd1 VALUES(3, '2017/06/08', '06:00:00', 8,8,8,8); INSERT INTO hd1 VALUES(4, '2017/06/08', '06:01:00', 9,9,9,9); /* count items */ SELECT "hd:"; SELECT count(*) FROM hd; SELECT * FROM hd ORDER BY date desc, time desc LIMIT 10; SELECT "hd1:"; SELECT count(*) FROM hd1; SELECT * FROM hd1 ORDER BY date desc, time desc LIMIT 10; /* count comparable data (same date, same time, but wrong OHLC) */ SELECT "differ between hd and hd1"; SELECT count(*) FROM hd, hd1 WHERE hd.date = hd1.date AND hd.time = hd1.time AND (NOT hd.open = hd1.open); SELECT hd.date, hd.time FROM hd, hd1 WHERE hd.date = hd1.date AND hd.time = hd1.time AND (NOT hd.open = hd1.open); /* delete comparable data from hd */ SELECT "Deleting comparable data"; DELETE FROM hd WHERE (date,time) IN ( SELECT hd.date,hd.time FROM hd, hd1 WHERE hd.date = hd1.date AND hd.time = hd1.time AND (NOT hd.open = hd1.open) ); SELECT count(*) FROM hd; SELECT * FROM hd ORDER BY date desc, time desc LIMIT 5; /* inserting values from hd1 to hd */ SELECT "Inserting...hd:"; INSERT INTO hd (Date,Time,Open,High,Low,Close) SELECT Date,time,Open,High,Low,Close FROM hd1; SELECT count(*) FROM hd; SELECT * FROM hd ORDER BY date desc, time desc LIMIT 5;
参考にさせて頂いたサイト:
2017/06/15
_ [Python][SQL]とりあえず1分足を sqlite3 へ登録してみる
- OANDA REST API にて、Tickストリームを取得し、OHLC情報を更新
- setitimer を使って 60秒ごとに OHLC情報を fix
- fixした OHLC情報と、現在時刻 (ただし秒は "00"固定) を sqlite3 へ execute
作成してみたら、こんな感じになった (^o^)/
Pythonでの SQL文 (ポイントの抜粋):
cDate = dnow.strftime("%Y/%m/%d") # 2017/06/15
cTime = dnow.strftime("%H:%M:00") # 09:01:00
sqlstr = "delete from hd where date=? and time=?"
conns = c.execute(sqlstr, (cDate, cTime)).fetchall()
sqlstr = "insert into hd (date,time,open,high,low,close) values (?, ?, ?, ?, ?, ?)"
conns = c.execute(sqlstr, (cDate, cTime,
_usdjpy[1], _usdjpy[2], _usdjpy[3],
_usdjpy[4])).fetchall()
sqlstr = "select * from hd order by date desc, time desc limit 2"
conns = c.execute(sqlstr).fetchall()
結果:
% sqlite3 USDJPY1.db sqlite> select * from hd; 6|2017/06/15|18:06:00|109.703|109.703|109.691|109.692 7|2017/06/15|18:07:00|109.693|109.713|109.692|109.7 8|2017/06/15|18:08:00|109.695|109.698|109.689|109.693 9|2017/06/15|18:09:00|109.692|109.695|109.692|109.695 10|2017/06/15|18:10:00|109.691|109.694|109.69|109.694 sqlite>
OHLC の正確な情報としては'秒'情報は "00" ではないけど、自分用だし気にしない (^^;;
参考にさせて頂いた情報:
2017/06/20
- 1分足を記録したファイルに対して SQLを行う。
- 移動平均の計算方法は該当行から始めて 4つ前までの close 値を用い、5移動平均値を算出する。
- 結果を新たなカラムとして表示する。
% sqlite3 USDJPYm1.db sqlite> select date,time,close, ...> (select avg(close) from hd ...> where rowid between t1.rowid-4 and t1.rowid) ...> from hd as t1 limit 10; Date|Time|Close|(select avg(close) from hd where rowid between t1.rowid-4 and t1.rowid) 2017/06/19|16:15:00|111.168|111.168 2017/06/19|16:16:00|111.175|111.1715 2017/06/19|16:17:00|111.161|111.168 2017/06/19|16:18:00|111.175|111.16975 2017/06/19|16:19:00|111.168|111.1694 2017/06/19|16:20:00|111.172|111.1702 2017/06/19|16:21:00|111.178|111.1708 2017/06/19|16:22:00|111.184|111.1754 2017/06/19|16:23:00|111.177|111.1758 2017/06/19|16:24:00|111.175|111.1772 sqlite>
どうやら、最初の 4行については 5行分のデータが存在しないので、個数を減らして平均値を出しているようだ。
※注意
- rowid が非連続な場合は正しく計算できない。
- ROWS BETWEEN A AND B を使いたかったけど、sqlite3 では出来ないようだ orz
2017/06/22
単純移動平均ならば AVG() 関数で計算できるけど、加重移動平均とか難しいんだろうか。
まだまだ勉強不足なんで、まずはビューの使い方を勉強してみようと、 簡単に終値を使った 5MA とそれに対する乖離率(%) を計算して delta というカラム名として表示してみることにする。
% sqlite3 USDJPYm5.db sqlite> CREATE VIEW ma5 as select id, ...> (select round(avg(close),3) from hd ...> where rowid between t1.rowid-4 and t1.rowid ...> ) as ma5 ...> from hd as t1; sqlite> .mode column sqlite> .width 10 8 7 7 sqlite> select date,time,close,ma5,round(hd.close/ma5.ma5*100-100,2) as delta ...> from hd,ma5 ...> where hd.rowid=ma5.id limit 10; date time close ma5 delta ---------- -------- ------- ------- ---------- 2017/06/20 13:45:00 111.666 111.666 0.0 2017/06/20 14:00:00 111.66 111.663 0.0 2017/06/20 14:15:00 111.67 111.665 0.0 2017/06/20 14:30:00 111.691 111.672 0.02 2017/06/20 14:45:00 111.621 111.662 -0.04 2017/06/20 15:00:00 111.568 111.642 -0.07 2017/06/20 15:15:00 111.55 111.62 -0.06 2017/06/20 15:30:00 111.555 111.597 -0.04 2017/06/20 15:45:00 111.594 111.578 0.01 2017/06/20 16:00:00 111.647 111.583 0.06 sqlite>
2017/06/23
_ [Python]OpenCVも勉強してみたい
とある勉強会の場にいらっしゃった方が、OpenCV を使って動画顔認識を されておられたことから、俺も「動画物体認識したいっ!」と触発された。
OpenCV という名前は聞いたこと有ったけど使ったことはなかったので、 一度使ってみようとインストールから始めることに。まずは静止画で (^^;;
試した環境:
- Windows7 pro 64bit
- Anaconda2-4.3.0 (Python2.7.13) 64bit
- OpenCV 3.0.0
- 色々とググりながら、OpenCVのビルドが不要な 3.0.0バージョンを選択。
- OpenCV がインストールできたら、Jupyter notebook (on Anaconda2) にて、OpenCVを使った顔認識(Haar-like特徴分類器) の最後に載っているサンプルを実行。その際に若干の記述修正が必要。
ファイルパスが相対パスだったりするので、下記のような絶対パスにする face_cascade = cv2.CascadeClassifier(r'C:\opencv\build\etc\haarcascades\haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier(r'C:\opencv\build\etc\haarcascades\haarcascade_eye.xml') # イメージファイルの読み込み img = cv2.imread(r'C:\opencv\sources\samples\data\lena.jpg') # 必要ならリサイズしておく #img = cv2.resize(img, (1280, 1024))
ホント簡単すぎる。\(^o^)/
他の顔写真を試してみたけど、顔が小さいと目鼻検出はムリだったり、 変な場所を顔と認識したりと、精度については別途チューニングが必要そうと感じた。 完璧すぎると自主的なチューニング取り組みする気が削がれるし、 機械学習ほかへの取り組みを促しているんだろうと思う。
参考にさせて頂いたサイト:
_ [SQL]2つの sqlite3 DB を串刺しして SELECTしてみる
OANDA REST API を使って、7つの通貨ペア (AUDUSD, EURUSD, GBPUSD, NZDUSD USDCAD, USDCHF, USDJPY)を取得して sqlite3 DB として保存しているけど、 通貨の関係を見るために複数の DBを串刺しにして表示したいと思った。
早速ググってみたところ、 sqlite3 は単一ファイルDBなので、大規模でない限り1つにしたほうが良いとか 書かれてるんだけど、やっぱりあるじゃん。そういう方法が (^o^)/
USDJPY の 5分足DB と GBPUSD 5分足DBとを合成して、GBPJPY を作ってみる。
% sqlite3 ForexDB/USDJPYm5.db sqlite> attach database "ForexDB/GBPUSDm5.db" as gbpusd; sqlite> .mode column sqlite> .width 10 8 7 7 sqlite> select hd.date,hd.time, ...> hd.close as USDJPY, ...> gbp.close as GBPUSD, ...> round(gbp.close*hd.close, 4) as calGBPJPY ...> from hd, gbpusd.hd as gbp ...> where hd.date=gbp.date and hd.time=gbp.time limit 10; Date Time USDJPY GBPUSD calGBPJPY ---------- -------- ------- ------- ---------- 2017/06/19 17:55:00 111.023 1.28066 142.1827 2017/06/19 18:00:00 111.026 1.28061 142.181 2017/06/19 18:05:00 110.972 1.28052 142.1019 2017/06/19 18:10:00 110.959 1.28053 142.0863 2017/06/19 18:15:00 111.003 1.28064 142.1549 2017/06/19 18:20:00 111.032 1.28089 142.2198 2017/06/19 18:25:00 111.024 1.28097 142.2184 2017/06/19 18:30:00 110.999 1.28085 142.1731 2017/06/19 18:35:00 110.95 1.28105 142.1325 2017/06/19 18:40:00 110.936 1.28054 142.058 sqlite>
参考にさせて頂いたサイト:
上記が引用された Yahoo知恵袋のリンク
2017/06/25
_ OpenCV 勉強しようとしても、単に例題をコピペするだけの俄
やっぱり目的意識が無いと、いっちょ噛みなやり方では、 「例題をコピペして動いて喜ぶ」程度のことしかできないよね。┐(´д`)┌
2017/06/26
_ [Python]為替や金融取引を対象として色々やりたいけど、どこから手を付けたらいいのか
などと、ふと気づいた時に(そしてそれが何度も)考えてしまう。
これは「問題点(目標)を正しく把握出来ていない」だけでなく 「課題分析・課題分割」も正しく捉えられていないんだと思う。
そんな日々が続く中、ネットサーフィンしている途中でふと目に止まった記事がある。
金融データのPythonでの扱い方 - 今日も窓辺でプログラム
オンライン講義みたいだけど、なにかやりたいんだけど、モヤモヤしている現状を打開するべく 勉強に励んでみたら、次に何をしたいかハッキリできるかも (^_^)
2017/06/27
_ [SQL]別の sqlite3 プロセスから last_insert_rowid() できない?!
自前で TICK データを取得して sqlite3 DB 化しているので、 別プロセスから sqlite3 を起動して最新の close 値を読み出したいと思った。
当初
sqlite3 USDJPYm1.db 'SELECT close FROM hd ORDER BY Date desc, Time desc limit 1'
としていたけど、極稀に
database is locked
というエラーが出てしまっていた (+_+)
どうやら TICKデータを扱うプロセスの方で DBを専有する時間に対して、上記の select 文が が長いためにロックエラーになっているんじゃないかと想像する。
上述の SQL文の目的は「最新の close値を取得する」ことなので、色々とググって見たところ
sqlite3 USDJPYm1.db 'SELECT close FROM hd WHERE rowid=last_insert_rowid()'
とすることで、「最後に insertした行を取得する」ことが出来るらしい。
しかし、last_insert_rowid() の値は ゼロ しか返ってこない (>_<) どうやら、自プロセスが「最後に insert」するなら取得できるけど、 別プロセスからは「他プロセスが最後に insert」した rowid は見つけられないみたい (*_*)
更にググってみたら、下記 SQL文で目的を果たすことが出来た\(^o^)/
sqlite3 USDJPYm1.db 'SELECT close FROM hd WHERE id=(SELECT max(rowid) FROM hd)'
参考にさせて頂いたサイト:
_ [FreeBSD][Python]ただ何となく FreeBSD-10.3R に TensorFlow-1.2.0 を入れてみた。
ネットサーフィンしている途中で、たまたま見つけた サイトの情報 を元に Python2.7 をインストールしている FreeBSD-10.3R 向けに TensorFlow を入れてみた。
- サイトの情報を元に、py27-backports.weakref-1.0.r1.txz と py27-tensorflow-1.2.0.txz をダウンロードしてくる。11.0R であれば Python3.6向けのパッケージもある。
- pkg を使ってインストール。pkg install時に付随するパッケージも一緒にインストールする。
sudo pkg install py27-backports.weakref-1.0.r1.txz sudo pkg install tensorflow-1.2.0.txz
- Jupyter Notebook から使えるか試してみる
In [1]: import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
Out[1]: Hello, TensorFlow!
\(^o^)/
2017/06/28
_ いつの間にか FXDD のヒストリカルデータの更新が復活している
3月後半くらいから FXDDサイトにあるヒストリカルデータの更新が止まってたけど、 久々にデータを取得してみたらデータが追加更新されていた。
MT4に取り込んでおくか。