2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Ruby/AWS]alpha vantage APIを使って株のデータをRedshiftに入れる

Posted at

株のデータを分析してダッシュボードを作るため、今回はAWSのデータウェアハウスサービスであるRedshiftを使うことにした。

GoogleのBig QueryやSnowFlakeのようなサービスで、以下のブログの説明がわかりやすかった。

今回の実装で割と迷うところが多かったため、備忘録として残してみた。

まずは株のデータを取得

株のデータはAlpha Vantageという無料の株APIから取得することに。

メインページからGET FREE API KEYをクリック

スクリーンショット 2024-09-15 21.54.24.png

情報を入れてGETボタンを押すと簡単にキーが取得できる。

スクリーンショット 2024-09-15 21.55.18.png

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のメイン画面でも作れる)

スクリーンショット 2024-09-15 22.09.03.png

3. IAMロールを作る

関連サービスでRedshiftを選んで、S3のコピーができるロールを追加で付与する

4. 作ったロールをRedshiftに繋げる

少し迷ったところだった。名前空間の設定でセキュリティと暗号化タブに行くと設定できる。

スクリーンショット 2024-09-15 22.12.44.png

5. データベースを作る

query editorに入って、createボタンからデータベースをつくつことができる

スクリーンショット 2024-09-15 22.17.59.png

6. データをロードする

query editorのLoad dataから以下のような画面が開く。

スクリーンショット 2024-09-15 22.22.32.png

今回S3に入れておいたcsvを指定して次に進むと、なんとcsvからテーブルを自動的に検知してくれる。

スクリーンショット 2024-09-15 22.23.17.png

今まで設定したDatabaseとSchema、IAMロールを選択してCreate tableを押すと完了!

おわりに

AWSさんに300ドルのクレジットをもらえるので、色々遊ぶことができる。

個人でデータウェアハウスを運営することはなかなかないと思うが、サーバーレスオーバーエンジニアリングはただただ面白い。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?