AimanaVo

サムネイル

年初一括 vs AI判断|NISA成長枠の買い時、生成AIで自動通知(後編)

  • 1

脱社畜AI @ モンロー

脱社畜AI @ モンロー

2026/01/28

前編のおさらい

前編では、以下を作りました:

  • Googleスプレッドシートで株価を自動取得
  • GASでGemini APIを呼び出し
  • 結果をメールで受け取る

後編では、Claude・GPT-Xを追加して3社比較し、週1自動実行まで設定していきます。

まだ前編を読んでいない方は、先にそちらをご覧ください。

この記事でやること

  1. Claude API(Anthropic)を追加
  2. GPT-X API(OpenAI)を追加
  3. 3社の回答を比較できるようにする
  4. プロンプトのカスタマイズ方法
  5. 週1回の自動実行トリガーを設定

3社APIの特徴比較

まず、3つのAIの特徴を整理しておきます。

項目
Gemini
GPT-4
Claude
提供元
Google
OpenAI
Anthropic
料金
無料枠あり
従量課金
従量課金
1回あたり目安
0円
約3〜5円
約2〜4円
Web検索連携
◎(楽)
△(複雑)
△(別途対応)
日本語の自然さ
回答の慎重さ
やや楽観的
バランス型
慎重め

ポイント

  • コストを抑えたいなら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回の自動実行を設定する

毎週月曜日の朝に自動実行するトリガーを設定します。

トリガーの設定手順

  1. GASエディタの左メニューから「トリガー」(時計アイコン)をクリック
  2. 右下の「+ トリガーを追加」をクリック
  3. 以下のように設定:
  4. 「保存」をクリック
項目
設定値
実行する関数
main
イベントのソース
時間主導型
時間ベースのトリガータイプ
週ベースのタイマー
曜日
毎週月曜日
時刻
午前7時〜8時(お好みで)

これで毎週月曜日の朝に自動でメールが届くようになります!

実際の回答例(3社比較)

参考までに、実際に3社に同じ質問をしたときの回答例を紹介します。

Geminiの回答

結論: 様子見
推奨度: 55/100
根拠:
・S&P500は直近高値圏にあり、短期的な調整リスクがある
・ドル円が155円台と円安が進んでおり、為替リスクが高い
・VIXは低水準で市場は楽観的だが、反転の可能性も
来週の注目ポイント: FOMC議事録の公開内容

GPT-4の回答

結論: 様子見
推奨度: 50/100
根拠:
・株価は史上最高値圏で、バリュエーション面での割高感
・円安により日本円建ての購入コストが上昇
・金利動向が不透明で、株式市場への影響を見極める必要あり
来週の注目ポイント: 米国雇用統計の発表

Claudeの回答

結論: 待機
推奨度: 40/100
根拠:
・現在の株価水準は過去平均と比較して高い位置にある
・為替が円安方向に振れており、今購入すると為替損のリスク
・年初一括のメリットを考慮しても、もう少し様子を見る方が安全
来週の注目ポイント: 日銀の金融政策決定会合

3社比較の傾向

AI
傾向
Gemini
やや楽観的、行動を促す傾向
GPT-4
バランス型、中立的な判断
Claude
慎重め、リスクを重視する傾向

→ 「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でシェアしてもらえると嬉しいです!

質問や感想があれば、コメントでお気軽にどうぞ。