Alpha Vantage API を使用してみる

本業や研究でより良いアウトプットを出すために

いろいろなソースコードを作っていきたいと思います

優良なデータを集めて　Microsoft Access などの
データベースに保存したい
そこでAPIの活用を考えました

https://note.com/hrt_ebihara/n/n4702999185b9


https://rbelgblog.com/blog/2022/04/15/%E6%A0%AA%E4%BE%A1%E6%83%85%E5%A0%B1%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82python-alpha-vantage-api%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF/

上記のサイトを参考に
APIキーを作ってみます

https://www.alphavantage.co/support/#api-key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/0a6dd755-e6f3-8793-8de3-c7d6549a3d76.png)



#### get_stock_API.py
```
import requests

def get_stock_data(symbol):
    API_KEY = '〇〇'  # ここにAPIキーを入力
    BASE_URL = 'https://www.alphavantage.co/query'
    
    parameters = {
        "function": "TIME_SERIES_DAILY",
        "symbol": symbol,
        "apikey": API_KEY,
        "datatype": "json"
    }
    
    response = requests.get(BASE_URL, params=parameters)
    data = response.json()
    
    return data
```

コードスニペットは、Alpha VantageのAPIを使用して、特定の株式の日次時系列データをJSON形式で取得する方法を示しています。requestsライブラリを使用してAPIにリクエストを送り、paramsで指定したパラメータ（関数、シンボル、データ形式、APIキー）を含めます。API_KEY = : '〇〇'の部分には、あなたがAlpha Vantageから取得したAPIキーを入力してください。
このリクエストを送信すると、指定した株式のデータが応答として返され、print(response.json())でその内容を表示


#### main.py
```
import requests
from src import get_stock_API


if __name__ == "__main__":
    symbol = "〇〇"  # 株のシンボルを指定
    stock_data = get_stock_API.get_stock_data(symbol)
    print(stock_data)
```

main.py の実行で無事に
データを取り出せました


これらのデータをもとに
データベースの接続を考えてみます

## 環境変数を利用する

環境変数を設定:
環境変数を設定するには、以下のコマンドを実行します：

```
export MY_API_KEY="your_api_key_here"
```

```
import os

api_key = os.environ.get("STOCK_API_KEY")
```

ここでMY_API_KEYは任意の環境変数名で、your_api_key_hereは実際のAPIキーに置き換えてください。


```
#!/bin/bash
cd /path/to/your/directory
export MY_API_KEY="your_api_key_here"
python3 your_script.py
```

ファイルを保存して実行権限を付与します：
```
chmod +x run_my_script.sh
```

これでバッチファイルを実行できます：
```
bash run_my_script.sh
```


#### get_stock_API.py を変更
```
import os
import requests

def get_stock_data(symbol):
    API_KEY = os.environ.get("STOCK_API_KEY")
    #API_KEY = '〇〇'  # ここにAPIキーを入力
    BASE_URL = 'https://www.alphavantage.co/query'
    
    parameters = {
        "function": "TIME_SERIES_DAILY",
        "symbol": symbol,
        "apikey": API_KEY,
        "datatype": "json"
    }
    
    response = requests.get(BASE_URL, params=parameters)
    data = response.json()
    
    return data

def save_stock_data_to_csv(stock_data, filename="stock_data.csv"):
    # Extract relevant data from stock_data (adjust as needed)
    time_series = stock_data.get("Time Series (Daily)", {})
    rows = [(date, values["1. open"], values["4. close"]) for date, values in time_series.items()]

    # Write data to CSV file
    with open(filename, "w", newline="") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["Date", "Open Price", "Close Price"])  # Write header
        writer.writerows(rows)

    print(f"Stock data saved to {filename}")

```

#### main.py を変更
```
import requests
# multiprocessingをインポートすることで、プロセスの生成と管理が可能になります。
import multiprocessing
# get_stock_APIからget_stock_data関数とsave_stock_data_to_csv関数をインポートします。
# これらの関数は株価データの取得とCSVファイルへの保存を行います。
from src.get_stock_API import get_stock_data, save_stock_data_to_csv

# 株式シンボルを引数として、株価データを取得し、CSVファイルに保存する関数です。
def process_stock(symbol):
    # 指定されたシンボルの株価データを取得します。
    stock_data = get_stock_data(symbol)
    # 取得した株価データをCSVファイルに保存します。ファイル名はシンボル名に基づきます。
    save_stock_data_to_csv(stock_data, filename=f"{symbol}_stock_data.csv")

# このスクリプトが直接実行された場合にのみ以下のコードブロックが実行されます。
if __name__ == "__main__":
    # 処理する株式シンボルのリストです。
    symbols = ["IBM", "AAPL", "GOOG"]
    # 空のプロセスリストを作成します。このリストは後でプロセスを管理するために使用されます。
    processes = []

    # 株式シンボルごとにループを実行します。
    for symbol in symbols:
        # 各シンボルに対して、新しいプロセスを生成します。ターゲット関数は`process_stock`で、引数はシンボルです。
        p = multiprocessing.Process(target=process_stock, args=(symbol,))
        #p = multiprocessing.Process(target=process_stock_to_db, args=(symbol,))
        # 生成したプロセスをプロセスリストに追加します。
        processes.append(p)
        # プロセスを開始します。
        p.start()

    # 全てのプロセスが終了するまで待機します。
    for process in processes:
        process.join()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/950bd0a5-2037-7b3d-5787-30dfe4c61e00.png)


上記は　wsl2 で実施しました
保存された　csv　データから

Microsoft Access などの
データベースに保存する　バッチファイルの作成などを考えます