การทำ Backtesting คือการนำกลยุทธ์การลงทุนที่เราคิดขึ้นมาไปทดสอบกับข้อมูลราคาในอดีต เพื่อดูว่าถ้าเราใช้กลยุทธ์นี้ตั้งแต่ปีที่แล้ว เราจะได้กำไรหรือขาดทุน? บทความนี้จะสอนคุณทำ Backtesting อย่างมืออาชีพโดยใช้ Tardis API แม้คุณจะไม่เคยเขียนโค้ดมาก่อนก็ตาม
Tardis API คืออะไรและทำไมต้องใช้?
Tardis API เป็นบริการที่รวบรวมข้อมูลราคาคริปโตเคอเรนซีจากตลาดต่างๆ ทั่วโลกมาไว้ให้เราสามารถเรียกใช้ได้ง่ายๆ ผ่านคำสั่งง่ายๆ ข้อมูลที่ได้ครอบคลุมทั้งราคา ปริมาณการซื้อขาย และ Order Book เพื่อให้เราทดสอบกลยุทธ์ได้อย่างแม่นยำ
ข้อดีของ Tardis API
- ข้อมูลครบถ้วน - ครอบคลุมกว่า 50 ตลาด Exchange ชั้นนำ
- ความละเอียดสูง - ข้อมูลระดับ Tick และ Order Book
- ใช้งานง่าย - มีเอกสารประกอบที่เข้าใจง่าย
- ประหยัดเวลา - ไม่ต้องดึงข้อมูลเองจากหลายแหล่ง
เริ่มต้นใช้งาน Tardis API
ขั้นตอนที่ 1: สมัครสมาชิกและรับ API Key
ให้คุณเข้าไปที่เว็บไซต์ Tardis แล้วสมัครสมาชิก หลังจากสมัครเสร็จคุณจะได้ API Key ซึ่งจะเป็นชุดตัวอักษรยาวที่ใช้ในการยืนยันตัวตนเมื่อเรียกใช้งาน คุณจะเห็น API Key นี้ในหน้า Dashboard ของคุณ
ขั้นตอนที่ 2: เตรียมเครื่องมือ
สำหรับมือใหม่ เราแนะนำให้ใช้ Python ผ่าน Google Colab ซึ่งไม่ต้องติดตั้งโปรแกรมใดๆ บนเครื่อง เพียงแค่เปิดเว็บเบราว์เซอร์แล้วเข้าไปที่ colab.research.google.com ก็สามารถเขียนโค้ดได้ทันที
ขั้นตอนที่ 3: ติดตั้ง Library ที่จำเป็น
ก่อนจะเริ่มดึงข้อมูล เราต้องติดตั้ง Library ที่ช่วยให้การทำงานสะดวกขึ้น ให้พิมพ์คำสั่งด้านล่างใน Colab
!pip install tardis-dev pandas numpy matplotlib requests
หลังจากรันคำสั่งนี้ ระบบจะดาวน์โหลดและติดตั้ง Library ที่จำเป็นทั้งหมดให้อัตโนมัติ โดย Library แต่ละตัวมีหน้าที่ต่างกัน เช่น tardis-dev ใช้ดึงข้อมูลราคา pandas ใช้จัดการข้อมูลตาราง และ matplotlib ใช้วาดกราฟ
ดึงข้อมูลราคาย้อนหลัง
ตัวอย่างที่ 1: ดึงข้อมูล Bitcoin รายชั่วโมง
มาเริ่มด้วยการดึงข้อมูลราคา Bitcoin เทียบกับ USDT ย้อนหลัง 30 วัน โดยข้อมูลจะมาทีละชั่วโมง คุณสามารถ copy คำสั่งด้านล่างไปวางใน Colab ได้เลย
import tardis
import pandas as pd
from datetime import datetime, timedelta
ตั้งค่าวันที่เริ่มต้นและสิ้นสุด
end_date = datetime.now()
start_date = end_date - timedelta(days=30)
สร้าง API Client
client = tardis.Client(api_key='YOUR_TARDIS_API_KEY')
ดึงข้อมูล Binance Bitcoin/USDT รายชั่วโมง
exchange = 'binance'
symbol = 'BTC-USDT'
interval = '1h'
print(f"กำลังดึงข้อมูล {symbol} จาก {exchange}")
print(f"ช่วงเวลา: {start_date.strftime('%Y-%m-%d')} ถึง {end_date.strftime('%Y-%m-%d')}")
ดึงข้อมูล OHLCV (Open, High, Low, Close, Volume)
data = client.get_historical_realtime(
exchange=exchange,
symbol=symbol,
interval=interval,
start_date=start_date,
end_date=end_date
)
แปลงเป็น DataFrame
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp')
print(f"\nได้ข้อมูลทั้งหมด {len(df)} แท่งเทียน")
print(df.tail())
เมื่อรันคำสั่งนี้ คุณจะเห็นข้อมูลราคา Bitcoin ย้อนหลัง 30 วัน พร้อมราคาเปิด สูงสุด ต่ำสุด ปิด และปริมาณการซื้อขาย ในตารางที่อ่านง่าย
ตัวอย่างที่ 2: ดึงข้อมูลหลายเหรียญพร้อมกัน
ถ้าคุณต้องการเปรียบเทียบกลยุทธ์กับเหรียญหลายตัว เช่น BTC ETH SOL สามารถใช้คำสั่งด้านล่างได้
import warnings
warnings.filterwarnings('ignore')
รายชื่อเหรียญที่ต้องการ
symbols = ['BTC-USDT', 'ETH-USDT', 'SOL-USDT']
all_data = {}
for symbol in symbols:
print(f"กำลังดึงข้อมูล {symbol}...")
data = client.get_historical_realtime(
exchange='binance',
symbol=symbol,
interval='1d',
start_date=start_date,
end_date=end_date
)
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp')
all_data[symbol] = df
print(f" ได้ข้อมูล {symbol} {len(df)} แท่งเทียน")
print("\nเสร็จสิ้นการดึงข้อมูลทั้งหมด")
print(f"เหรียญที่ได้ข้อมูล: {list(all_data.keys())}")
สร้างกลยุทธ์ Backtesting แบบง่ายๆ
ตอนนี้เรามีข้อมูลราคาแล้ว ต่อไปจะเป็นการสร้างกลยุทธ์การลงทุนแบบง่ายๆ เพื่อทดสอบ กลยุทธ์แรกที่จะลองคือ Simple Moving Average Crossover หรือการตัดกันของเส้นค่าเฉลี่ย
ทฤษฎี: กลยุทธ์ SMA Crossover
กลยุทธ์นี้ใช้หลักการง่ายๆ คือ เมื่อเส้นค่าเฉลี่ยระยะสั้น (เช่น 7 วัน) ตัดขึ้นเหนือเส้นค่าเฉลี่ยระยะยาว (เช่น 25 วัน) จะซื้อ และเมื่อตัดลงต่ำกว่าจะขาย ลองมาดูโค้ดกัน
def sma_crossover_strategy(df, short_window=7, long_window=25):
"""
กลยุทธ์ SMA Crossover
พารามิเตอร์:
- df: DataFrame ที่มีคอลัมน์ 'close'
- short_window: จำนวนวันเส้นค่าเฉลี่ยสั้น
- long_window: จำนวนวันเส้นค่าเฉลี่ยยาว
คืนค่า: DataFrame ที่มีสัญญาณซื้อขาย
"""
# คำนวณเส้นค่าเฉลี่ย
df['sma_short'] = df['close'].rolling(window=short_window).mean()
df['sma_long'] = df['close'].rolling(window=long_window).mean()
# สร้างสัญญาณ: 1 = ซื้อ, -1 = ขาย, 0 = ถือ
df['signal'] = 0
df.loc[df['sma_short'] > df['sma_long'], 'signal'] = 1
df.loc[df['sma_short'] < df['sma_long'], 'signal'] = -1
# ตำแหน่งที่สัญญาณเปลี่ยน
df['position_change'] = df['signal'].diff()
return df
ทดสอบกับข้อมูล BTC
btc_data = all_data['BTC-USDT'].copy()
btc_data = sma_crossover_strategy(btc_data)
print("ผลการทดสอบกลยุทธ์ SMA Crossover กับ BTC")
print(f"ระยะเวลา: {len(btc_data)} วัน")
print(f"วันที่มีสัญญาณซื้อ: {(btc_data['position_change'] == 2).sum()}")
print(f"วันที่มีสัญญาณขาย: {(btc_data['position_change'] == -2).sum()}")
แสดงตัวอย่างสัญญาณ
signals = btc_data[btc_data['position_change'] != 0][['close', 'sma_short', 'sma_long', 'signal', 'position_change']]
print("\nตัวอย่างสัญญาณที่เกิดขึ้น:")
print(signals.head(10))
คำนวณผลตอบแทนและประเมินประสิทธิภาพ
หลังจากมีสัญญาณซื้อขายแล้ว ต้องคำนวณว่ากลยุทธ์นี้ทำกำไรได้จริงหรือไม่ โดยจะคำนวณผลตอบแทน ความเสี่ยง และสถิติต่างๆ ที่สำคัญ
import numpy as np
def calculate_performance(df, initial_capital=10000):
"""
คำนวณประสิทธิภาพของกลยุทธ์
พารามิเตอร์:
- df: DataFrame ที่มีสัญญาณซื้อขาย
- initial_capital: เงินทุนเริ่มต้น (USD)
"""
df = df.copy()
# คำนวณผลตอบแทนรายวัน
df['daily_return'] = df['close'].pct_change()
# ผลตอบแทนของกลยุทธ์ (คูณสัญญาณที่คงค้าง)
df['strategy_return'] = df['signal'].shift(1) * df['daily_return']
# พอร์ตโฟลิโอ
df['portfolio_value'] = initial_capital * (1 + df['strategy_return']).cumprod()
# คำนวณสถิติ
total_return = (df['portfolio_value'].iloc[-1] / initial_capital - 1) * 100
# annualized return
num_days = len(df)
annualized_return = ((1 + total_return/100) ** (365/num_days) - 1) * 100
# volatility (ความผันผวน)
volatility = df['strategy_return'].std() * np.sqrt(365) * 100
# Sharpe Ratio (อัตราส่วนความเสี่ยง-ผลตอบแทน)
sharpe_ratio = (annualized_return / volatility) if volatility > 0 else 0
# Max Drawdown (การขาดทุนสูงสุด)
cumulative = (1 + df['strategy_return']).cumprod()
rolling_max = cumulative.expanding().max()
drawdown = cumulative / rolling_max - 1
max_drawdown = drawdown.min() * 100
results = {
'total_return': total_return,
'annualized_return': annualized_return,
'volatility': volatility,
'sharpe_ratio': sharpe_ratio,
'max_drawdown': max_drawdown,
'final_value': df['portfolio_value'].iloc[-1]
}
return results, df
คำนวณประสิทธิภาพ
results, btc_backtest = calculate_performance(btc_data)
print("=" * 50)
print("ผลการ Backtesting กลยุทธ์ SMA Crossover")
print("=" * 50)
print(f"เงินทุนเริ่มต้น: ${10000:,.2f}")
print(f"เงินทุนสุดท้าย: ${results['final_value']:,.2f}")
print(f"ผลตอบแทนรวม: {results['total_return']:.2f}%")
print(f"ผลตอบแทนต่อปี: {results['annualized_return']:.2f}%")
print(f"ความผันผวน (Volatility): {results['volatility']:.2f}%")
print(f"Sharpe Ratio: {results['sharpe_ratio']:.2f}")
print(f"การขาดทุนสูงสุด (Max Drawdown): {results['max_drawdown']:.2f}%")
print("=" * 50)
เปรียบเทียบกลยุทธ์หลายแบบ
การทดสอบเพียงกลยุทธ์เดียวยังไม่พอ ควรเปรียบเทียบกับกลยุทธ์อื่นๆ เพื่อหาว่าวิธีไหนเหมาะกับตลาดแบบไหน ต่อไปนี้คือการเปรียบเทียบกลยุทธ์ Buy and Hold กับ SMA Crossover
def buy_and_hold_strategy(df, initial_capital=10000):
"""
กลยุทธ์ Buy and Hold - ซื้อแล้วถือยาว
"""
df = df.copy()
# ซื้อตั้งแต่วันแรกและถือ
df['signal'] = 1
df['daily_return'] = df['close'].pct_change()
df['strategy_return'] = df['signal'].shift(1) * df['daily_return']
df['portfolio_value'] = initial_capital * (1 + df['strategy_return']).cumprod()
return df
ทดสอบทั้ง 2 กลยุทธ์กับทุกเหรียญ
comparison_results = []
for symbol, data in all_data.items():
# SMA Strategy
sma_data = sma_crossover_strategy(data.copy())
sma_results, _ = calculate_performance(sma_data)
# Buy and Hold
bnh_data = buy_and_hold_strategy(data.copy())
bnh_results, _ = calculate_performance(bnh_data)
comparison_results.append({
'Symbol': symbol,
'SMA Return': f"{sma_results['total_return']:.2f}%",
'SMA Sharpe': f"{sma_results['sharpe_ratio']:.2f}",
'SMA MaxDD': f"{sma_results['max_drawdown']:.2f}%",
'BnH Return': f"{bnh_results['total_return']:.2f}%",
'BnH Sharpe': f"{bnh_results['sharpe_ratio']:.2f}",
'BnH MaxDD': f"{bnh_results['max_drawdown']:.2f}%"
})
comparison_df = pd.DataFrame(comparison_results)
print("\nเปรียบเทียบผลกลยุทธ์:")
print(comparison_df.to_string(index=False))
สร้างกราฟแสดงผล
การดูตัวเลขอย่างเดียวบางทีเข้าใจยาก มาสร้างกราฟเพื่อให้เห็นภาพชัดเจนขึ้น
import matplotlib.pyplot as plt
fig, axes = plt.subplots(3, 1, figsize=(14, 12))
กราฟ 1: ราคาและสัญญาณ
ax1 = axes[0]
ax1.plot(btc_backtest.index, btc_backtest['close'], label='ราคา BTC', alpha=0.7)
ax1.plot(btc_backtest.index, btc_backtest['sma_short'], label='SMA 7 วัน', linestyle='--')
ax1.plot(btc_backtest.index, btc_backtest['sma_long'], label='SMA 25 วัน', linestyle='--')
ทำเครื่องหมายจุดซื้อขาย
buy_signals = btc_backtest[btc_backtest['position_change'] == 2]
sell_signals = btc_backtest[btc_backtest['position_change'] == -2]
ax1.scatter(buy_signals.index, buy_signals['close'], marker='^', color='green', s=100, label='สัญญาณซื้อ')
ax1.scatter(sell_signals.index, sell_signals['close'], marker='v', color='red', s=100, label='สัญญาณขาย')
ax1.set_title('ราคา Bitcoin และสัญญาณซื้อขาย')
ax1.legend()
ax1.grid(True, alpha=0.3)
กราฟ 2: มูลค่าพอร์ต
ax2 = axes[1]
ax2.plot(btc_backtest.index, btc_backtest['portfolio_value'], label='SMA Strategy', linewidth=2)
ax2.axhline(y=10000, color='gray', linestyle='--', label='เงินทุนเริ่มต้น')
ax2.set_title('มูลค่าพอร์ตโฟลิโอ')
ax2.legend()
ax2.grid(True, alpha=0.3)
กราฟ 3: Drawdown
cumulative = (1 + btc_backtest['strategy_return']).cumprod()
rolling_max = cumulative.expanding().max()
drawdown = (cumulative / rolling_max - 1) * 100
ax3 = axes[2]
ax3.fill_between(drawdown.index, drawdown, 0, alpha=0.3, color='red')
ax3.plot(drawdown.index, drawdown, color='red')
ax3.set_title('Drawdown (การขาดทุนจากจุดสูงสุด)')
ax3.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('backtest_results.png', dpi=150)
plt.show()
print("\nกราฟถูกบันทึกเป็น backtest_results.png")
ใช้ AI ช่วยวิเคราะห์และปรับปรุงกลยุทธ์
หลังจากได้ผลการทดสอบแล้ว คุณอาจอยากให้ AI ช่วยวิเคราะห์และเสนอแนะกลยุทธ์ใหม่ๆ ที่ดีกว่า เราแนะนำให้ใช้ HolySheep AI ซึ่งมีความเร็วตอบสนองต่ำกว่า 50 มิลลิวินาที และราคาประหยัดกว่า 85% เมื่อเทียบกับบริการอื่น
ตัวอย่างการใช้ HolySheep AI วิเคราะห์ผล Backtesting
import requests
def analyze_with_ai(backtest_summary, holysheep_api_key):
"""
ส่งผลการ Backtest ให้ AI วิเคราะห์และเสนอแนะ
"""
base_url = "https://api.holysheep.ai/v1"
prompt = f"""คุณเป็นผู้เชี่ยวชาญด้าน Cryptocurrency Trading
ผลการ Backtesting ที่ได้:
{backtest_summary}
กรุณาวิเคราะห์และเสนอแนะ:
1. จุดแข็งและจุดอ่อนของกลยุทธ์นี้
2. วิธีปรับปรุงให้ดีขึ้น
3. ความเสี่ยงที่ควรระวัง
4. กลยุทธ์ทางเลือกอื่นๆ ที่น่าสนใจ
"""
response = requests.post(
f"{base_url}/chat/completions",
headers={
"Authorization": f"Bearer {holysheep_api_key}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": [
{"role": "system", "content": "คุณเป็นที่ปรึกษาการลงทุนที่เชี่ยวชาญ"},
{"role": "user", "content": prompt}
],
"temperature": 0.7
}
)
return response.json()
สรุปผลการทดสอบ
summary = f"""
กลยุทธ์: SMA Crossover (7/25 วัน)
เหรียญ: BTC/USDT
ระยะเวลา: 30 ว