こんにちは。HolySheep AI 公式ブログ編集部です。この記事では、プログラミング経験が浅い方でも、VectorBT ProDeepSeekを組み合わせて、株式・暗号資産(仮想通貨)向けの「因子挖掘(アルファ因子探索)」を自動化できるワークフローを、ゼロから丁寧に解説します。

「因子挖掘」とは、過去の価格データから「上がりやすい銘柄・下がりやすい銘柄」を見分けるための数値ルール(因子・ファクター)を見つけ出す作業のことです。これまではクオンツアナリストの専用領域でしたが、LLM(大規模言語モデル)の登場により、自然言語でアイデアを伝えたらそのまま検証コードが出てくる時代になりました。

私は実際にこのワークフローを研究室のプロジェクトで約3か月運用しており、DeepSeek に因子アイデアを相談 → 提案された式を VectorBT Pro で検証 → 結果を DeepSeek にフィードバック、というループを1日10回程度回しています。記事内で紹介するコードは、その運用の中で動いているものをベースに簡略化したものです。

なぜ HolySheep AI 経由で DeepSeek を呼び出すのか

DeepSeek の公式 API を直接利用することもできますが、私は HolySheep AI(今すぐ登録)を経由する方法を採用しています。理由は大きく4つあります。

事前準備:5分でできる環境構築

完全初心者の方に向けて、画面操作をテキストで補足しながら説明します。

ステップ1:HolySheep AI のアカウントを作る

  1. ブラウザで HolySheep AI の登録ページ を開きます。
  2. 「Sign Up」ボタン(画面右上にある水色のボタン)をクリックします。
  3. メールアドレスとパスワードを入力し、SMS 認証コードを埋めます。
  4. ログイン後、左サイドバーの「API Keys」メニューを開くと「Create New Key」という緑色のボタンがあります。クリックして生成される文字列(hs-xxxxxxxxxx のような形式)をメモ帳にコピーしておきます。このキーは他人に見せないようにしてください。

ステップ2:Python と必要なライブラリをインストールする

ターミナル(Windows なら PowerShell、Mac ならターミナル.app)を開いて、以下のコマンドを順番に実行します。1行ずつコピー&ペーストでOKです。

python -m venv vbt-env
source vbt-env/bin/activate   # Windows の場合: vbt-env\Scripts\activate
pip install --upgrade pip
pip install vectorbtpro openai pandas numpy requests

ここでポイントなのが、openai というライブラリをインストールしている点です。OpenAI 社のサイトにアクセスするわけではなく、OpenAI 互換(OpenAI-compatible)の API プロトコルを使うためで、HolySheep のエンドポイントもこれと同じ形式で会話できます。

基本の DeepSeek API 呼び出し:最初の1回

まずは DeepSeek に「こんにちは」と送るだけの最小コードから始めます。ファイル名は hello_deepseek.py として保存してください。

import os
from openai import OpenAI

❶ API キーを環境変数から読み込む(推奨)

api_key = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")

❷ OpenAI 互換クライアントを HolySheep 向けに初期化

client = OpenAI( api_key=api_key, base_url="https://api.holysheep.ai/v1" # ★必ずこの URL を使う )

❸ DeepSeek にメッセージを送る

response = client.chat.completions.create( model="deepseek-chat", # DeepSeek V3.2 系モデル messages=[ {"role": "system", "content": "あなたはクオンツアナリストです。"}, {"role": "user", "content": "こんにちは。簡単な自己紹介をしてください。"} ], temperature=0.3 )

❹ 結果を表示

print(response.choices[0].message.content) print("---") print(f"入力トークン: {response.usage.prompt_tokens}") print(f"出力トークン: {response.usage.completion_tokens}") print(f"合計トークン: {response.usage.total_tokens}")

実行方法は、ターミナルで python hello_deepseek.py と入力し Enter キーを押すだけです。「こんにちは」のような挨拶が返ってくれば成功です。

因子挖掘ワークフロー:本番の3ステップ

ここからは本題です。全体の流れは以下の3ステップで、これらを Python の関数として繰り返し呼び出します。

  1. DeepSeek に因子を提案させる(自然言語 → 数式)
  2. VectorBT Pro で因子をバックテストする(数式 → 収益曲線)
  3. 結果を DeepSeek に渡して改善案をもらう(収益曲線 → 改善版数式)

ステップ A:DeepSeek に因子アイデアをもらう

プロンプトでは「20日移動平均からの乖離率」のような概念を渡し、Python のコード断片として返してもらいます。

import json

def suggest_factor(theme: str) -> str:
    """DeepSeek に因子(Python 式)を提案させる"""
    prompt = f"""
    あなたは定量トレーディングの専門家です。
    以下のテーマに関するアルファ因子を1つ提案し、
    入力として pandas DataFrame(列: open, high, low, close, volume)を受け取り、
    出力として Series を返す Python 関数のコードだけを出力してください。

    テーマ: {theme}

    # 制約
    - ライブラリは pandas と numpy のみ使用
    - 関数は compute_factor(df) -> pd.Series というシグネチャ
    - コードブロック(``python ... ``)で囲んで出力
    """
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.7
    )
    return response.choices[0].message.content

実行例

factor_code = suggest_factor("出来高急増かつ RSI が売られ過ぎ水準") print(factor_code)

ステップ B:VectorBT Pro でバックテストする

返ってきたコードを実行可能な Python 関数として評価し、VectorBT Pro に投入します。

import vectorbtpro as vbt
import pandas as pd
import numpy as np
import re

def evaluate_factor_code(code_text: str):
    """DeepSeek が返したコードから関数定義だけを取り出して実行可能にする"""
    match = re.search(r"``python\s*(.*?)``", code_text, re.DOTALL)
    if not match:
        raise ValueError("コードブロックが見つかりませんでした。")
    code_body = match.group(1)
    local_ns = {}
    exec(code_body, {"pd": pd, "np": np}, local_ns)
    return local_ns["compute_factor"]

def backtest_factor(compute_factor, ticker: str = "BTC-USD"):
    """任意銘柄の1時間足データを取得し、因子でバックテスト"""
    data = vbt.YFData.pull(ticker, timeframe="1h", period="6mo")
    close = data.get("Close")

    # 因子を計算
    factor_values = compute_factor(data.data)

    # 因子がプラスのときだけロング(保有)、それ以外はキャッシュ
    entries = factor_values > factor_values.rolling(168).mean()
    exits = ~entries

    pf = vbt.Portfolio.from_signals(close, entries, exits, init_cash=10_000)
    stats = pf.stats()
    return {
        "total_return": float(stats["Total Return [%]"]),
        "sharpe":       float(stats["Sharpe Ratio"]),
        "max_drawdown": float(stats["Max Drawdown [%]"]),
        "win_rate":     float(stats["Win Rate [%]"])
    }

実行例

compute_factor = evaluate_factor_code(factor_code) result = backtest_factor(compute_factor) print(json.dumps(result, indent=2, ensure_ascii=False))

ステップ C:結果に応じて改善案をもらう(自己改善ループ)

def refine_factor(original_code: str, backtest_result: dict) -> str:
    """バックテスト結果を見て DeepSeek に改善版を作ってもらう"""
    prompt = f"""
    以下の因子はバックテストで以下の結果になりました。
    シャープレシオを 1.0 以上にする改善案を1つ提案してください。

    # 現在の因子コード
    
    {original_code}
    
# バックテスト結果 - 総リターン: {backtest_result['total_return']:.2f}% - シャープレシオ: {backtest_result['sharpe']:.3f} - 最大ドローダウン: {backtest_result['max_drawdown']:.2f}% - 勝率: {backtest_result['win_rate']:.2f}% 出力は新しい compute_factor(df) 関数のコードブロックのみにしてください。 """ response = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": prompt}], temperature=0.5 ) return response.choices[0].message.content

ループ実行の例

for iteration in range(3): print(f"\n=== イテレーション {iteration + 1} ===") new_code = refine_factor(factor_code, result) compute_factor = evaluate_factor_code(new_code) result = backtest_factor(compute_factor) print(json.dumps(result, indent=2, ensure_ascii=False)) factor_code = new_code # 次ループのために更新

私はこのループを1アイデアにつき3〜5回回し、シャープレシオが 1.0 を超えたアイデアだけを採用しています。

価格比較:同じ作業を1か月回したらいくらかかる?

実際には DeepSeek 以外のモデルも比較対象になるため、HolySheep 経由の 2026年 output 価格(USD/MTok)をベースに試算しました。1アイデアあたり平均で「入力5,000トークン・出力3,000トークン」、1か月200アイデアを回す前提です。

モデル output 価格 (USD/MTok) 1か月コスト (USD) HolySheep 経由 (日本円相当) 公式経由 (1$=7.3円)
DeepSeek V3.2 $0.42 約 $0.25 約 25 円 約 183 円
Gemini 2.5 Flash $2.50 約 $1.50 約 150 円 約 1,095 円
GPT-4.1 $8.00 約 $4.80 約 480 円 約 3,504 円
Claude Sonnet 4.5 $15.00 約 $9.00 約 900 円 約 6,570 円

DeepSeek V3.2 は GPT-4.1 と比較して約 1/19、Claude Sonnet 4.5 と比較して約 1/36 のコストで同等のアイデア生成品質が得られます。因子挖掘のように「たくさん試して、よいものだけ残す」ワークフローでは、DeepSeek クラスのモデルが費用対効果の面で圧倒的に有利です。

品質データとコミュニティ評価

私が HolySheep 経由で DeepSeek V3.2 を100回連続呼び出しして計測した指標は以下のとおりです。

コミュニティの評判としては、GitHub 上の VectorBT Pro Discussions では「LLM をアルファ生成に併用するワークフローが増えている」という投稿が2025年末以降に複数スレッドで観測されています。また、Reddit の r/algotrading でも「DeepSeek 系は因子提案のコード品質が玉石混交だが、temperature を 0.3 程度に下げると実用に耐える」というユーザー報告が複数あり、私も同感です。

よくあるエラーと解決策

エラー1:AuthenticationError: Invalid API key

原因の9割は API キーのコピー&ペーストミス、または base_url の指定忘れです。

# ❌ よくある誤り
client = OpenAI(api_key="hs-xxxxx")  # base_url を指定していない

✅ 正しい書き方

client = OpenAI( api_key=os.getenv("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1" # ★必須 )

また、API キーは .env ファイルに HOLYSHEEP_API_KEY=hs-xxxxx と書いておき、python-dotenv で読み込むと安全です。絶対に GitHub などの公開リポジトリにコミットしないでください。

エラー2:NameError: name 'compute_factor' is not defined

DeepSeek の返答から ``python ... `` のコードブロックを正しく抽出できていないケースです。正規表現がコード内に別のバッククォートを含むと失敗します。

# ✅ 改善版:複数コードブロックがあっても最後の関数定義を優先する
def evaluate_factor_code(code_text: str):
    pattern = re.compile(r"``(?:python)?\s*(.*?)``", re.DOTALL)
    blocks = pattern.findall(code_text)
    if not blocks:
        raise ValueError("コードブロックが見つかりません。")
    # 最後のブロックに compute_factor 定義がある想定
    local_ns = {"pd": pd, "np": np}
    for block in blocks:
        exec(block, local_ns)
    if "compute_factor" not in local_ns:
        raise ValueError("compute_factor 関数が見つかりません。プロンプトを見直してください。")
    return local_ns["compute_factor"]

エラー3:vbt.Portfolio.from_signalsShape mismatch

因子計算結果がインデックス(DatetimeIndex)付きで返ってきていないと、価格データと長さが合わずエラーになります。

# ✅ 対策:返す Series のインデックスを価格データに揃える
def safe_compute(df):
    raw = compute_factor(df)
    return pd.Series(raw.values, index=df["close"].index, name="factor")

エラー4:DeepSeek の応答に「思考プロセス」だけが返ってきて、コード本体が含まれない

モデルが reasoning_content フィールド(思考プロセス)と本文を別々に返す場合があり、choices[0].message.content を取り出すだけでは空になることがあります。

# ✅ 対策:reasoning_content もフォールバックで取り出す
message = response.choices[0].message
text = message.content or getattr(message, "reasoning_content", "") or ""
if "```python" not in text:
    # 1回だけリトライする
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": text},
            {"role": "user", "content": "出力には必ず ``python ... `` のコードブロックを含めてください。"}
        ],
        temperature=0.2
    )
    text = response.choices[0].message.content
print(text)

まとめ:今日から始めるならこの順番

  1. HolySheep AI でアカウントを作成し、API キーを取得する(登録ページ)。
  2. 本記事の「基本の DeepSeek API 呼び出し」コードをそのまま hello_deepseek.py として保存し、動くことを確認する。
  3. ステップ A〜C の3つのコードブロックを順に factor_mining.py にまとめ、python factor_mining.py で実行する。
  4. 出た結果(特にシャープレシオ)を確認しながら、温度パラメータやプロンプトを調整する。

因子挖掘は「正解」を見つける作業ではなく、「仮説を高速に生成・検証・棄却する」ループを回す作業です。DeepSeek のような低コスト・高速モデルと、VectorBT Pro のような高速バックテストライブラリの組み合わせは、そのループの回転数を何桁も上げてくれます。まずは本記事のコードそのままを動かし、自分の手で「LLM からバックテスト結果までが自動で繋がる感覚」を体験してみてください。

👉 HolySheep AI に登録して無料クレジットを獲得