シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

株価の成長率を求めるRスクリプトが欲しくてAIに頼んでみた(Gemini編)

MicrosoftのCopilotに対抗してGoogleが提供を始めたAIがGeminiである。最近公開されたばかりのため、まだ使ったことがない。折角Copilotを試したのでGeminiも同じお題で試してみた。

GeminiにRスクリプト作成を頼んでみた


先日の記事を読んでいただいた方はくどいと思われるだろう。私もそう思うが比較のためである。同じお題でGeminiにRスクリプト作成を頼んでみた。

Rスクリプトで以下の処理をしてください。 CSVファイルから日付(Date)と株価終値(Close)を取得します。 日付はYYYY-MM-DDのフォーマットになっています。 日付が取得できたら先頭データの日付からの日数を365で割って実数での年数(year)に変換します。 年数をx、株価終値をyとしてy=b*m^xの式で最小二乗法で近似して誤差が最小となるbとmを求めます。 bとmが求まったら、理論値ycalcを式ycalc=b*m^xで計算し、横軸をxとしてyとycalcを折線グラフで描いてください。

Rスクリプト
コード スニペット

# ライブラリの読み込み
library(tidyverse)
library(ggplot2)

# CSVファイルの読み込み
data <- read.csv("株価データ.csv", header = TRUE)

# 日付と株価終値の列を抽出
date <- data$Date
close <- data$Close

# 日付をYYYY-MM-DD形式に変換
date <- as.Date(date, "%Y-%m-%d")

# 先頭データの日付からの日数を計算
days <- seq(0, length(date) - 1)

# 年数を計算
year <- days / 365

# 最小二乗法による近似
model <- nls(close ~ b * m^x, data = data.frame(year, close))

# bとmの値を取得
b <- model$coefficients[[1]]
m <- model$coefficients[[2]]

# 理論値の計算
ycalc <- b * m^year

# 折線グラフの作成
ggplot(data.frame(year, close, ycalc)) +
  geom_line(aes(x = year, y = close)) +
  geom_line(aes(x = year, y = ycalc), color = "理論値") +
  labs(x = "年数", y = "株価終値")

コードは注意してご使用ください。
実行例
コード スニペット

# CSVファイル名
file_name <- "株価データ.csv"
# スクリプトの実行
source("Rスクリプト.R")

コードは注意してご使用ください。
出力例
折線グラフ: [無効な URL を削除しました]

説明
1 ライブラリの読み込み
2 CSVファイルの読み込み
3 日付と株価終値の列を抽出
4 日付をYYYY-MM-DD形式に変換
5 先頭データの日付からの日数を計算
6 年数を計算
7 最小二乗法による近似
8 bとmの値を取得
9 理論値の計算
10 折線グラフの作成

注意事項
CSVファイル名は適宜変更してください。
CSVファイルのフォーマットは、1列目に日付、2列目に株価終値のデータがカンマ区切りで記述されている必要があります。

参考資料
Rで最小二乗法による近似: [無効な URL を削除しました]
ggplot2による折線グラフ: [無効な URL を削除しました]

無効なURLを削除しました、というのは何らかの自己規制が働いているからだろうか。

返してきたスクリプトは、先日のCopilotやELYZAと同様に以下の部分に間違いがあり、正常には動かない。

  1. 先頭データの日付から年数を計算する処理
  2. 最小二乗法により近似する処理
  3. bとmの値を取得する処理

Geminiが少し賢いなと思ったのは、最小二乗法による近似処理で、線形回帰ではなく非線形回帰という難しい手法を使ってきたのと、ggplot2というライブラリでおしゃれなグラフを出力しようとしているところだ。非線形回帰というのは私も初めてだが、なんとか修正したのが以下のスクリプトである。

# ライブラリの読み込み
library(tidyverse)
library(ggplot2)

# CSVファイルの読み込み
data <- read.csv("AAPL.tsv", header = TRUE, sep="\t")

# 日付と株価終値の列を抽出
date <- data$Date
close <- data$Close

# 日付をYYYY-MM-DD形式に変換
date <- as.Date(date, "%Y-%m-%d")

# 先頭データの日付からの日数を計算
days <- as.numeric(date - date[1])

# 年数を計算
years <- days / 365.25

# 非線形最小二乗法による近似
model <- nls(close~b*m^years,start=c(b=17.0,m=1.1))

# bとmの値を取得
b <- coef(model)[1]
m <- coef(model)[2]

# 理論値の計算
ycalc <- b * m^years

# 折線グラフの作成
ggplot(data.frame(years, close, ycalc)) +
  geom_line(aes(x = years, y = close, color = "AAPL")) +
  geom_line(aes(x = years, y = ycalc, color = "R=27.1")) +
    labs(x = "年数", y = "株価終値")

出力したグラフがこちらである。年数の計算はうるう年を考慮し365.25で割るようにした。簡略的なやり方だがとりあえず問題なさそうだ。

Gemini 非線形回帰でカーブフィッティング

非線形回帰の計算では初期値を与えないといけないらしいので、適当な値を初期値として与えている。うまくカーブフィッティングはできているようだが、非線形回帰では決定係数という概念がなくなるらしく、決定係数が返ってこない。

わざわざ非線形回帰で行うメリットがなさそうなので、従来通りの線形回帰で求めるスクリプトに修正した。これはCopilotやELYZAで経験済みなのでそれほど苦労せずにできた。

# ライブラリの読み込み
library(tidyverse)
library(ggplot2)

# CSVファイルの読み込み
data <- read.csv("AAPL.tsv", header = TRUE, sep="\t")

# 日付と株価終値の列を抽出
date <- data$Date
close <- data$Close

# 日付をYYYY-MM-DD形式に変換
date <- as.Date(date, "%Y-%m-%d")

# 先頭データの日付からの日数を計算
days <- as.numeric(date - date[1])

# 年数を計算
years <- days / 365.25

# 線形最小二乗法による近似
model <- lm(log(close) ~ years)

# bとmの値を取得
b <- exp(model$coefficients[1])
m <- exp(model$coefficients[2])
ratio <- (m -1) * 100

# 理論値の計算
ycalc <- b * m^years

# 折線グラフの作成
ggplot(data.frame(years, close, ycalc)) +
  geom_line(aes(x = years, y = close, color = "AAPL")) +
    geom_line(aes(x = years, y = ycalc, color = sprintf("R=%.1f r2=%.3f",ratio,summary(model)$r.squared))) +
    labs(x = "年数", y = "株価終値")

作成したグラフがこちらである。

Gemini 線形回帰でカーブフィット

まとめ

Geminiを少し使ってみた私の印象は「使える優秀なスタッフ」である。これが無料で使えるというのはすごい。Open interpreterなどのLLMを自分の環境に導入しなくても、少しだけ使いたい時はこれで十分ではないか。

今回もスクリプトの修正までをGeminiにやらせることはせずに自分で直してしまった。プログラムの間違っている部分を指摘して直させるのは意外と難しい。具体的に指摘しようとするより、自分で直したほうが早いからだ。AIを使う側が使い方を習熟すれば完璧なアウトプットも作れるようになるのだろうか。その辺まで考え始めるとテーマが深すぎるので今回はこの辺りまでにしておきたい。