指定した株価になるとLINEに通知するGASを作成しているのですが、株価を手軽に取得できるAPIが無いため、株情報を無料で取得できるPythonのyfinanceとAWS LambdaでAPIを自作します。
Python yfinanceでの株価取得
yfinance単体での株価取得例です。ここでは株価・PBR・PER・配当利回りを取得しています。
import yfinance as yf
stock = yf.Ticker("285A.T") # 日本株は末尾に.Tを追加
price = stock.info.get("currentPrice") # 現在価格
pbr = stock.info.get("priceToBook") # PBR
per = stock.info.get("trailingPE") # PER
div = stock.info.get("dividendYield") # 配当利回り
これをベースにAWS LambdaでAPI化します。
AWS LambdaでAPI化
以下の手順でAPIを作成します。
- 関数URLを有効にしてLambdaを作成
- yfinanceのパッケージをLambdaに適用
- CloudShellでyfinanceのPythonパッケージをzip化
- Amazon S3にパッケージzipをアップロード→Lambdaに適用
Lambdaを作成
Python3.13のランタイムでLambdaを作成します。

外部から呼び出すために関数 URL を有効にします。認証タイプはNoneを指定。

サンプルコードと共に関数が作成されました。

yfinanceで株情報を返すコードを作成します。株番号はURLのクエリパラメータで渡します。
>lambda_function.py
import json
import yfinance as yf
def lambda_handler(event, context):
try:
stock_no = event.get("queryStringParameters", {}).get("stock_no")
stock = yf.Ticker(stock_no)
return {
"statusCode": 200,
"body": json.dumps({
"Price": stock.info.get("currentPrice"), # 現在価格,
"PBR": stock.info.get("priceToBook"), # PBR
"PER": stock.info.get("trailingPE"), # PER
"Rimawari": stock.info.get("dividendYield") # 配当利回り
})
}
except Exception as e:
raise Exception(str(e))
CloudShellでパッケージをzip化
Lambdaではpip installできないため、別環境で関連パッケージ類を抽出しzip化してアップロードする必要があります。
今回は適用先のLambdaと同じアーキテクチャのCloudShellで行います。
まず、Lambdaの環境と同じpython3.13をCloudShellにインストールします。
sudo yum install python3.13 python3.13-pip -y
次にpackagesディレクトリを作成してyfinanceのパッケージを入れます。
mkdir packages
pip3.13 install -t packages yfinance
packages/の中身は以下の様になります。pandasやnumpyにも依存してるとは…。

次にアクション→ファイルのアップロードより先ほど作成したlambda_function.pyをアップロードします。

~ $ ll
-rw-r--r--. 1 cloudshell-user cloudshell-user 649 Apr 5 05:39 lambda_function.py
drwxr-xr-x. 49 cloudshell-user cloudshell-user 4096 Apr 5 05:31 packages
zipに固めます。
cd packages/
zip -r ../packages.zip .
cd ..
zip packages.zip lambda_function.py
出来上がったpackages.zipはアクション→ファイルのダウンロードよりDLします。
参考:出来上がったzipの構成。lambda_function.pyとyfinanceの関連パッケージが入っています。

S3にパッケージのzipをアップロード
zip容量が10MB未満ならLambdaで直接アップロード可能ですが今回は53MBと大きいためS3経由でアップロードする必要があります。

アップロードしたS3 URIをコピーしておきます。なお、後述のLambdaへのアップロード後はオブジェクトは不要になるので削除して大丈夫です。
Lambdaにパッケージのzipをアップロード
作成したLambdaのアップロード元→Amazon S3の場所より、パッケージzipのS3 URIを指定します。

保存を押して完了です。先ほど作成したS3のオブジェクトは削除してOKです。
APIエンドポイントのクエリパラメータに銘柄コードを指定して動作確認します。
MU (マイクロン)
>curl https://XXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/?stock_no=MU
{"Price": 366.24, "PBR": 5.701387, "PER": 17.267326, "Rimawari": 0.16}
3048.T (ビックカメラ)
>curl https://XXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/?stock_no=3048.T
{"Price": 1785.5, "PBR": 1.7940378, "PER": 17.51177, "Rimawari": 2.33}
正しく動作していますね。これで完成です。