如何用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吳的沙龍
5會員
121內容數
這不僅僅是一個 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
身為一個精打細算,又熱愛旅遊美食的家庭主婦,皮包裡有好幾張信用卡,每次都想著哪張卡要搭配哪個通路比較划算,著實讓人燒腦,這次玉山Unicard彷彿聽到我的心聲,百大消費通路全都給你優惠,讓你無腦消費,帶一張卡就可以輕鬆省錢,FUN心玩透透!
Thumbnail
身為一個精打細算,又熱愛旅遊美食的家庭主婦,皮包裡有好幾張信用卡,每次都想著哪張卡要搭配哪個通路比較划算,著實讓人燒腦,這次玉山Unicard彷彿聽到我的心聲,百大消費通路全都給你優惠,讓你無腦消費,帶一張卡就可以輕鬆省錢,FUN心玩透透!
Thumbnail
話說身為短線交易者,每天要作的事情就是從盤勢觀察、到籌碼流向,再到經過多維度資料數據交叉比對,盤中盯著分K、江波圖和五檔報價,算計著每一分K線的轉折,雖能換來即時驗證判斷的快感與成就,但長期下來,卻也衍生眼睛與肩頸卻成了抹不去的職業病。
Thumbnail
話說身為短線交易者,每天要作的事情就是從盤勢觀察、到籌碼流向,再到經過多維度資料數據交叉比對,盤中盯著分K、江波圖和五檔報價,算計著每一分K線的轉折,雖能換來即時驗證判斷的快感與成就,但長期下來,卻也衍生眼睛與肩頸卻成了抹不去的職業病。
Thumbnail
每天都在花錢,但你知道這些錢都能省下一筆嗎?玉山 Unicard 期間限定活動,結合日常高頻消費通路,提供最高 7.5% 的超有感回饋。文章將分享真實使用情境,教你如何聰明運用,讓每筆開銷都化為小確幸。
Thumbnail
每天都在花錢,但你知道這些錢都能省下一筆嗎?玉山 Unicard 期間限定活動,結合日常高頻消費通路,提供最高 7.5% 的超有感回饋。文章將分享真實使用情境,教你如何聰明運用,讓每筆開銷都化為小確幸。
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 交易者聯盟致力於提供卓越的金融教育和投資研究服務,旨在為投資者和交易者打造更豐富、更有價值的學習和投資環境。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News