R筋

プログラミング、金融、育児

【R】SQLiteと連携

sqliteのDBへのデータ入出力についてです。

まず、sqlite本体からデータベースを作成して見ます。

https://sqlite.org/index.html
download→Precompiled Binaries for Windowssqlite-tools-win32-x86-3190300.zi
作業フォルダに解答。
コマンドプロンプトを起動→作業フォルダに移動

database1をデータベースとして作成し、
日次でドル円レートを入れるFXテーブルを作成
カラムは日付、始値、高値、安値、終値とする。

sqlite database1
CREATE TABLE FX(date,open,high,low,close);
.exit

rから接続してみます。

install.packages("RSQLite")
library("RSQLite")
con = dbConnect(SQLite(), "database1", synchronous="off")
dbListTables(con)#テーブル"FX"が取得できる

マネースクエアジャパンが同じ形式のデータを公開していますので、
こちらの、csvファイルをダウンロードして入れてみます。
[ヒストリカルデータ | マーケット情報(FX) | FX - マネースクウェア・ジャパン(M2J)]
http://www.m2j.co.jp/market/historical.php
ドル円日足ファイルcsvをダウンロード

usdjpy <- read.csv("USDJPY.csv",header=T)
sql <- paste("insert into FX values('",usdjpy[1,1],"',",usdjpy[1,2],",",usdjpy[1,3],",",usdjpy[1,4],",",usdjpy[1,5],");",sep="")
#"insert into FX values('2007/04/02',117.84,118.08,117.46,117.84);"
dbSendQuery(con,sql)

これで一行目を入力できました。

dbGetQuery(con,"select * from FX")
dbReadTable(con,"FX")

で、今insertしたデータを確認できます。
dbReadTableは、テーブル名でアクセスができるのでSQLを発行する必要がありません。
この作業をループで全行に行えば全てのデータがinsertできますが、
データフレーム全てを入力できる便利な関数があります。

dbWriteTable(con, "USDJPY", usdjpy)
#新たに"USDJPY"テーブルを作成して、データフレームusdjpyを一括挿入できる

最後は、切断します。

dbDisconnect(con)#切断

【R】optionsでの設定一覧

options関数で様々なオプションを設定・確認できます
確認する場合は以下のコマンドを使用します。

options()
getOptions("option名")

設定する場合は、options(オプション名=設定値)で行います。
設定できるオプションについて以下にまとめました。

$add.smooth
[1] FALSE
→単回帰分析のグラフを滑らかにするオプション

$askpass
→options()askpass("enter your password!")を実行すると
ポップアップでパスワードの入力画面を作成できる

$browserNLdisabled
[1] FALSE
→ブラウザの改行を"n"として扱うか

$check.bounds
[1] FALSE

x <- 1:3
x[5] <- 6
TRUEにすると、上のような実行をした時に、warningが出る。代入自体はできる。

$continue
[1] "+ "
> cat("コンソールで

  1. 途中改行した場合表示される文字")

$defaultPackages
[1] "datasets" "utils" "grDevices" "graphics" "stats" "methods"
→デフォルトのパッケージ一覧

$digits
[1] 7
→数値の表示を7桁

$download.file.method
[1] "wininet"
→ファイルをダウンロードする方法
"internal", "wininet","libcurl", "wget" and "curl", が選べる

$editor
→options()$editor("vi")などの指定で、edit()で起動する
editorを指定できる

$encoding
→options()$encoding("encode")で、インプットアウトプットの
エンコードを指定する。デフォルトは、native.encであり、変換を行わない

$help.try.all.packages
[1] FALSE
→help("packages")で検索する際に、全てのパッケージから検索できる
help("packages", try.all.packages=TRUE) によっても可能

$max.print
[1] 1000
→最大の表示件数

$nwarnings
[1] 50
→warn=0のとき、保存しておくエラーの件数

$OutDec
[1] "."
→小数点の表記

$papersize
[1] "a4"
→PostScriptで使用する用紙デフォルトサイズ

$PCRE_limit_recursion
$PCRE_study
$PCRE_use_JIT
→PCRE - Perl Compatible Regular Expressions関連

$profvis.keep_output
$profvis.print
$profvis.prof_extension
$profvis.prof_output
→コード可視化パッケージprofivis関連

$prompt
[1] "> "
→console上でプロンプトを促す文字

$scipen
[1] 0
→指数表記(1e+05)を変更

$show.error.messages
[1] TRUE
→エラーメッセージ表示

$str
$str$strict.width
[1] "no"
→ページ幅へ従う度合い"no","cut","wrap"

$str$digits.d
[1] 3
str関数で表示させる桁数

$str$vec.len
[1] 4
→表示させるベクトル数

$timeout
[1] 60
→インターネット関連の処理でのタイムアウト秒数

$ts.eps
[1] 1e-05
→時系列tsの範囲

$warn
[1] 0
→-1の時全てのエラーを無視、0のときは関数の終了まで保存、+1のときはすぐに表示

$warning.length
[1] 1000
→切り捨てるエラーや警告の件数

$width
[1] 122
→表示文字数

【R】Excelファイルの読み込み

Excelファイルを読み込む場合はreadxlパッケージを使用します。
試しに政府統計の日本の人口データを読み込んでみます。

人口推計 各月1日現在人口 月次 2017年6月 | ファイルから探す | 統計データを探す | 政府統計の総合窓口

install.packages("readxl")
library(readxl)
xls <- read_excel("05k2-1.xls",sheet=1,range="D12:M32",col_names = FALSE,col_types = "text",)

range=で読み込み範囲を指定できます。
当該データのように、タイトル列は複数のデータ列にまたがるようなレイアウトだったり、セルの結合が行われているような場合は、列名とデータが合致しないため、
範囲指定でデータ部分だけ読み込んだあと、列部分を入力して作成するか別途読み込む必要があります。
読み込む場合は、skipとn_maxを組み合わせて1行だけ読み込んだら、列名にできますよ。

【R】RcppBDTパッケージ

前回に引き続き、日付を操作するパッケージRcppBDTをご紹介します。
私がよく使うのはgetNthDayOfWeekで、「今月の第3水曜日は何日」といったことを取得できます。

以下に例を挙げます。

install.packages("RcppBDT")
library(RcppBDT)
date <- today()
getEndOfBizWeek(date)#"2017-06-23"
getEndOfMonth(date)#"2017-06-30"
getYear(date)#2017
getMonth(date)#6
getDay(date)#19
getDayOfWeek(date)#1
getDayOfYear(date)#170
#先物・オプション取引の契約終了日=第3水曜日
getIMMDate(6,2017)#"2017-06-21"
#2017年6月の第3水曜
getNthDayOfWeek(3, Wed, 6, 2017)#"2017-06-21"
#2017年6月の最後の月曜日
getLastDayOfWeekInMonth(Mon, 6, 2017) #"2017-06-26"
#今日の次に来る水曜日は
getFirstDayOfWeekAfter(Wed, date)#"2017-06-21"


参考:Package ‘RcppBDT’
https://cran.rstudio.com/web/packages/RcppBDT/RcppBDT.pdf

【R】lubridateパッケージ

lubridateパッケージは日付の操作に役立つ様々な関数があります。
日付型からyear(),month(),day(),hour()などで
それぞれの部分を取り出せる関数がとても便利です。
他にも使用頻度が高いと思われるもののサンプルを紹介します。

#パッケージインストール
install.packages("lubridate")
#パッケージ読み込み
library(lubridate)
#システム時刻を取得
now <- Sys.time()#"2017-06-18 09:19:51 JST"
#午前か午後かを判定
am(now)#TRUE
pm(now)#FALSE
#うるう年判定
leap_year(now)#FALSE
#クオーター取得
quarter(now)#2
#先月末を取得
rollback(today())#"2017-05-31"

#day()
day(now) #18
wday(now,label=T)#sun
yday(now)#169 年初から
qday(nwo)#79 四半期から
#年初から何週目か
week(now)#25

#インターバル型を作る interval(x,start)
span <-interval(ymd("2017-01-01"),today())#
#インターバルの期間(秒)を計算
seconds <- as.duration(span)#"14515200s (~24 weeks)"
#インターバルの期間(日数)を計算
as.numeric(seconds,"days")#168
#期間(日数)をperiod型で計算
s.period(span,"days")#"168d 0H 0M 0S"
#秒表記をseconds_to_periodにより変換も可能
seconds_to_period(seconds)#"168d 0H 0M 0S"

参考
https://cran.r-project.org/web/packages/lubridate/lubridate.pdf

【R】Rをバッチ化し、定時起動して処理を行う

以下で作成した、webスクレイピングスクリプトを1日1回定時起動して、
毎日清算価格を取得しprice.txtへ出力できるようにします。
anpontan382.hatenablog.com

方針は以下の通りです。
コマンドプロンプトからRを実行できるようバッチ化
②タスクスケジューラーでバッチを定時起動するよう設定する。


①-1
以下の内容のgetprice.rをCドライブ直下に配置します。

options(encoding="CP932")
library(rvest)
library(readr)
html <- read_html("https://www.tfx.co.jp/")
div <- html_nodes(html,"div.chart_cel_03")
text <- html_text(div)
price <- as.numeric(text[16])
write_lines(price,"price.txt",append=T)

①-2
getprice.rをコマンドプロンプトで実行するにはRをインストールしたときに
一緒にインストールされるRscript.exeを使用します。
Rscriptは通常以下のディレクトリにあります。
C:\Program Files\R\R-3.4.0\bin\Rscript.exe
getprice.rを実行するgetprice.batを作成します

cd c:\
"C:\Program Files\R\R-3.3.2\bin\rscript.exe" getprice.r

①ー3
getprice.batを実行すると、Cドライブ直下にprice.txtが作成され
価格が入ることが確認できると思います。

②-1
ググれば詳しく記載がある記事がたくさんありますので、簡単に概要だけ。
ファイル名を指定して実行→「タスクスケジューラー」を起動
基本タスクの作成→ウィンドウに従い実行間隔、時間、実行スクリプトを設定。
getprice.rを毎日実行するように設定します。

これにより、毎日HPから価格を取得して、getprice.txtへ保存していくことができます。
当然パソコンの電源は入れといてね!

【R】webスクレイピングの超基礎

webスクレイピング用のライブラリrvestを使って、
取引所FXなどを展開する東京金融取引所のホームページから
清算価格を取得してみたいと思います。

取引所のホームページからは様々な取引データが取得できるため、
金融の分析などに使用できることも多いと思います。

#webスクレイピングライブラリ
library(rvest)
#ファイル出力用
library(readr)

#東京金融取引所のホームページを取得します
html <- read_html("https://www.tfx.co.jp/")
#divで、クラスが「chart_cel_03」のタグを取得します
div <- html_nodes(html,"div.chart_cel_03")
#テキストを取得します
text <- html_text(div)
#16番目がドル円の清算価格です
price <- as.numeric(text[16])
#priceテキストに追記して出力していきます
write_lines(price,"price.txt",append=T)

price.txtに昨日の清算価格が出力されました。

110.095