株のデータを分析してダッシュボードを作るため、今回はAWSのデータウェアハウスサービスであるRedshiftを使うことにした。
GoogleのBig QueryやSnowFlakeのようなサービスで、以下のブログの説明がわかりやすかった。
今回の実装で割と迷うところが多かったため、備忘録として残してみた。
まずは株のデータを取得
株のデータはAlpha Vantageという無料の株APIから取得することに。
メインページからGET FREE API KEYをクリック
情報を入れてGETボタンを押すと簡単にキーが取得できる。
APIのデータをcsvに変換
Pythonのpandasあたりを使うことが一般的だが、今回はRubyで書いてみた。
require 'httparty'
require 'csv'
require 'json'
require 'date'
require 'concurrent'
require 'dotenv'
Dotenv.load
API_KEY = ENV['ALPHA_VANTAGE_API_KEY']
SYMBOLS = ["AAPL", "GOOGL", "MSFT", "AMZN", "FB"]
def fetch_stock_data(symbol)
url = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=#{symbol}&outputsize=full&apikey=#{API_KEY}"
response = HTTParty.get(url)
data = JSON.parse(response.body)
unless data.key?("Time Series (Daily)")
puts "Fail to fetch data: #{symbol}"
return nil
end
daily_data = data["Time Series (Daily)"].map do |date, values|
[
date,
symbol,
values["1. open"],
values["2. high"],
values["3. low"],
values["4. close"],
values["5. volume"]
]
end
daily_data.sort_by! { |row| Date.parse(row[0]) }.reverse!
daily_data
end
def fetch_all_stocks(symbols)
all_data = Concurrent::Array.new
Concurrent::Promise.zip(*symbols.map { |symbol|
Concurrent::Promise.execute do
data = fetch_stock_data(symbol)
if data
all_data.concat(data)
puts "Fetched #{symbol}"
end
sleep 12
end
}).wait
all_data
end
result = fetch_all_stocks(SYMBOLS)
CSV.open("stock_data.csv", "wb") do |csv|
csv << ["date", "symbol", "open", "high", "low", "close", "volume"]
result.each { |row| csv << row }
end
puts "Fetched Data Completely!"
$ ruby fetch_stock_data.rb
Fail to fetch data: FB
Fetched GOOGL
Fetched MSFT
Fetched AMZN
Fetched AAPL
Fetched Data Completely!
あ、そういえばFaceBookってMetaになったのだった。
以下のようなcsvが出力されていれば正解
date,symbol,open,high,low,close,volume
2024-09-13,GOOGL,155.4300,158.3800,155.2100,157.4600,27509172
2024-09-12,GOOGL,153.8000,154.8200,152.6500,154.6900,29695048
2024-09-11,GOOGL,149.9200,151.5000,147.5200,151.1600,29607693
2024-09-10,GOOGL,150.4500,151.2700,148.3400,148.6600,31118765
2024-09-09,GOOGL,152.5100,153.4000,147.2150,148.7100,39260451
2024-09-06,GOOGL,157.3000,157.8300,150.5500,150.9200,37912130
AWS上で処理を行う
1. S3にバケットを作って出力したcsvを入れる
ローカルでもアップロードはできそうだったけど、とりあえずS3に入れることが王道らしい。
2. Redshiftにクラスタを作る
(すでに作っているクラスタがなければRedshiftのメイン画面でも作れる)
3. IAMロールを作る
関連サービスでRedshiftを選んで、S3のコピーができるロールを追加で付与する
4. 作ったロールをRedshiftに繋げる
少し迷ったところだった。名前空間の設定でセキュリティと暗号化タブに行くと設定できる。
5. データベースを作る
query editorに入って、createボタンからデータベースをつくつことができる
6. データをロードする
query editorのLoad dataから以下のような画面が開く。
今回S3に入れておいたcsvを指定して次に進むと、なんとcsvからテーブルを自動的に検知してくれる。
今まで設定したDatabaseとSchema、IAMロールを選択してCreate tableを押すと完了!
おわりに
AWSさんに300ドルのクレジットをもらえるので、色々遊ぶことができる。
個人でデータウェアハウスを運営することはなかなかないと思うが、サーバーレスオーバーエンジニアリングはただただ面白い。






