2019-02-13

ASUS TransBook T100HA と Manjaro 18

Amazon.jp プライムデー 2016 で破格な値段の誘惑に負けて買ってしまった ASUS TransBook T100HA (Atom x5-8500, RAM 4GB, SSD 64GB) には、最終的に Ubuntu 17.10 をインストールしたものの使用頻度が低く、ほぼ埃をかぶるような状態になっていました [1]

今回は、この古くなってしまった ASUS TransBook T100HA に Manjaro 18 をインストールした報告です。

格安 PC を買って Linux をインストールして遊ぶことが趣味である私は、最近、ドン・キホーテのジブン専用PC&タブレット3 RM-F106-SR(税抜 19,800円)を買って Linux 化を試みているのですが、その最中、Manjaro をインストールすると WiFi をはじめとして、意外と多くのデバイスがインストール直後から利用可能であったことに驚きました。そうであれば、埃をかぶっている ASUS TransBook T100HA ではどうだろうということで試してみました。

以下がインストール後の状況です。ただし WiFi についてはほんの少し手を加ました。

タブレット PC に Linux をインストールして重視している機能(上から順に優先度が高い)
WiFi Manjaro のインストール直後は認識されていないが、ファイルの設定で認識されました。
タッチスクリーン  
オーディオ  
Bluetooth Bluetooth デバイスが認識されますが、いまのところペアリングに成功していません。
バッテリー残量 ただし、電源コートを挿しているときは「残量推計中」のままの時が多い。
カメラ ×  

インストールメディアの作成

ちょっと古いバージョンですが、昨年、参考サイト [2] からダウンロードしてあった Manjaro GNOME Edition (18.0)、manjaro-gnome-18.0-stable-x86_64.iso を今回は使いました。これを Fedora Media Writer で USB メモリ (8GB) にイメージを焼きました。Manjaro のインストール方法詳細は、参考サイト [3] にまとめてあります。

WiFi の設定

Manjaro をインストールした後に、Ubuntu をインストールした時と全く同じやり方で内臓の WiFi デバイスを有効にできました [1]

$ ls /sys/firmware/efi/efivars/nvram-*
/sys/firmware/efi/efivars/nvram-74b00bd9-805a-4d61-b51f-43268123d113
$ sudo cp /sys/firmware/efi/efivars/nvram-74b00bd9-805a-4d61-b51f-43268123d113 /lib/firmware/brcm/brcmfmac43340-sdio.txt
[sudo] password for bitwalk: 
$ sudo modprobe -r brcmfmac
$ sudo modprobe brcmfmac

ベンチマーク

クロスプラットフォームに対応している Geekbench 4 を最近使うようになりましたので、この PC でも計測してみました。詳細は参考資料 [4] にありますが、スコアだけまとめると以下のようになります。

Single-Core Score Multi-Core Score
1118 3420
Geekbench 4.3.3 Tryout for Linux x86 (64-bit)

システムとプロセッサの情報は以下のようになっています。

System Information
Operating System Manjaro Linux 4.20.7-1-MANJARO x86_64
Model ASUSTeK COMPUTER INC. T100HAN
Motherboard ASUSTeK COMPUTER INC. T100HAN
Memory 3838 MB
BIOSAmerican Megatrends Inc. T100HAN.216
Processor Information
Name Intel Atom x5-Z8500
Topology 1 Processor, 4 Cores
Identifier GenuineIntel Family 6 Model 76 Stepping 3
Base Frequency 2.24 GHz
L1 Instruction Cache32.0 KB x 4
L1 Data Cache24.0 KB x 4
L2 Cache1.00 MB x 1

2015 年後半に発売された ASUS TransBook T100HA は、いまではすっかり古くなってしまった PC ですが、それでも手持ちの格安 PC の中ではなかなか優秀なパフォーマンスを叩き出しています。非力な Atom 系プロセッサとは言え、4 コアでベースクロックが高いことが要因でしょうか。Atom x5-Z8500 (Cherry Trail) と似たような世代の Celeron N3050 (Braswell) を搭載した PC のベンチマークと比べると、シングルコアの性能が同程度でも、コアの数だけマルチコアでの性能(スコア)が勝っています。

なお、Geekbench については、別記事で紹介したいと考えています。

まとめ

Bluetooth が確実に利用できると利便性がもっと上がりますが、現状でもまあまあ使えそうです。古い PC とは言え、いままでそんなに使わなかった PC だったので、今こそ使うべきだと 128GB の SD カードを挿して出張に持ち歩いています。

ASUS TransBook T100HA にインストールした Manjaro 18 のデスクトップ画面

以前は UMPC の GPD Pocket に Linux をインストールして嬉々として持ち歩いていましたが、1920 x 1200 と高解像でも 7 インチの画面は小さすぎて、結局のところ解像度を落とすしかなくて宝の持ち腐れです。出張時に携行していても使用頻度が下がってしまったので、二代目の GPD Pocket2 への移行は見合わせました。その代わりに、安価な Fire HD 8 タブレットを買って持ち歩くようになりました。Fire HD 8 は Amazon Prime ユーザーにはなかなか使い心地が良く、不満はあれど使い始めるとそれなりに生活ツールのひとつになってしまいました。

結局、いささか重量感がある ASUS TransBook T100HA を追加して持ち歩くようになり、重い荷物を持ち歩く出張の日々に戻ってしまいました。💦

参考 サイト

  1. bitWalk's: ASUS TransBook T100HA と Ubuntu 17.10 [2017-11-12]
  2. Get Manjaro | Manjaro Linux
  3. bitWalk's: Linux ディストロ探訪(5) 〜 Manjaro 〜 [2018-11-30]
  4. ASUSTeK COMPUTER INC. T100HAN - Geekbench Browser

 

ブログランキング・にほんブログ村へ
にほんブログ村

2019-02-09

ジブン専用PC&タブレット3 〜 Deepin のインストール

ドン・キホーテのプライベートブランドである情熱価格から 2018 年 6 月 8 日に発売されたジブン専用PC&タブレット3 RM-F106-SR は、19,800 円(税別)という超低価格を打ち出した格安 PC です [1]。4GB のメモリを搭載してこの値段だということで注目をしていたのですが、発売開始時に買えず、そのまま忘れかけていました。ところがです!二週間ほど前、ドン・キホーテ 長野駅前店 で見つけてしまったので、これは買うしかないと躊躇なく買ってしまいました。

こういう格安 PC(&タブレット) に Linux をインストールして遊び倒す、というのが自分の趣味(ビョーキ?)なのです💦。

格安 PC に使われている CPU は非力で、安い周辺チップを Linux が認識できなかったりします。それでも良いのです。解像度の低い内蔵カメラはそもそも使わないし、サウンド機能だって音質が悪いのでそれほど重要ではありません。タブレットですからタッチスクリーンが使えれば大成功、Bluetooth が使えればもっと良い。最悪でも WiFi さえ利用できれば Linux をインストールして遊べるかな、と希望レベルがとても低いです。もちろん Windows で使えている全機能が Linux でも利用出来ればとても嬉しいのですが、そうでなくとも Linux をインストールできそうであれば、結局インストールしてしまうのです。

問題はスクリーンが真っ暗になること

最初に Ubuntu 18.10 のインストールメディアで Live Linux を起動できるか試してみました。起動はできたのですが、しばらくすると画面が真っ暗になってしまいます。これは起動中にも発生しました。影響が少なさそうな を押していると再表示されます。画面が真っ暗になる間隔は、しっかりと計測していないものの体感的には一分未満です。さすがにこれでは使い物になりません。Fedora でも現象はほぼ同じ。Manjaro の場合、Live Linux では画面の問題が出なかったのですが、実際にインストールしたら同じく真っ暗になる現象を確認しました。

いくつか Linux ディストリビューションを試してみた結果を下表にまとめました。

表:Linux ディストリビューションをジブン専用PC&タブレット3 に試した結果 
Linux バージョン 画面 備  考
Ubuntu 18.10 × × × × 画面縦横の向きは検出されました。
Fedora
Workstation
29
-1.2
× × × × × 画面縦横の向きは検出されませんでした。
Manjaro
(Gnome)
18.0.2 × × Live Linux では画面が真っ暗になりませんでしたが、実際にインストールすると、画面がしばらくすると真っ暗になり、使い物になりません。タッチスクリーン以外のデバイスが認識されていたので、とても残念です。😞
なお、画面の向きは xrandr -o right で変更しました。
openSUSE
Tumbleweed
Snapshot
20190205
× × × 画面縦横の向きは検出されました。
実際にインストールすると、画面がしばらくすると真っ暗になり、使い物になりません。
Debian
(Gnome)
9.7.0 × × × × 画面は真っ暗にならず、縦横の向きも検出してくれましたが、他のデバイスは認識されませんでした。USB の WiFi デバイスを挿してしばらく使っていました。
Deepin 15.8 × × × × インストーラには Live Linux の機能はなく、いきなりインストールされます。
画面縦横の向きは検出されませんでした。画面の向きはログイン後に DDE, Deepin Desktop Environment の画面設定で変更しました。
パッケージ更新後、バージョンが 15.9.1 になりました。

※ ちなみに、Linux をインストールするときには、まず Manjaro を Live 起動して GParted でストレージのパーテションを削除してから、クリーン・インストールをしています。

Deepin をインストールして使用中

実のところ、ジブン専用PC&タブレット3 に Debian をインストールしてしばらく使っていたのですが、同時に他のディストリビューションを何度かインストールし直して動作確認もしていました。ですからプレインストールされていた Windows 10 はとっくに消してしまっています。であれば、中華 Linux も一度確認しておこうと Deepin [3] を試したところ、画面が真っ暗にならず、しかも WiFi が利用でき、Debian よりマシだったので、しばらく使ってみることにしました。

ジブン専用PC&タブレット3 にインストールした deepin 15.9.1 デスクトップ画面

Debian を使っていた時は LVM で 128GB の USB メモリを加えて、そこそこのストレージの容量を確保して、一応の R の開発環境を整えていました。しかし、Deepin ではデフォルトのインストールをしていて、ストレージの容量は 32GB しかありません。

インストール後のストレージの空き容量

しばらくは、このようにストレージが少ない状態でどのような使い方ができるか遊んでみるつもりです。もちろん、使えないデバイスを使えるようにする努力は継続的に続けます。Windows のように知らないうちにシステム関係のファイルが空き領域を食い潰しているということがないので安心です。

参考 サイト

  1. ジブン専用PC&タブレット3|家電|商品紹介|ドン・キホーテのプライベートブランド(PB)「情熱価格」|驚安の殿堂 ドン・キホーテ
  2. ジブン専用PC&タブレット3 BIOS・ブートメニュー | なぜなにDayByDay
  3. Deepin Technology Community
  4. bitWalk's: Linux ディストロ探訪(6) 〜 Deepin 〜 [2018-12-13]
  5. R.W.C CO.,LTD RM-F106-SR - Geekbench Browser

 

ブログランキング・にほんブログ村へ
にほんブログ村

2019-02-03

Rで株価を扱う 〜 始値を予測してみた

Rの quantmod パッケージを利用することにより、株価データを取り扱えるようになりました [1]。たくさんのデータを利用できるようになったので、機械学習でなにかを予測しようと考えました。今回も昨年末 (2018-12-19) に東証一部へ再上場したソフトバンク株式会社 (9434.T) を例に取り上げました。

関数関係を考える

\(9434.T\) の株価を、ある要因 \(x_{1}, x_{2}, ...\) を使って \(f\) という処理をして予測する、すなわち、

\(9434.T = f(x_{1}, x_{2}, ...)\)

というような関数関係を設定します。

株の値動きはそんなに単純ではないと、トレーダーからお叱りを受けそうですが、機械学習による予測はどんなものかを知りたかったので、問題を単純化して次のようにしてみました。

当日の株関連情報を用いて、翌日(次回)のソフトバンク株式会社 (9434.T) の始値を予測せよ。

当日の株関連情報は、予測対象のソフトバンクの情報に加えて、ソフトバンク・グループ企業と同業企業の情報および日経平均を加ました。

企業コードソース情報
ソフトバンク 9434.T yahooj Open, High, Low, Close, Volume, Adjusted
ヤフー 4689.T
ソフトバンク・テクノロジー 4726.T
楽天 4755.T
KDDI 9433.T
NTT ドコモ 9437.T
ソフトバンク・グループ 9984.T
日経平均 NIKKEI225 FRED -

R のコードを下記に示しました。機械学習には Random Forest (rf) を使用しています。

リスト:ソフトバンク (9434.T) の始値予測用プログラム 
library(quantmod)
library(caret)
library(doParallel)

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# GLOBAL SETTINGS

options("getSymbols.warning4.0" = FALSE)

# selection for modeling method
#model.method <- "pls"
model.method <- "rf"
#model.method <- "xgbLinear"
#model.method <- "xgbTree"
if (!exists("model.method")) {
    model.method <- "rf"
}

# prediction table object for store
predTblFile <- paste(Sys.getenv("HOME"), "preidction.RDS", sep = "/")

# for multi-threading
cl <- makePSOCKcluster(detectCores())
registerDoParallel(cl)

# -----------------------------------------------------------------------------
#  Function: get.stock
#  get table of certain stock data
#
#  code:   stock name/code
#  start:  start date
#  source: data source, default = 'yahooj'
#
#  return
#    data frame for specified stock data including Date column
# -----------------------------------------------------------------------------
get.stock <- function(code, start, source = "yahooj") {
    tbl <- getSymbols(code, src = source, from = start, auto.assign = FALSE)
    tmp <- data.frame(tbl)
    tmp$Date <- rownames(tmp)

    return(tmp)
}

# -----------------------------------------------------------------------------
#  Function: train.model
#  train model with specified ML method
#
#  df:          data frame for training including Y column
#  name.method: ML method
#
#  return
#    trained model
# -----------------------------------------------------------------------------
train.model <- function(df, name.method) {
  gc()
  set.seed(0)
  model <- train(
    Y ~ ., 
    data = df, 
    method = name.method, 
    tuneLength = 10,
    preProcess = c('center', 'scale'),
    trControl = trainControl(method = "cv")
  )
  return(model)
}

# =============================================================================
#  MAIN
# =============================================================================
date.start <- "2018-12-19"
code.target <- "9434.T";    # SoftBank
col.target <- "YJ9434.T.Open" 
tbl <- get.stock(code.target, date.start)

list.code <- NULL

# Yahoo Japan
list.code <- append(list.code, "4689.T") 
# SBT, SoftBank Technology
list.code <- append(list.code, "4726.T") 
# Rakuten
list.code <- append(list.code, "4755.T") 
# KDDI
list.code <- append(list.code, "9433.T") 
# docomo
list.code <- append(list.code, "9437.T")
# SBG, SoftBank group
list.code <- append(list.code, "9984.T")

# get stock data
for (code in list.code) {
    tbl <- merge(tbl, get.stock(code, date.start))
}

# NIKKEI225
tbl <- merge(tbl, get.stock("NIKKEI225", date.start, "FRED"))

# add data and Y data
tbl$Date <- as.Date(tbl$Date)

y <- tbl[, col.target]
y <- y[2:length(y)]; # shifting for using training
y <- append(y, NA)
tbl$Y <- y

# start model training
model <- train.model(tbl[1:(nrow(tbl) - 1),], model.method)
model

# update prediction table
date.last <- tbl[nrow(tbl), "Date"]
open.next <- predict(model, tbl[nrow(tbl),]); # prediction for next opening
tmp <- data.frame(Date = date.last,
                  Open.Next = open.next,
                  Method = model.method)
rownames(tmp) <- NULL
tmp$Method <- as.character(tmp$Method)

if (!file.exists(predTblFile)) {
    predTbl <- tmp
} else {
    predTbl <- readRDS(predTblFile)
    if (date.last %in% predTbl$Date) {
        predTbl[predTbl$Date == date.last, "Open.Next"] <- tmp[1, "Open.Next"]
        predTbl[predTbl$Date == date.last, "Method"] <- tmp[1, "Method"]
    } else {
        predTbl <- rbind(predTbl, tmp[1, ])
    }
}

predTbl
saveRDS(predTbl, file = predTblFile)

# prediction performance
tbl2 <- data.frame(Date = tbl$Date, Act = tbl[, col.target], Pred = NA)
for (d in predTbl$Date) {
    if (d %in% tbl2$Date) {
        r <- as.integer(rownames(tbl2[tbl2$Date == d,])) + 1
        p <- predTbl[predTbl$Date == d, "Open.Next"]
        tbl2[r, "Pred"] <- p
    }
}

tbl2$Date <- as.character(tbl2$Date)
xData <-as.integer(rownames(tbl2)) 

plot(xData, tbl2$Act,
     main = "Prediction",
     xlab = NA, xaxt  = "n",
     ylab = col.target,
     las = 1, type = "n")
axis(side = 1, at = xData, label = tbl2$Date, las = 2)
grid(NULL, NULL, lty = 2, col = "darkgray")
abline(v = xData[length(xData) - 1], lty = 1, col = "darkgray")
points(xData, tbl2$Act,
       type = "b", col = "blue", pch = 21)
points(xData, tbl2$Pred,
       type = "b", col = "red", pch = 19)

legend("bottom", bty="n", ncol = 2,
       legend = c("Actual", "Prediction"),
       pch = c(21, 19),
       lty = c(1, 1),
       col = c("blue", "red")
)

# ---
# PROGRAM END

トレーニング用のデータフレームでは Y の列に、翌日の YJ9434.T.Open の値を一日前までの行にずらして設定しました。つまり毎回 2018-12-19 から前日までのデータをトレーニング用データにして学習させ、そのモデルで当日の Y 値(翌日の始値)を予測しています。したがって、日が経てばそれだけトレーニング用データが増えていきます。

リスト:実行例 (2019-02-02) 
R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-redhat-linux-gnu (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。 
...
(途中省略)
...
> # start model training
> model <- train.model(tbl[1:(nrow(tbl) - 1),], model.method)
> model
Random Forest 

26 samples
44 predictors

Pre-processing: centered (44), scaled (44) 
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 23, 23, 23, 24, 23, 24, ... 
Resampling results across tuning parameters:

  mtry  RMSE      Rsquared   MAE     
   2    35.92638  0.8852441  26.70252
   6    30.32361  0.8886168  22.45102
  11    27.67208  0.8935603  20.18447
  16    25.91685  0.8933522  19.27206
  20    25.73431  0.8920262  19.11300
  25    25.14702  0.9064315  18.88401
  30    25.65043  0.8912953  18.91954
  34    25.31299  0.9627597  18.95446
  39    25.13421  0.8906889  18.39020
  44    25.32338  0.9203712  18.77740

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was mtry = 39.
> 
> # update prediction table
> date.last <- tbl[nrow(tbl), "Date"]
...
(途中省略)
...
> 
> predTbl
         Date Open.Next Method
1  2019-01-21  1420.734     rf
2  2019-01-22  1426.954     rf
3  2019-01-23  1424.429     rf
4  2019-01-24  1420.733     rf
5  2019-01-25  1416.661     rf
6  2019-01-28  1419.768     rf
7  2019-01-29  1416.853     rf
8  2019-01-30  1379.564     rf
9  2019-01-31  1353.043     rf
10 2019-02-01  1339.745     rf
> saveRDS(predTbl, file = predTblFile)
> 
...
(途中省略)
...
> # ---
> # PROGRAM END
> 

毎日プログラムを実行して予測された値は、データフレーム predTbl で予測日の行の Open.Next 列に格納されて保存されます。ちなみに、データソースの FRED の更新タイミングが一番遅くて、正確に計測がしていませんが、その日の午後10時頃になります。

プロットでは翌日分の予測値をずらして赤点で表示して、青点の実績値との予実が見れるようにしました。

ソフトバンク (9434.T) の始値の予測例

まとめ

まだデータ数が少なく、また、要因としての入力情報もざっくり選んでいるので、値動きがあるときに適切に予測できるのかはまだ判りません。モデルのトレーニングを実施して平均二乗誤差 RMSE が 25 程度ということは、予実プロットでもっともらしい結果が出ていても±25円程度の予測精度しかないということです。データが増えるにつれて、RMSE の値がじわりと下がってきているので、どの程度まで RMSE が小さくなるかを監視し、また予測精度向上に寄与する他の要因を加えられないかの検討を続けます。

参考 サイト

  1. bitWalk's: Rで株価を扱う 〜 quantmod パッケージ [2019-01-16]
  2. MathJax | Beautiful math in all browsers.

関連しそうな書籍を Amazon.co.jp からピックアップしましたが、現時点ではまだ金融データを扱うために特定の参考書を読んではいません。まずは自分が思うようにデータを処理してみて、しかる後に世の中の専門家が考えていることを付き合わせてみたいと思っています。

ブログランキング・にほんブログ村へ
にほんブログ村