見出し画像

AutoGenをガッツリ試してみる:GroupChatを利用したマルチエージェントシステム2(株価の分析)

概要

前回はAutoGenのGroupChatを利用したマルチエージェントの簡単なサンプルを作ってみました。今回は、より発展的なサンプルを作っていきます。前回はプロダクトマネージャとレビュアーというシンプルな構成でしたが、今回は、より多くのエージェントを協調させて株価を分析してみます。

マルチエージェントを用いた株価分析

説明は前回したので、今回はいきなりコードを作っていきましょう。今回登場するエージェントは、管理者(ユーザとのインタフェース)、エンジニア、アナリスト、プランナー、コーダー、評論家という何と6名のエージェントを協調させてみましょう。そんなに沢山要らないと思うけど、一旦動かしてみましょう。

初期化

今回は、さらに文章が長くなるので昨日発表されたgpt-4を使っていきます。2023/11/8現在だとrate limitが厳しいので程々に・・・

import autogen
config_list = [
    {
        "model": "gpt-4-1106-preview",
        "api_key": "<API KEYを入れる>",
        "request_timeout": 600
    }
]
gpt4_config = {
    "seed": 60,  # change the seed for different trials
    "temperature": 0,
    "config_list": config_list,
}

エージェントの作成

総勢6名のエージェントを作成していきます。それぞれに指示を与えてあげましょう。

user_proxy = autogen.UserProxyAgent(
   name="Admin",
   system_message="人間の管理者。プランナーと対話してプランについて話し合います。計画の実行はこの管理者によって承認される必要があります。",
   code_execution_config=False,
)

engineer = autogen.AssistantAgent(
    name="Engineer",
    llm_config=gpt4_config,
    system_message='''エンジニア。承認された計画に従います。
タスクを解決するには、Python/シェル コードを記述します。スクリプト タイプを指定するコード ブロックでコードをラップします。
ユーザーはコードを変更できません。したがって、他の人が修正する必要がある不完全なコードは提案しないでください。
コード ブロックがエグゼキュータによって実行されることを意図していない場合は、コード ブロックを使用しないでください。
1 つの応答に複数のコード ブロックを含めないでください。他の人に結果をコピーして貼り付けるように依頼しないでください。
エグゼキューターから返された実行結果を確認します。 結果にエラーがある場合は、エラーを修正してコードを再出力します。
部分的なコードやコードの変更ではなく、完全なコードを提案してください。
エラーを修正できない場合、またはコードが正常に実行された後でもタスクが解決されない場合は、問題を分析し、仮定を再考し、必要な追加情報を収集し、別のアプローチを検討します。''',
)

scientist = autogen.AssistantAgent(
    name="Analyst",
    llm_config=gpt4_config,
    system_message="""アナリスト。承認された計画に従います。株価の分析をし、銘柄同士の値動きの強さを比較できます。あなたはコードを書きません。"""
)

planner = autogen.AssistantAgent(
    name="Planner",
    system_message='''プランナー。プランを提案します。
管理者と評論家からのフィードバックに基づいて、管理者の承認が得られるまで計画を修正します。 
計画には、コードを書けるエンジニアとコードを書かないアナリストが関与する可能性があります。
まずは計画を説明します。どのステップがエンジニアによって実行され、どのステップがアナリストによって実行されるかを明確にしてください。
''',
    llm_config=gpt4_config,
)

executor = autogen.UserProxyAgent(
    name="Executor",
    system_message="実行者。エンジニアが書いたコードを実行し、結果を報告します。",
    human_input_mode="NEVER",
    code_execution_config={"last_n_messages": 3, "work_dir": "stock-group", "use_docker": False},
)   

critic = autogen.AssistantAgent(
    name="Critic",
    system_message="""評論家。他のエージェントからのプラン、提案、コードをダブルチェックし、フィードバックと修正案を出力します。""",
    llm_config=gpt4_config,
)

グループの作成

ここは前回と同様。エージェントを指定してグループを作成しましょう。

groupchat = autogen.GroupChat(
    agents=[user_proxy, engineer, scientist, planner, executor, critic], 
    messages=[], max_round=50)

manager = autogen.GroupChatManager(
    groupchat=groupchat, llm_config=gpt4_config
)

実行

とりあえず何でも良いのですが、アップル・テスラ・マイクロソフト・グーグル・アマゾンについて、トレンドを分析してみましょう。昨日の実験では過去10日の騰落でしかトレンドを見てくれなかったので、複数指標で頑張ってもらいましょう。

user_proxy.initiate_chat(
    manager,
    message="""
アップル・テスラ・マイクロソフト・グーグル・アマゾンの直近2ヶ月の株価をyfinanceで取得し、3種類以上の指標で分析し、勢いのある銘柄を順に並べてください。
""",
)

結果

実行してみると、まずはプランナーが方針を考えてくれまして、承認を待ってくれているようです。ここから「作業を開始してください 」と入力してEnterをすると、実行を始めてくれるようです。

Admin (to chat_manager):


アップル・テスラ・マイクロソフト・グーグル・アマゾンの直近2ヶ月の株価をyfinanceで取得し、3種類以上の指標で分析し、勢いのある銘柄を順に並べてください。


--------------------------------------------------------------------------------
Planner (to chat_manager):

計画の概要:

1. データ取得: yfinanceを使用して、アップル (AAPL)、テスラ (TSLA)、マイクロソフト (MSFT)、グーグル (GOOGL)、アマゾン (AMZN) の直近2ヶ月の株価データを取得します。

2. データ前処理: 取得したデータをクリーニングし、分析に適した形式に整えます。

3. 指標計算: 3種類以上の指標(例: 移動平均、相対力指数 (RSI)、ボリンジャーバンドなど)を計算します。

4. 分析: 計算した指標を基に、各銘柄の勢いを分析します。

5. ランキング: 分析結果に基づき、勢いのある銘柄を順に並べます。

6. レポート作成: 分析結果とランキングをレポートにまとめます。

7. レビューとフィードバック: 管理者と評論家にレポートを提出し、フィードバックを受けます。

8. 最終調整: フィードバックに基づき、必要に応じて分析やレポートを修正します。

役割分担:

- エンジニアの役割:
  - ステップ1: yfinanceを使用して株価データを取得するコードを書く。
  - ステップ2: データ前処理のためのコードを書く。
  - ステップ3: 各種指標を計算するためのコードを書く。
  - ステップ4: 分析のためのコードを書く。
  - ステップ6: 分析結果をレポート形式で出力するコードを書く。

- アナリストの役割:
  - ステップ4: エンジニアが提供したデータと指標を用いて、勢いのある銘柄の分析を行う。
  - ステップ5: 分析結果に基づいて銘柄のランキングを作成する。
  - ステップ6: 分析結果とランキングをレポートにまとめる。
  - ステップ7: レビューとフィードバックを受ける。
  - ステップ8: フィードバックに基づいて分析やレポートを修正する。

この計画は管理者の承認を得るまで修正を繰り返します。フィードバックに基づいて、特定の指標の選択や分析方法を変更する可能性があります。また、レポートのフォーマットや内容の詳細についても調整が必要になるかもしれません。

--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation:

早速エンジニアがソースコードを作ってくれました。そのコードをExecutorが実行し、結果を表示してくれています。また、いくつかのテクニカル指標も出してくれていそうですね。

--------------------------------------------------------------------------------
Engineer (to chat_manager):

まず、yfinanceを使用してアップル (AAPL)、テスラ (TSLA)、マイクロソフト (MSFT)、グーグル (GOOGL)、アマゾン (AMZN) の直近2ヶ月の株価データを取得し、その後で指標を計算するコードを書きます。

以下のPythonコードは、上記の銘柄の株価データを取得し、移動平均 (MA)、相対力指数 (RSI)、およびボリンジャーバンド (BB) の3つの指標を計算します。

```python
import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# 銘柄リスト
tickers = ['AAPL', 'TSLA', 'MSFT', 'GOOGL', 'AMZN']

# 直近2ヶ月の日付を取得
end_date = datetime.now()
start_date = end_date - timedelta(days=60)

# 株価データを取得
data = {}
for ticker in tickers:
    data[ticker] = yf.download(ticker, start=start_date, end=end_date)

# 指標を計算する関数
def calculate_indicators(df):
    # 移動平均 (MA)
    df['MA20'] = df['Close'].rolling(window=20).mean()
    
    # 相対力指数 (RSI)
    delta = df['Close'].diff()
    gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
    loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
    rs = gain / loss
    df['RSI'] = 100 - (100 / (1 + rs))
    
    # ボリンジャーバンド (BB)
    df['BB_upper'] = df['MA20'] + (df['Close'].rolling(window=20).std() * 2)
    df['BB_lower'] = df['MA20'] - (df['Close'].rolling(window=20).std() * 2)
    
    return df

# 各銘柄の指標を計算
for ticker in tickers:
    data[ticker] = calculate_indicators(data[ticker])

# 最新の指標データを表示
for ticker in tickers:
    print(f"{ticker} 最新の指標データ:")
    print(data[ticker][['MA20', 'RSI', 'BB_upper', 'BB_lower']].tail(1))
    print()
```

このコードは、各銘柄の株価データを取得し、移動平均、RSI、ボリンジャーバンドを計算し、最新の指標データを表示します。次に、これらの指標を基にして勢いのある銘柄を分析し、ランキングを作成します。

--------------------------------------------------------------------------------

>>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...
Executor (to chat_manager):

exitcode: 0 (execution succeeded)
Code output: 

[*********************100%***********************]  1 of 1 completed

[*********************100%***********************]  1 of 1 completed

[*********************100%***********************]  1 of 1 completed

[*********************100%***********************]  1 of 1 completed

[*********************100%***********************]  1 of 1 completed
AAPL 最新の指標データ:
                  MA20        RSI    BB_upper    BB_lower
Date                                                     
2023-11-07  175.118002  61.140099  183.607196  166.628808

TSLA 最新の指標データ:
                  MA20        RSI    BB_upper    BB_lower
Date                                                     
2023-11-07  224.719499  37.748028  266.809174  182.629824

MSFT 最新の指標データ:
                  MA20        RSI    BB_upper    BB_lower
Date                                                     
2023-11-07  337.100003  73.299643  357.702139  316.497867

GOOGL 最新の指標データ:
                  MA20        RSI    BB_upper    BB_lower
Date                                                     
2023-11-07  132.259001  38.999043  145.417498  119.100504

AMZN 最新の指標データ:
                  MA20        RSI   BB_upper    BB_lower
Date                                                    
2023-11-07  131.270501  68.682734  143.21695  119.324051

さらに、この数値を受け、アナリストが各銘柄を分析してくれています。あんまり評論家が仕事してくれない・・・。

Analyst (to chat_manager):

株価データと指標が取得されました。次に、これらの指標を基にして各銘柄の勢いを分析し、ランキングを作成します。

分析のために、以下の基準を使用します:

1. 移動平均 (MA20): 株価が20日移動平均より上にある場合は強気、下にある場合は弱気と見なします。
2. 相対力指数 (RSI): RSIが70以上であれば買われ過ぎ(強気)、30以下であれば売られ過ぎ(弱気)と見なします。
3. ボリンジャーバンド (BB): 株価がボリンジャーバンドの上限に近いほど強気、下限に近いほど弱気と見なします。

各銘柄の最新の指標データを見ると、以下のようになります:

- アップル (AAPL): RSIが61.14で、20日移動平均より上にあります。強気の兆候が見られます。
- テスラ (TSLA): RSIが37.75で、20日移動平均より下にあります。弱気の兆候が見られます。
- マイクロソフト (MSFT): RSIが73.30で、20日移動平均より上にあります。非常に強気の兆候が見られます。
- グーグル (GOOGL): RSIが39.00で、20日移動平均より下にあります。弱気の兆候が見られます。
- アマゾン (AMZN): RSIが68.68で、20日移動平均より上にあります。強気の兆候が見られます。

これらの指標を基に、勢いのある銘柄を以下の順にランキングすることができます:

1. マイクロソフト (MSFT) - RSIが最も高く、強気のトレンドが最も強い。
2. アマゾン (AMZN) - RSIが高く、強気のトレンドが見られる。
3. アップル (AAPL) - RSIが中程度で、強気のトレンドが見られる。
4. テスラ (TSLA) - RSIが低く、弱気のトレンドが見られる。
5. グーグル (GOOGL) - RSIが最も低く、弱気のトレンドが最も強い。

このランキングは、最新の株価データと指標に基づいており、市場の変動によって変わる可能性があります。投資判断を行う際には、最新の市場情報と専門家のアドバイスを参考にしてください。

--------------------------------------------------------------------------------
Critic (to chat_manager):

作成されたランキングは、提供された指標に基づいて合理的に見えます。ただし、以下の点に注意してください:

1. **データの鮮度**:株価は常に変動しているため、分析は取得したデータの時点でのみ有効です。リアルタイムの分析や投資判断を行う場合は、最新のデータを使用する必要があります。

2. **指標の解釈**:指標はそれぞれ異なる市場状況を示唆しており、単一の指標に過度に依存することなく、全体的な市場の文脈で解釈することが重要です。

3. **追加の指標**:他の技術的指標やファンダメンタルズ分析も考慮に入れることで、よりバランスの取れた分析が可能になります。

4. **市場のセンチメント**:市場のセンチメントやニュース、業界の動向など、数値化できない要因も株価に影響を与えるため、これらも考慮する必要があります。

5. **統計的検証**:ランキングを作成する際には、統計的な手法を用いて指標の有効性を検証することが望ましいです。

6. **投資戦略との整合性**:投資家のリスク許容度や投資戦略に応じて、分析結果の解釈や利用方法が異なるため、個々の投資家に適したアドバイスを提供することが重要です。

以上の点を踏まえて、分析結果をレポートにまとめ、投資判断に役立てるための追加的な情報や解説を加えることをお勧めします。また、市場が開く前後での株価の変動や、特定のイベント(例えば、決算発表や重要なニュース)が分析結果に与える影響も考慮すると良いでしょう。

--------------------------------------------------------------------------------
Provide feedback to chat_manager. Press enter to skip and use auto-reply, or type 'exit' to end the conversation:

とはいえ、文章で言われても良くわからんので、これまでの分析結果を表にまとめてもらいましょう。「結果をmarkdownのテーブルにしてまとめてください」という指示を入れてあげると、以下のような結果を出力してくれました。RSIとMA20からマイクロソフトが強気、Googleが弱気という判定をしてくれていますね。ちゃんとした分析からは程遠いものの、一旦はこれで良しとしましょう。

Analyst (to chat_manager):

以下は、提供された指標に基づいて作成された銘柄のランキングをマークダウン形式のテーブルでまとめたものです。

| 順位 | 銘柄   | RSI     | 株価とMA20の関係 | 備考                     |
|------|--------|---------|------------------|--------------------------|
| 1    | MSFT   | 73.30   || 最も強気の兆候           |
| 2    | AMZN   | 68.68   || 強気の兆候あり           |
| 3    | AAPL   | 61.14   || 中程度の強気の兆候       |
| 4    | TSLA   | 37.75   || 弱気の兆候あり           |
| 5    | GOOGL  | 39.00   || 最も弱気の兆候           |

このテーブルは、各銘柄の相対力指数(RSI)と20日移動平均(MA20)に対する株価の位置を基にしています。RSIが70以上の銘柄は特に強気と見なされ、30以下の銘柄は特に弱気と見なされます。株価がMA20より上にある銘柄は強気のトレンドにあると考えられ、下にある銘柄は弱気のトレンドにあると考えられます。

おわりに

今回は、6人のエージェントを強調させた株価の分析を行ってみました。分析の性能はさておき、簡単にエージェントを協調させることが出来るのは非常に面白いですね。分析の方針なども全く指示していないのにもかかわらず、とりあえず文句も言わず、何かしら結果を出してくれるのは優秀ですね。次回は何をやってみようかな。

いいなと思ったら応援しよう!