如何用python開發一個類似Alpha Arena 測試AI模型執行金融自動交易的程式

更新 發佈閱讀 33 分鐘

先針對要測試的AI模型,給予 Prompt (制定其執行規則和範圍):

  1. 這是一份針對量化交易 AI 的提示詞(Prompt):

角色定義 (ROLE DEFINITION)

你是 Alpha-Q,一個由 Gemini 2.5 Pro 驅動的菁英自主量化交易智能體。你的首要目標不僅是追求「高回報」,而是「高風險調整後回報」(最大化夏普比率 Sharpe Ratio)。
你正在參加 Alpha Arena 基準測試。
你的生存取決於嚴格的本金保全。

關鍵約束(鐵律) (CRITICAL CONSTRAINTS)

本金保全至上: 「錯失交易」優於「虧損」。如果訊號模稜兩可,行動必須是 HOLD(持倉觀望)。
費用意識: 每筆交易都會產生 0.05% 的吃單(Taker)費用 + 預估 0.02% 的滑點。你的預期利潤必須超過 0.2% 才能考慮建倉。
不要為了微薄利潤進行剝頭皮交易(Scalping);你會因此失血過多。
禁止「接刀」(No "Knife Catching"): 不要僅僅因為價格快速下跌(RSI 超賣)就買入。
你是趨勢追隨者,不是均值回歸的賭徒。在逆勢進場前,等待確認訊號(「更高的低點」或特定的 K 線反轉型態)。
強制止損: 每筆交易都必須設定計算好的止損(SL)位。
絕不在沒有出場計畫的情況下進場。

回撤限制: 如果當前總回撤(Drawdown)接近 8%,進入「生存模式」(將部位規模減少 50%)。

比賽會在回撤達 -10% 時將你淘汰。

決策框架(思維鏈) (DECISION FRAMEWORK)

在生成 JSON 輸出之前,你必須執行逐步推理過程:

步驟 1:市場體制識別 (Market Regime Identification)

分析輸入數據(OHLCV)。

確定當前體制:[上漲趨勢 / 下跌趨勢 / 震盪整理 / 高波動混亂]。

規則: 如果是「高波動混亂」或低成交量的「震盪整理」 -> 行動:HOLD。

步驟 2:訊號共振檢查(至少需要 2 個確認) (Signal Confluence Check)

不要依賴單一指標。

共振範例:「價格在 EMA 200 之上」(趨勢)且「RSI 背離」(動能)且「成交量激增」(驗證)。

如果共振計數 < 2 -> 行動:HOLD。

步驟 3:風險/回報計算 (Risk/Reward Calculation)

計算到失效點(止損 Stop Loss)的距離。

計算到目標點(止盈 Take Profit)的距離。

如果(回報 / 風險)< 1.5 -> 行動:HOLD。

輸出格式 (OUTPUT FORMAT)

你必須嚴格輸出僅一個 JSON 物件。不要包含任何對話填充詞。

raw-image


2. python程式如下: (因我手上只有 Gemini API,故以Gemini 2.5 pro模型,binance交易所的測試虛擬幣環境為主)
本例python檔名: testbinance.py

import time
import json
import logging
import sys
import requests
import csv
import os
# Windows 編碼修正
sys.stdout.reconfigure(encoding='utf-8')

import ccxt
import pandas as pd
import ta
import google.generativeai as genai

# Windows 系統編碼修正 (防止控制台輸出亂碼)
sys.stdout.reconfigure(encoding='utf-8')

# ================= 配置區域 =================

# Line Messaging API 設定
LINE_CHANNEL_ACCESS_TOKEN = 'Your_LINE_CHANNEL_ACCESS_TOKEN'
LINE_USER_ID = 'Your_LINE_USER_ID'

SYMBOL = 'BTC/USDT'
AMOUNT_USDT = 100
CSV_FILENAME = 'trade_history.csv'
# ===========================================
# ==========================================
# CONFIG 設定
# ==========================================
CONFIG = {
"GEMINI_API_KEY": "Your_GEMINI_API_KEY",
"MODEL_NAME": "gemini-2.5-pro",

# ⚠️ 請務必填入從 https://testnet.binance.vision/ (GitHub登入) 申請的新鑰匙
"TESTNET_API_KEY": "Your_TESTNET_API_KEYZ",
"TESTNET_SECRET": "Your_TESTNET_SECRET",

"SYMBOL": "BTC/USDT",
"TIMEFRAME": "15m",
"CHECK_INTERVAL": 60,
}

# 日誌設定
logger = logging.getLogger("GeminiSpotBot")
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler("gemini_spot.log", encoding='utf-8')
file_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(message)s'))
logger.addHandler(file_handler)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] %(message)s'))
logger.addHandler(stream_handler)

# ==========================================
# Gemini 模型
# ==========================================
def init_gemini_model():
genai.configure(api_key=CONFIG["GEMINI_API_KEY"])
system_instruction = """
You are a Crypto Spot Trading Bot (Long Only).
RULES:
1. Market: Binance Spot Testnet.
2. Strategy: Buy Low, Sell High.
3. Action 'SELL' -> Sell BTC for USDT.
4. Action 'BUY' -> Buy BTC with USDT.
5. Output JSON only.
"""
model = genai.GenerativeModel(
model_name=CONFIG["MODEL_NAME"],
system_instruction=system_instruction,
generation_config={"temperature": 0.1, "response_mime_type": "application/json"}
)
return model

gemini_model = None

def ask_gemini(market_data, account_state):
global gemini_model
prompt = f"""
STATE: {account_state}
DATA: Price={market_data['price']}, EMA200={market_data['ema']}, RSI={market_data['rsi']:.1f}
TASK: Decide action (BUY / SELL / HOLD). Return JSON.
SCHEMA: {{"thought_process": "str", "action": "BUY/SELL/HOLD", "trade_amount_usdt": float}}
"""
try:
response = gemini_model.generate_content(prompt)
return json.loads(response.text)
except Exception as e:
logger.error(f"[API ERROR] Gemini: {e}")
return {"action": "HOLD"}

def send_line_message(msg):
"""
使用 Line Messaging API (Push Message) 發送通知
"""
if not LINE_CHANNEL_ACCESS_TOKEN or not LINE_USER_ID:
print("❌ Line Token 或 User ID 未設定,跳過通知")
return

url = 'https://api.line.me/v2/bot/message/push'

headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {LINE_CHANNEL_ACCESS_TOKEN}'
}

data = {
'to': LINE_USER_ID,
'messages': [
{
'type': 'text',
'text': msg
}
]
}

try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code != 200:
print(f"❌ Line 通知發送失敗: {response.text}")
else:
print("✅ Line 通知發送成功")
except Exception as e:
print(f"❌ Line 請求錯誤: {e}")

# ==========================================
# 現貨執行引擎 (Spot Execution Engine)
# ==========================================
class SpotExecutionEngine:
def __init__(self, api_key, secret, symbol):
self.symbol = symbol

# 初始化
self.exchange = ccxt.binance({
'apiKey': api_key,
'secret': secret,
'enableRateLimit': True,
'options': {
'defaultType': 'spot',
'adjustForTimeDifference': True
}
})

# 強制指定現貨測試網 URL (這是正確的,不要改)
self.exchange.urls['api']['public'] = 'https://testnet.binance.vision/api/v3'
self.exchange.urls['api']['private'] = 'https://testnet.binance.vision/api/v3'

# === 開機前自我檢查 ===
try:
self.exchange.set_sandbox_mode(True)
print("正在驗證 API Key...")
self.exchange.load_markets()
bal = self.exchange.fetch_balance()
usdt = bal.get('USDT', {}).get('free', 0)
print(f"✅ 驗證成功!帳戶 USDT 餘額: {usdt}")
print("提示: 如果餘額是 0,您可以去 testnet.binance.vision 下方的 Faucet 領取測試幣。")
self.valid = True
except Exception as e:
print("\n" + "="*40)
print("❌ 嚴重錯誤:API Key 驗證失敗")
print(f"錯誤代碼: {e}")
print("="*40)
print("可能原因:")
print("1. 您使用的是【合約 Futures】的 Key,但此程式連線的是【現貨 Spot】。")
print("2. 您使用的是正式網的 Key。")
print("解決方法:")
print("請去 https://testnet.binance.vision/ 用 GitHub 登入申請新 Key。")
print("="*40 + "\n")
self.valid = False

def get_state_str(self):
try:
bal = self.exchange.fetch_balance()
usdt_free = bal.get('USDT', {}).get('free', 0)
base_currency = self.symbol.split('/')[0]
base_free = bal.get(base_currency, {}).get('free', 0)

has_position = base_free > 0.0001
if has_position:
return f"Status: HOLDING {base_currency}. Amt: {base_free:.5f}. Cash: {usdt_free:.2f}"
return f"Status: CASH ONLY. USDT: {usdt_free:.2f}"
except Exception:
return "Error getting state"

def execute(self, decision, current_price):
action = decision.get('action')

bal = self.exchange.fetch_balance()
usdt_free = bal.get('USDT', {}).get('free', 0)
base_currency = self.symbol.split('/')[0]
base_free = bal.get(base_currency, {}).get('free', 0)

if action == "BUY":
if usdt_free < 10:
logger.info("USDT 不足 < 10")
return

amount_usdt = float(decision.get('trade_amount_usdt', usdt_free * 0.95))
if amount_usdt > usdt_free: amount_usdt = usdt_free

amount = amount_usdt / current_price
amount = self.exchange.amount_to_precision(self.symbol, amount)

try:
self.exchange.create_order(self.symbol, 'market', 'buy', amount)
logger.info(f"🚀 [買入] {amount} {base_currency}")
send_line_message(f"🚀 機器人啟動成功\n交易對 買入: {self.symbol}\n餘額: {amount} USDT ")
except Exception as e:
logger.error(f"下單失敗: {e}")

elif action == "SELL":
if base_free * current_price < 10:
logger.info("資產不足 < 10 USD")
return

amount = self.exchange.amount_to_precision(self.symbol, base_free)
try:
self.exchange.create_order(self.symbol, 'market', 'sell', amount)
logger.info(f"💰 [賣出] {amount} {base_currency}")
send_line_message(f"🚀 機器人啟動成功\n交易對 賣出: {self.symbol}\n餘額: {amount} USDT ")
except Exception as e:
logger.error(f"下單失敗: {e}")
# ==========================================
# 數據層
# ==========================================
class SpotMarketDataProvider:
def __init__(self, symbol, timeframe):
self.symbol = symbol
self.timeframe = timeframe
self.exchange = ccxt.binance({'options': {'defaultType': 'spot'}})
self.exchange.urls['api']['public'] = 'https://testnet.binance.vision/api/v3'
self.exchange.urls['api']['private'] = 'https://testnet.binance.vision/api/v3'

def get_snapshot(self):
try:
ohlcv = self.exchange.fetch_ohlcv(self.symbol, self.timeframe, limit=200)
df = pd.DataFrame(ohlcv, columns=['ts', 'open', 'high', 'low', 'close', 'vol'])
df['ema_200'] = ta.trend.ema_indicator(df['close'], window=200)
df['rsi'] = ta.momentum.rsi(df['close'], window=14)
df = df.dropna()
if df.empty: return None
curr = df.iloc[-1]
return {"price": curr['close'], "ema": curr['ema_200'], "rsi": curr['rsi']}
except Exception as e:
logger.error(f"數據錯誤: {e}")
return None
# ==========================================
# 主程式
# ==========================================
def main():
logger.info("=== Alpha-Gemini (Spot Final) Started ===")

try:
global gemini_model
gemini_model = init_gemini_model()
except Exception as e:
logger.error(f"Gemini 初始化失敗: {e}")
return

# 初始化引擎
engine = SpotExecutionEngine(CONFIG['TESTNET_API_KEY'], CONFIG['TESTNET_SECRET'], CONFIG['SYMBOL'])

# 如果 Key 驗證失敗,直接停止程式,不要空轉
if not engine.valid:
print("程式已停止:請更換正確的 API Key。")
return

provider = SpotMarketDataProvider(CONFIG['SYMBOL'], CONFIG['TIMEFRAME'])

while True:
try:
data = provider.get_snapshot()
if not data:
time.sleep(10)
continue

state = engine.get_state_str()
logger.info(f"Price: {data['price']} | {state}")

decision = ask_gemini(data, state)

if decision.get('action') != "HOLD":
logger.info(f"AI Decision: {decision.get('action')} | {decision.get('thought_process')}")
engine.execute(decision, data['price'])
else:
if int(time.time()) % 300 < 10:
logger.info("Holding...")

time.sleep(CONFIG['CHECK_INTERVAL'])
except KeyboardInterrupt:
break
except Exception as e:
logger.error(f"Loop Error: {e}")
time.sleep(10)

if __name__ == "__main__":
main()

dos command 或 Shell command:
python testbinance.py

raw-image


這段程式碼是一個 AI 加密貨幣自動交易機器人

簡單來說,它結合了 Google Gemini AI(大腦)Binance 交易所(手腳),在 Binance 現貨測試網(Spot Testnet) 上進行自動買賣比特幣(BTC)。

以下是它具體執行的三個核心步驟與功能解析:

1. 觀察市場 (Market Data Layer)

機器人每隔 60 秒會透過 SpotMarketDataProvider 類別做以下事情:

  • 獲取數據: 從 Binance 抓取最新的 BTC/USDT K線圖(15分鐘線)。
  • 計算指標: 使用 ta 庫計算兩個關鍵技術指標:
raw-image

EMA 200 (指數移動平均線): 用來判斷長期趨勢(價格在線之上為牛市,之下為熊市)。
圖源:Shutterstock

raw-image

RSI (相對強弱指標): 用來判斷是否超買或超賣。
圖源: Shutterstock

  • 整理資訊: 將當前價格、趨勢狀態和 RSI 數值打包,準備餵給 AI。

2. AI 決策 (The Brain - Gemini)

這是程式的核心。它將整理好的市場數據和當前的帳戶餘額(有沒有持倉、剩下多少錢)發送給 Google Gemini AI

  • 角色設定: 告訴 AI 它是一個「只做多(Long Only)」的現貨交易員。
  • 策略邏輯: 要求 AI 根據數據判斷:
    • BUY (買入): 當價格低且趨勢好時,建議買入。
    • SELL (賣出): 當有獲利或趨勢反轉時,建議賣出變現。
    • HOLD (觀望): 市場不明朗時不動。
  • 輸出格式: 強制 AI 回傳 JSON 格式,方便程式讀取(包含決策動作、原因、建議金額)。

3. 執行交易 (Execution Layer)

收到 AI 的 JSON 指令後,SpotExecutionEngine 類別會負責執行:

  • 安全檢查:
    • 程式啟動時會先自我檢查 API Key 是否有效,並且確認連線的是「測試網」而非「正式網」,以免誤用真錢。
    • 下單前檢查餘額是否足夠(至少 10 USDT)。
  • 下單操作:
    • 如果 AI 喊 BUY:將 USDT 換成 BTC。
    • 如果 AI 喊 SELL:將手上的 BTC 全部賣成 USDT。
  • 日誌記錄: 將所有的決策、錯誤和交易結果寫入 gemini_spot.log 檔案,方便事後查詢。

總結

這是一個 「趨勢跟蹤 + AI 輔助判斷」 的自動交易系統。 它不會使用您的真實資金(因為強制連線到 Testnet),是一個用來測試 AI 交易策略是否有效的實驗性工具。

程式執行流程圖:

  1. 啟動 -> 2. 檢查 API Key -> 3. 抓取 K 線數據 -> 4. 計算 EMA/RSI -> 5. 詢問 Gemini AI -> 6. AI 回傳 JSON -> 7. Binance 下單 (買/賣) -> 8. 等待 60 秒 -> (回到步驟 3)
留言
avatar-img
Hank吳的沙龍
12會員
146內容數
這不僅僅是一個 Blog,更是一個交流與分享的空間。 期待在這裡與你相遇,一起探索科技、體驗生活、夢想旅行!💖
Hank吳的沙龍的其他內容
2025/11/30
Alpha Arena指的是nof1.ai研究實驗室所舉辦的高規格AI 交易基準測試和競賽平台。 Alpha Arena 在 2025 年10月底引起了廣泛關注,因為它率先開展了一項大型實驗,讓頂尖的大型語言模型 (LLM) 使用真實資金在即時加密貨幣市場中進行自主交易。
Thumbnail
2025/11/30
Alpha Arena指的是nof1.ai研究實驗室所舉辦的高規格AI 交易基準測試和競賽平台。 Alpha Arena 在 2025 年10月底引起了廣泛關注,因為它率先開展了一項大型實驗,讓頂尖的大型語言模型 (LLM) 使用真實資金在即時加密貨幣市場中進行自主交易。
Thumbnail
2025/11/29
釔(拼音:yǐ,注音:ㄧˇ,英語:Yttrium)是一種化學元素,化學符號為 Y,原子序數為 39。 它是一種銀白色的過渡金屬,在化學性質上與鑭系元素非常相似,因此通常被歸類為稀土元素(Rare-earth elements)。雖然它在日常生活中不常直接以金屬形態出現,但它的化合物在現代科技、電子
Thumbnail
2025/11/29
釔(拼音:yǐ,注音:ㄧˇ,英語:Yttrium)是一種化學元素,化學符號為 Y,原子序數為 39。 它是一種銀白色的過渡金屬,在化學性質上與鑭系元素非常相似,因此通常被歸類為稀土元素(Rare-earth elements)。雖然它在日常生活中不常直接以金屬形態出現,但它的化合物在現代科技、電子
Thumbnail
2025/11/28
要比較「AI 泡沫」與「網路泡沫(Dot-com Bubble)」,答案並非單純的二選一,而是取決於我們討論的是「金融資產的蒸發規模」還是「對人類社會運作的顛覆程度」。 目前的共識傾向於:AI 泡沫在「絕對金額」和「長期社會影響力」上,可能遠大於網路泡沫;但在「短期股市崩盤的慘烈度(跌幅)」上
Thumbnail
2025/11/28
要比較「AI 泡沫」與「網路泡沫(Dot-com Bubble)」,答案並非單純的二選一,而是取決於我們討論的是「金融資產的蒸發規模」還是「對人類社會運作的顛覆程度」。 目前的共識傾向於:AI 泡沫在「絕對金額」和「長期社會影響力」上,可能遠大於網路泡沫;但在「短期股市崩盤的慘烈度(跌幅)」上
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
我們在2025年交易系統與資產配置中有提到兩大主動投資的部分,其中主要關鍵的重點就是『Alpha』,他是衡量個股或投資組合是否能跑贏市場基準的重要指標。對於短線交易者來說,Alpha 的追求不僅代表了超額收益的可能性
Thumbnail
我們在2025年交易系統與資產配置中有提到兩大主動投資的部分,其中主要關鍵的重點就是『Alpha』,他是衡量個股或投資組合是否能跑贏市場基準的重要指標。對於短線交易者來說,Alpha 的追求不僅代表了超額收益的可能性
Thumbnail
重點摘要: FMS 選後預期大改變,對經濟前景高度樂觀 FMS 現金水位維持 4% 低檔,看好小型股優於大型股 FMS 倉位高度集中銀行股,取得超額報酬的難度頗高 --- 基金經理人問券調查 (Fund Manager Survey, FMS) 是針對全球機構投資者所做的問券調查,
Thumbnail
重點摘要: FMS 選後預期大改變,對經濟前景高度樂觀 FMS 現金水位維持 4% 低檔,看好小型股優於大型股 FMS 倉位高度集中銀行股,取得超額報酬的難度頗高 --- 基金經理人問券調查 (Fund Manager Survey, FMS) 是針對全球機構投資者所做的問券調查,
Thumbnail
截斷虧損,讓利潤奔跑 Hi,我是Alpha,經營方格子以來也一段時間了 有時會思考提供的訂閱內容能不能協助還在碰壁的人方向 我寫過我平常搭配的:分時量價、RSI,來分享給有讀到的人們 投資是一門探索自己的過程,大多時候;我們是希望可以從這過程讓生活更餘裕一些 大盤V轉無帶量 日本央行升降
Thumbnail
截斷虧損,讓利潤奔跑 Hi,我是Alpha,經營方格子以來也一段時間了 有時會思考提供的訂閱內容能不能協助還在碰壁的人方向 我寫過我平常搭配的:分時量價、RSI,來分享給有讀到的人們 投資是一門探索自己的過程,大多時候;我們是希望可以從這過程讓生活更餘裕一些 大盤V轉無帶量 日本央行升降
Thumbnail
MSFT 在 FY3Q24 繳出亮眼成績,其中最讓市場關注的 Azure 成長率 YoY +31% (上季為 +27%),不僅超越 Sell Side 預期 (也就是大家常聽到的市場預期) 的 +28.6%,更是超越大多數 Buy Side 預期的 +30%。
Thumbnail
MSFT 在 FY3Q24 繳出亮眼成績,其中最讓市場關注的 Azure 成長率 YoY +31% (上季為 +27%),不僅超越 Sell Side 預期 (也就是大家常聽到的市場預期) 的 +28.6%,更是超越大多數 Buy Side 預期的 +30%。
Thumbnail
DA交易者聯盟的成員來自各種金融專業背景,包括全球最大交易所幣安的百大交易員、著名的外匯操盤手以及美國頂尖商學院的畢業生。 透過匯聚業界的優秀人才,DA 交易者聯盟致力於提供卓越的金融教育和投資研究服務,旨在為投資者和交易者打造更豐富、更有價值的學習和投資環境。
Thumbnail
DA交易者聯盟的成員來自各種金融專業背景,包括全球最大交易所幣安的百大交易員、著名的外匯操盤手以及美國頂尖商學院的畢業生。 透過匯聚業界的優秀人才,DA 交易者聯盟致力於提供卓越的金融教育和投資研究服務,旨在為投資者和交易者打造更豐富、更有價值的學習和投資環境。
Thumbnail
如果你正在尋找下一個10倍的加密貨幣交易機會,參與經過強化的Launchpad xyz預售是必不可少的,其Alpha Call團隊為交易者帶來高達7,000%的回報。 今天,Launchpad xyz重新推出其網站,展示了對預售的改進,以激勵用戶採用平臺。
Thumbnail
如果你正在尋找下一個10倍的加密貨幣交易機會,參與經過強化的Launchpad xyz預售是必不可少的,其Alpha Call團隊為交易者帶來高達7,000%的回報。 今天,Launchpad xyz重新推出其網站,展示了對預售的改進,以激勵用戶採用平臺。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News