株価監視と通知

 株の価格を毎日確認して記録したい。いくつかの銘柄を指定しておきたい。価格に変動があれば、discodeに通知したい、

それ、Kaoruらしいスマートなワークフローですね📈✨
目的は「指定銘柄の株価を毎日取得 → 変動を検知 → Discordに通知」なので、以下のような構成が考えられます:

🧩 構成概要

ステップ内容技術候補
① 銘柄リストの管理監視対象の株式コードを指定JSON / Google Sheets / YAML など
② 株価の取得毎日定時に最新価格を取得Python + API(例:Yahoo Finance, Alpha Vantage)
③ 価格の記録過去の価格と比較できるよう保存CSV / SQLite / Google Sheets
④ 変動検知前日比や指定閾値で変化を判定Pythonロジック(±x%以上など)
⑤ Discord通知変動があればWebhookで通知Discord Webhook + requestsライブラリ

🛠️ Pythonスクリプトの骨格(例)

import yfinance as yf import requests import datetime # 銘柄リスト tickers = [‘AAPL’, ‘MSFT’, ‘GOOGL’] threshold = 0.02 # 2%変動で通知 # Discord Webhook URL WEBHOOK_URL = ‘https://discord.com/api/webhooks/xxxx/yyyy’ # 株価取得と比較 for ticker in tickers: stock = yf.Ticker(ticker) today = datetime.datetime.now().date() hist = stock.history(period=”2d”) if len(hist) < 2: continue price_today = hist[‘Close’][-1] price_yesterday = hist[‘Close’][-2] change = (price_today – price_yesterday) / price_yesterday if abs(change) >= threshold: message = f”{ticker} の株価が {change*100:.2f}% 変動しました。\n昨日: {price_yesterday:.2f} → 今日: {price_today:.2f}” requests.post(WEBHOOK_URL, json={“content”: message}) 

🧠 Kaoru向けのカスタマイズ案

  • Whisperや字幕処理と同じく「ログ保存・再現性」を重視するなら SQLite or Google Sheets 連携もおすすめ
  • 日本株(例:7203.T トヨタ)を扱うなら yfinance.T を付ける必要あり
  • Discord通知を「Embed形式」にすれば視認性アップ
  • 複数銘柄の変動をまとめて通知 or 個別通知も選べる

もし「Google Apps Scriptでスプレッドシート連携したい」「ffmpegで株価チャートを動画化したい」みたいな応用も考えてるなら、そこも一緒に設計できますよ。
銘柄リストや通知条件、保存形式など、もう少し具体的に教えてもらえたら、さらにKaoru仕様に仕上げられます。どうします?

①、③はgoogle sheetにします。②は、google ファイナンスを主とします

了解です、Kaoru。Google SheetsとGoogle Finance関数を活用するなら、かなり自然で再現性の高い構成が組めそうですね。以下に、Kaoru仕様の設計案をまとめました:

🧩 全体構成(Google中心)

ステップ実装方法備考
① 銘柄リスト管理Google Sheetsに記載例:A1:A10 に銘柄コード(例:AAPL、7203.T)
② 株価取得=GOOGLEFINANCE() 関数自動更新。例:=GOOGLEFINANCE("AAPL", "price")
③ 価格記録スクリプトで日付付き保存Google Apps Scriptで毎日記録(履歴管理)
④ 変動検知前日比をスクリプトで判定閾値(例:±2%)を超えたら通知対象に
⑤ Discord通知Webhook + Apps ScriptUrlFetchApp.fetch() で通知送信

🧠 Google Sheetsの構成例

セル範囲内容
A2:A銘柄コード(例:AAPL, MSFT, 7203.T)
B2:B現在価格(=GOOGLEFINANCE(A2, "price")
C2:C前日価格(Apps Scriptで記録)
D2:D変動率(=(B2-C2)/C2
E2:E通知フラグ(スクリプトで判定)

🛠️ Apps Scriptの骨格(概要)

function checkStockPrices() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Stocks”); const data = sheet.getDataRange().getValues(); const webhookUrl = “https://discord.com/api/webhooks/XXXX/YYYY”; const threshold = 0.02; // 2% for (let i = 1; i < data.length; i++) { const ticker = data[i][0]; const currentPrice = data[i][1]; const previousPrice = data[i][2]; if (!currentPrice || !previousPrice) continue; const change = (currentPrice – previousPrice) / previousPrice; if (Math.abs(change) >= threshold) { const message = `${ticker} の株価が ${Math.round(change * 10000) / 100}% 変動しました。\n昨日: ${previousPrice} → 今日: ${currentPrice}`; UrlFetchApp.fetch(webhookUrl, { method: “post”, contentType: “application/json”, payload: JSON.stringify({ content: message }) }); } // 前日価格を更新 sheet.getRange(i + 1, 3).setValue(currentPrice); } } 

※ この関数を「毎日定時に実行」するには、Apps Scriptの「トリガー」機能で時間ベースの自動実行を設定できます。

✨ Kaoru向けの拡張アイデア

  • 変動率に応じて通知の色分け(Discord Embed形式)
  • 複数シートで「米国株」「日本株」など分類
  • 株価以外に「出来高」「PER」なども取得可能(Google Finance関数)
  • 価格履歴を別シートに日付付きで蓄積 → グラフ化も可能

この構成なら、Kaoruの「再現性・自然さ・人間らしい出力」へのこだわりにもぴったりハマると思います。
もし「通知文を日本語で自然にしたい」「変動率の計算を丸めたい」「複数Webhookに分岐したい」などあれば、そこも一緒に詰めていきましょう。どこから着手します?

基本的に米国株のみです。インテル(INTC)、テスラ(TSLA)、AAPU、ラムリサーチ(LRCX)でサンプル提示して

了解です、Kaoru。米国株4銘柄(INTC, TSLA, AAPL, LRCX)を対象に、Google Sheets + Google Finance + Apps Scriptで構成するサンプルを提示します。以下は、実際に動かせるような設計とコード例です。

📊 Google Sheetsの構成例

セル内容
A1:A5銘柄コード(INTC, TSLA, AAPL, LRCX)
B列現在価格(=GOOGLEFINANCE(A2, "price")
C列前日価格(Apps Scriptで記録)
D列変動率(=(B2-C2)/C2
E列通知フラグ(スクリプトで判定)

🧠 Apps Scriptサンプルコード

function checkUSStocks() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Stocks”); const data = sheet.getDataRange().getValues(); const webhookUrl = “https://discord.com/api/webhooks/XXXX/YYYY”; // ← あなたのWebhookに置き換え const threshold = 0.02; // 2%変動で通知 for (let i = 1; i < data.length; i++) { const ticker = data[i][0]; const currentPrice = data[i][1]; const previousPrice = data[i][2]; if (!currentPrice || !previousPrice) continue; const changeRate = (currentPrice – previousPrice) / previousPrice; const changePercent = Math.round(changeRate * 10000) / 100; if (Math.abs(changeRate) >= threshold) { const message = `📈 ${ticker} の株価が ${changePercent}% 変動しました。\n昨日: $${previousPrice.toFixed(2)} → 今日: $${currentPrice.toFixed(2)}`; UrlFetchApp.fetch(webhookUrl, { method: “post”, contentType: “application/json”, payload: JSON.stringify({ content: message }) }); sheet.getRange(i + 1, 5).setValue(“通知済み”); } else { sheet.getRange(i + 1, 5).setValue(“”); } // 前日価格を更新 sheet.getRange(i + 1, 3).setValue(currentPrice); } } 

⏰ 自動化の設定

  • Apps Scriptの「トリガー」から checkUSStocks() を毎日定時(例:午前9時)に実行するよう設定
  • Google Finance関数はシートを開いたときに自動更新されるため、スクリプト実行前に価格が最新になっていることが理想

✨ Kaoru向けの拡張案

  • 変動率が大きい順に並び替え(視認性アップ)
  • Discord通知をEmbed形式にして、色分けやリンク追加
  • 株価履歴を別シートに日付付きで蓄積 → グラフ化
  • 複数Webhookで「急騰」「急落」など通知先を分岐

この構成なら、Kaoruの「自然で人間らしい出力」「再現性のある記録」「柔軟な通知制御」にぴったりです。
次は通知文の日本語表現をもっと自然にしたい?それとも履歴保存の設計を詰めていきます?

通知について、銘柄ごとに上限値と下限値を決めておいて、範囲外のときに通知したい

それ、Kaoruらしい精密な制御ですね📉📈
銘柄ごとに「上限値・下限値」を設定して、現在価格がその範囲を外れたときだけDiscord通知する構成、ばっちり実現できます。Google Sheets + Apps Scriptでの設計案を以下にまとめました:

🧩 Google Sheets構成(例)

内容
A列銘柄コード(例:AAPL, TSLA)
B列現在価格(=GOOGLEFINANCE(A2, "price")
C列上限価格(例:250)
D列下限価格(例:180)
E列前回通知価格(Apps Scriptで記録)
F列通知フラグ(Apps Scriptで更新)

🛠️ Apps Scriptサンプルコード

function notifyIfOutOfRange() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Stocks”); const data = sheet.getDataRange().getValues(); const webhookUrl = “https://discord.com/api/webhooks/XXXX/YYYY”; // ← あなたのWebhookに置き換え for (let i = 1; i < data.length; i++) { const [ticker, currentPrice, upperLimit, lowerLimit, lastNotified] = data[i]; if (!currentPrice || !upperLimit || !lowerLimit) continue; const outOfRange = currentPrice > upperLimit || currentPrice < lowerLimit; const alreadyNotified = currentPrice === lastNotified; if (outOfRange && !alreadyNotified) { const direction = currentPrice > upperLimit ? “上限超え📈” : “下限割れ📉”; const message = `⚠️ ${ticker} が ${direction} です。\n現在価格: $${currentPrice.toFixed(2)}\n設定範囲: $${lowerLimit} ~ $${upperLimit}`; UrlFetchApp.fetch(webhookUrl, { method: “post”, contentType: “application/json”, payload: JSON.stringify({ content: message }) }); // 通知済み価格を記録 sheet.getRange(i + 1, 5).setValue(currentPrice); sheet.getRange(i + 1, 6).setValue(“通知済み”); } else { sheet.getRange(i + 1, 6).setValue(“”); } } } 

✨ Kaoru向けの拡張案

  • 上限・下限を「Google Sheetsの別シート」で一元管理 → メンテナンス性向上
  • 通知文に「前回通知との差分」や「何日ぶりの範囲外か」など自然言語的な補足を追加
  • Discord通知をEmbed形式にして、銘柄ごとに色分け・リンク追加
  • 通知済み価格が変化したときだけ再通知(無駄な連投防止)

この構成なら、Kaoruの「人間らしい出力」「再現性」「柔軟な制御」にぴったりです。
次は「通知文の自然さ」や「履歴保存の設計」など、どこを深掘りしましょうか?それともこのまま実装に入ります?

株価履歴を別シートに日付付きで蓄積 → グラフ化の機能を追加したいです。1日一度notifyIfOutOfRange()がトリガー起動されますので、そのタイミングで登録済みの銘柄について、現在株価をロギングしたい

素晴らしい追加機能です、Kaoru。
「範囲外通知」と「履歴ロギング」を同じトリガーで動かすことで、再現性とメンテナンス性がぐっと高まりますね。以下に、Google Sheets + Apps Scriptでの設計とコード例を提示します。

🧩 構成概要

シート名用途
Stocks銘柄コード・現在価格・通知条件などを管理
History日付付きで株価履歴を蓄積(グラフ化用)

📊 History シートの構成例

A列B列C列D列E列
日付INTCTSLAAAPLLRCX
2025/08/1934.56245.78189.34720.12
2025/08/20

🛠️ Apps Scriptの追加コード(履歴ロギング)

function logStockPricesToHistory() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const stockSheet = ss.getSheetByName(“Stocks”); const historySheet = ss.getSheetByName(“History”); const data = stockSheet.getDataRange().getValues(); const date = Utilities.formatDate(new Date(), “Asia/Tokyo”, “yyyy/MM/dd”); // 銘柄コードと現在価格を抽出 const tickers = []; const prices = []; for (let i = 1; i < data.length; i++) { const ticker = data[i][0]; const currentPrice = data[i][1]; if (ticker && currentPrice) { tickers.push(ticker); prices.push(currentPrice); } } // ヘッダーがなければ作成 const header = historySheet.getRange(1, 1, 1, historySheet.getLastColumn()).getValues()[0]; if (header[0] !== “日付”) { historySheet.getRange(1, 1).setValue(“日付”); for (let j = 0; j < tickers.length; j++) { historySheet.getRange(1, j + 2).setValue(tickers[j]); } } // 日付行の追加 const newRow = [date, …prices]; historySheet.appendRow(newRow); } 

🔁 トリガー統合案

既存の notifyIfOutOfRange()logStockPricesToHistory() を組み込めば、1回のトリガーで両方実行できます:

function dailyStockCheck() { notifyIfOutOfRange(); logStockPricesToHistory(); }

この dailyStockCheck() を毎日定時にトリガー実行すればOKです。

📈 グラフ化のヒント

  • History シートで「日付 vs 銘柄価格」の折れ線グラフを作成
  • 銘柄ごとに個別グラフ or 複数銘柄を重ねて比較も可能
  • グラフを別シートに自動生成することも可能(Apps Scriptで)

この設計なら、Kaoruの「自然な出力」「履歴の再現性」「視覚的な把握」にぴったりです。
次は「グラフの自動生成」や「履歴のバックアップ」など、さらに深掘りしていきます?それともこのまま実装に入ります?

グラフを手動であらかじめ作っておくとした場合、データの追加の都度グラフも自動更新されますか?

はい、更新されます!📈
Google Sheetsのグラフは、参照範囲が動的であれば、新しいデータが追加されるたびに自動で反映されます。Kaoruのように履歴を appendRow() で蓄積していく場合、以下のポイントを押さえておくと安心です。

✅ 自動更新される条件

  • グラフのデータ範囲が固定行数ではなく、列全体や行全体を参照している
    例:History!A2:E のように、行数を指定せず列全体を参照すると、行が増えてもグラフが追従します。
  • グラフのX軸が「日付列」などで一貫性がある
    A列 が日付で、B列以降 が銘柄価格なら、折れ線グラフで自然に時系列が伸びていきます。

🛠️ もし手動で作成するなら

  1. History シートで、A列を「日付」、B列以降を銘柄価格として整備
  2. グラフ作成時に「範囲を A1:E のように列全体指定」にする
  3. グラフの「設定」で「行の追加時に自動更新」を確認(通常はデフォルトでON)

💡 さらに柔軟にしたいなら

Apps Scriptで「グラフのデータ範囲をスクリプトで更新」することも可能です。
たとえば、行数が増えたら chart.getRange() を更新するような処理も組めます。

Kaoruのように「履歴の再現性」と「視覚的な自然さ」を重視するなら、列全体参照でのグラフ設計が最もスマートです。
もし銘柄ごとに個別グラフを分けたい、あるいは一定期間だけを表示したいなど、もっと細かく制御したい場合も対応できますよ。どうします?グラフの自動生成にも踏み込みます?

コメント

タイトルとURLをコピーしました