|
楼主 |
发表于 2025-3-5 07:20
|
显示全部楼层
import pandas as pd
import numpy as np
import ccxt # 交易所连接库
from datetime import datetime
import backtrader as bt # 回测框架
# ================== 数据模块 ==================
class DataFetcher:
def __init__(self, api_key, secret):
self.exchange = ccxt.binance({
'apiKey': api_key,
'secret': secret,
'enableRateLimit': True
})
def fetch_historical_data(self, symbol, timeframe, since):
"""获取历史数据"""
ohlcv = self.exchange.fetch_ohlcv(symbol, timeframe, since)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['date'] = pd.to_datetime(df['timestamp'], unit='ms')
return df.set_index('date')
# ================== 策略模块 ==================
class SMACrossover(bt.Strategy):
params = (
('fast', 10),
('slow', 30),
)
def __init__(self):
self.fast_ma = bt.indicators.SMA(period=self.p.fast)
self.slow_ma = bt.indicators.SMA(period=self.p.slow)
self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)
def next(self):
if not self.position:
if self.crossover > 0: # 金叉
self.buy(size=0.1) # 10%仓位
elif self.crossover < 0: # 死叉
self.close()
# ================== 回测模块 ==================
class Backtester:
def __init__(self, data):
self.cerebro = bt.Cerebro()
self.cerebro.adddata(data)
self.cerebro.addstrategy(SMACrossover)
def run_backtest(self):
self.cerebro.run()
return self.cerebro.plot()
# ================== 交易执行模块 ==================
class TradeExecutor:
def __init__(self, api_key, secret):
self.exchange = ccxt.binance({
'apiKey': api_key,
'secret': secret,
'enableRateLimit': True
})
def execute_order(self, symbol, side, amount):
"""执行交易订单"""
order_type = 'market'
try:
return self.exchange.create_order(symbol, order_type, side, amount)
except Exception as e:
print(f"交易执行失败: {e}")
# ================== 主程序 ==================
if __name__ == "__main__":
# 配置参数
API_KEY = 'your_api_key'
API_SECRET = 'your_api_secret'
SYMBOL = 'BTC/USDT'
TIMEFRAME = '1d'
# 数据获取
data_fetcher = DataFetcher(API_KEY, API_SECRET)
historical_data = data_fetcher.fetch_historical_data(SYMBOL, TIMEFRAME, since=datetime(2020,1,1).timestamp()*1000)
# 转换数据格式为Backtrader可识别格式
data = bt.feeds.PandasData(dataname=historical_data)
# 回测
backtester = Backtester(data)
backtester.run_backtest()
# 实盘交易示例(需谨慎)
# executor = TradeExecutor(API_KEY, API_SECRET)
# executor.execute_order(SYMBOL, 'buy', 0.01) # 买入0.01个BTC |
|