前編のおさらい
前編では、以下を作りました:
- Googleスプレッドシートで株価を自動取得
- GASでGemini APIを呼び出し
- 結果をメールで受け取る
後編では、Claude・GPT-Xを追加して3社比較し、週1自動実行まで設定していきます。
まだ前編を読んでいない方は、先にそちらをご覧ください。
この記事でやること
- Claude API(Anthropic)を追加
- GPT-X API(OpenAI)を追加
- 3社の回答を比較できるようにする
- プロンプトのカスタマイズ方法
- 週1回の自動実行トリガーを設定
3社APIの特徴比較
まず、3つのAIの特徴を整理しておきます。
ポイント:
- コストを抑えたいならGeminiメイン
- 回答の質を重視するならGPT-4かClaude
- 3社比較して「多数決」で判断するのもアリ
Step 1: 3社対応のコードに拡張する
前編のコードを拡張して、3社すべてに問い合わせるバージョンを作ります。
以下のコードで丸ごと置き換えてください:
// ============================================
// 設定(ここを編集してください)
// ============================================
const CONFIG = {
// APIキー(それぞれ取得したキーを貼り付け)
GEMINI_API_KEY: 'ここにGeminiのAPIキーを貼り付け',
OPENAI_API_KEY: 'ここにOpenAIのAPIキーを貼り付け',
ANTHROPIC_API_KEY: 'ここにAnthropicのAPIキーを貼り付け',
// 通知先メールアドレス
EMAIL: 'あなたのメールアドレス@gmail.com',
// スプレッドシートの株価データ範囲
SHEET_NAME: 'シート1',
PRICE_RANGE: 'A2:B4',
// 使用するAI(true/falseで切り替え可能)
USE_GEMINI: true,
USE_GPT4: true,
USE_CLAUDE: true,
};
// ============================================
// メイン処理
// ============================================
function main() {
// 1. スプレッドシートから株価データを取得
const priceData = getStockPrices();
// 2. プロンプトを作成
const prompt = createPrompt(priceData);
// 3. 各AIに問い合わせ
const responses = {};
if (CONFIG.USE_GEMINI) {
Logger.log('Geminiに問い合わせ中...');
responses.gemini = askGemini(prompt);
}
if (CONFIG.USE_GPT4) {
Logger.log('GPT-4に問い合わせ中...');
responses.gpt4 = askGPT4(prompt);
}
if (CONFIG.USE_CLAUDE) {
Logger.log('Claudeに問い合わせ中...');
responses.claude = askClaude(prompt);
}
// 4. メールで通知
sendEmail(priceData, responses);
Logger.log('完了しました!');
}
// ============================================
// 株価データ取得
// ============================================
function getStockPrices() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.SHEET_NAME);
const data = sheet.getRange(CONFIG.PRICE_RANGE).getValues();
let result = [];
for (let i = 0; i < data.length; i++) {
if (data[i][0] && data[i][1]) {
result.push({
name: data[i][0],
price: data[i][1]
});
}
}
return result;
}
// ============================================
// プロンプト作成
// ============================================
function createPrompt(priceData) {
const today = new Date();
const dateStr = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy年MM月dd日');
// 株価データを文字列に
let priceText = '';
priceData.forEach(item => {
priceText += `・${item.name}: ${item.price}\n`;
});
// ============================================
// ★ プロンプトをカスタマイズするならここを編集 ★
// ============================================
const prompt = `
あなたは投資アドバイザーです。
今日は${dateStr}です。
以下のデータを元に、今週NISA成長枠で一括投資すべきか判断してください。
対象はS&P500連動のインデックスファンドです。
■ 現在の市場データ
${priceText}
■ 判断の観点(以下を考慮してください)
- 直近の株価トレンド
- 為替(ドル円)の水準
- 総合的な買い時かどうか
■ 出力形式(必ずこの形式で回答してください)
結論: 「買い」「様子見」「待機」のいずれか
推奨度: 0〜100のスコア
根拠: 3つ以内で簡潔に
来週の注目ポイント: 1つ
`;
return prompt;
}
// ============================================
// Gemini API呼び出し
// ============================================
function askGemini(prompt) {
const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=' + CONFIG.GEMINI_API_KEY;
const payload = {
contents: [{
parts: [{
text: prompt
}]
}]
};
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
if (json.candidates && json.candidates[0].content.parts[0].text) {
return json.candidates[0].content.parts[0].text;
} else {
return 'エラー: レスポンスの形式が不正です\n' + JSON.stringify(json);
}
} catch (e) {
return 'エラー: ' + e.toString();
}
}
// ============================================
// GPT-4 API呼び出し
// ============================================
function askGPT4(prompt) {
const url = 'https://api.openai.com/v1/chat/completions';
const payload = {
model: 'gpt-4o-mini', // コスト重視ならgpt-4o-mini、品質重視ならgpt-4o
messages: [
{
role: 'user',
content: prompt
}
],
max_tokens: 1000
};
const options = {
method: 'post',
contentType: 'application/json',
headers: {
'Authorization': 'Bearer ' + CONFIG.OPENAI_API_KEY
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
if (json.choices && json.choices[0].message.content) {
return json.choices[0].message.content;
} else {
return 'エラー: レスポンスの形式が不正です\n' + JSON.stringify(json);
}
} catch (e) {
return 'エラー: ' + e.toString();
}
}
// ============================================
// Claude API呼び出し
// ============================================
function askClaude(prompt) {
const url = 'https://api.anthropic.com/v1/messages';
const payload = {
model: 'claude-3-5-sonnet-20241022', // 最新のSonnetモデル
max_tokens: 1000,
messages: [
{
role: 'user',
content: prompt
}
]
};
const options = {
method: 'post',
contentType: 'application/json',
headers: {
'x-api-key': CONFIG.ANTHROPIC_API_KEY,
'anthropic-version': '2023-06-01'
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
try {
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
if (json.content && json.content[0].text) {
return json.content[0].text;
} else {
return 'エラー: レスポンスの形式が不正です\n' + JSON.stringify(json);
}
} catch (e) {
return 'エラー: ' + e.toString();
}
}
// ============================================
// メール送信
// ============================================
function sendEmail(priceData, responses) {
const today = new Date();
const dateStr = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy年MM月dd日');
// 株価データを文字列に
let priceText = '';
priceData.forEach(item => {
priceText += `・${item.name}: ${item.price}\n`;
});
// 各AIの回答を整形
let aiResponses = '';
if (responses.gemini) {
aiResponses += `
■ Geminiの判断
────────────────
${responses.gemini}
`;
}
if (responses.gpt4) {
aiResponses += `
■ GPT-4の判断
────────────────
${responses.gpt4}
`;
}
if (responses.claude) {
aiResponses += `
■ Claudeの判断
────────────────
${responses.claude}
`;
}
const subject = `【AI投資判断レポート】${dateStr}`;
const body = `
━━━━━━━━━━━━━━━━━━━━━━━━
NISA成長枠 AI投資判断レポート
━━━━━━━━━━━━━━━━━━━━━━━━
日付: ${dateStr}
■ 現在の市場データ
${priceText}
${aiResponses}
━━━━━━━━━━━━━━━━━━━━━━━━
※このレポートはAIによる参考情報です。
投資判断は自己責任でお願いします。
━━━━━━━━━━━━━━━━━━━━━━━━
`;
GmailApp.sendEmail(CONFIG.EMAIL, subject, body);
Logger.log('メール送信完了: ' + CONFIG.EMAIL);
}Step 2: 設定を編集する
コードの上部にあるを編集してください:CONFIG
const CONFIG = {
// 取得した各社のAPIキー
GEMINI_API_KEY: 'AIzaSy...',
OPENAI_API_KEY: 'sk-...',
ANTHROPIC_API_KEY: 'sk-ant-...',
// 通知先メールアドレス
EMAIL: 'your-email@gmail.com',
// スプレッドシートの設定
SHEET_NAME: 'シート1',
PRICE_RANGE: 'A2:B4',
// 使いたいAIだけtrueにする(コスト節約したい場合)
USE_GEMINI: true,
USE_GPT4: true,
USE_CLAUDE: true,
};ポイント:
- まずはGeminiだけ
trueにして動作確認するのがおすすめです - 動いたら他の2社も
trueにしてみてください - APIキーを取得していないサービスは
falseのままでOKです
Step 3: プロンプトをカスタマイズする
プロンプトはcreatePrompt関数の中にあります。自分の投資スタイルに合わせて編集できます。
カスタマイズ例1:テクニカル重視
■ 判断の観点(以下を考慮してください)
- 移動平均線(25日・75日)との乖離
- RSIやMACDなどのテクニカル指標
- 直近の下落率と反発の兆候カスタマイズ例2:マクロ経済重視
■ 判断の観点(以下を考慮してください)
- 米国金利(FFレート)の動向
- インフレ率(CPI)の推移
- 雇用統計の状況
- 為替(ドル円)のトレンドカスタマイズ例3:センチメント重視
■ 判断の観点(以下を考慮してください)
- VIX(恐怖指数)の水準
- 市場の楽観/悲観ムード
- 機関投資家のポジション動向カスタマイズ例4:おまかせ(総合判断)
■ 判断の観点
あなたの知識を総合的に活用して、今が買い時かどうか判断してください。
テクニカル、ファンダメンタルズ、センチメントすべてを考慮してください。Step 4: 週1回の自動実行を設定する
毎週月曜日の朝に自動実行するトリガーを設定します。
トリガーの設定手順
- GASエディタの左メニューから「トリガー」(時計アイコン)をクリック
- 右下の「+ トリガーを追加」をクリック
- 以下のように設定:
- 「保存」をクリック
これで毎週月曜日の朝に自動でメールが届くようになります!
実際の回答例(3社比較)
参考までに、実際に3社に同じ質問をしたときの回答例を紹介します。
Geminiの回答
結論: 様子見
推奨度: 55/100
根拠:
・S&P500は直近高値圏にあり、短期的な調整リスクがある
・ドル円が155円台と円安が進んでおり、為替リスクが高い
・VIXは低水準で市場は楽観的だが、反転の可能性も
来週の注目ポイント: FOMC議事録の公開内容
GPT-4の回答
結論: 様子見
推奨度: 50/100
根拠:
・株価は史上最高値圏で、バリュエーション面での割高感
・円安により日本円建ての購入コストが上昇
・金利動向が不透明で、株式市場への影響を見極める必要あり
来週の注目ポイント: 米国雇用統計の発表Claudeの回答
結論: 待機
推奨度: 40/100
根拠:
・現在の株価水準は過去平均と比較して高い位置にある
・為替が円安方向に振れており、今購入すると為替損のリスク
・年初一括のメリットを考慮しても、もう少し様子を見る方が安全
来週の注目ポイント: 日銀の金融政策決定会合3社比較の傾向
→ 「3社中2社以上が買いなら買う」というルールにするのもアリです!
運用のコツ
1. 結果をスプレッドシートに記録する
判断結果を蓄積しておくと、後で振り返りができます。メール通知と別に、スプレッドシートへの記録機能を追加するのもおすすめです。
2. APIコストを抑える
- Geminiだけ使う:完全無料で運用可能
- 週1回だけ実行:月4回程度なら3社使っても月額30円以下
- gpt-4o-miniを使う:GPT-4oより安く、十分な品質
3. 判断に従いすぎない
AIの判断はあくまで「参考情報」です。最終的な投資判断は自分で行いましょう。
- AIが「買い」と言っても、自分が不安なら様子見でOK
- AIが「待機」と言っても、長期投資なら気にせず買うのもアリ
- 「悩む時間を減らす」のが目的であり、AIに従うことが目的ではありません
よくあるエラーと対処法
「APIキーが無効です」
- キーをコピーし直してください
- 余分なスペースが入っていないか確認してください
- OpenAI/Anthropicは残高がないと動きません
「レスポンスの形式が不正です」
- APIの仕様が変わった可能性があります
- 「表示」→「ログ」でエラー内容を確認してください
「権限がありません」
- 初回実行時は権限の許可が必要です
- 「詳細」→「(安全ではないページ)に移動」→「許可」
メールが届かない
- 迷惑メールフォルダを確認してください
CONFIG.EMAILのアドレスが正しいか確認してください
まとめ
これで、毎週AIに投資判断を聞く仕組みが完成しました!
できるようになったこと
✅ 3社(Gemini・GPT-4・Claude)のAIに投資判断を聞ける
✅ 株価データを自動取得してプロンプトに含められる
✅ 毎週自動でメールが届く
✅ プロンプトを自分好みにカスタマイズできる
年初一括 vs AI判断、どちらが正解?
正直、「年初一括が統計的に有利」というのは事実です。でも、大事なのは「納得して投資できるかどうか」。
- 年初一括で迷わず買える人 → そのままでOK
- 毎年タイミングで悩む人 → AIに相談して決断のきっかけにする
この仕組みは「正解を教えてもらう」ためではなく、「悩む時間を減らす」ためのものです。
ぜひ活用してみてください!
注意事項
- 投資は自己責任です。AIの判断はあくまで参考情報であり、投資助言ではありません。
- AIは未来を予測できません。過去のデータに基づく判断には限界があります。
- APIの利用規約を確認の上、ご利用ください。
- 各社のAPI料金は変更される可能性があります。最新情報は公式サイトをご確認ください。
この記事が役に立ったら、Xでシェアしてもらえると嬉しいです!
質問や感想があれば、コメントでお気軽にどうぞ。
💬 コメント
ログイン か 会員登録 するとコメントできます