"""
**iTick**:是一家数据代理机构,为金融科技公司和开发者提供可靠的数据源APIs,涵盖外汇API、股票API、加密货币API、指数API等,帮助构建创新的交易和分析工具,目前有免费的套餐可以使用基本可以满足个人量化开发者需求
https://github.com/itick-org
https://itick.org
"""
pip install itrade # iTick数据接口
from itrade import quote
# 获取外汇历史数据
eurusd_df = quote.get_kline(
symbol="EURUSD",
start_date="2023-01-01",
interval="15min",
market="forex"
)
# 获取股票历史数据
茅台_df = quote.get_kline(
symbol="600519.SH",
start_date="2023-01-01",
interval="30min",
market="stock"
)
import talib
def calculate_ma(df, short_window=20, long_window=60):
# 计算简单移动平均线
df['MA_SHORT'] = talib.SMA(df['close'], short_window)
df['MA_LONG'] = talib.SMA(df['close'], long_window)
# 计算交叉信号
df['cross_long'] = df['MA_SHORT'] > df['MA_LONG']
df['cross_short'] = df['MA_SHORT'] < df['MA_LONG']
# 生成交易信号
df['signal'] = 0
df.loc[df['cross_long'] & df['cross_long'].shift(1).eq(False), 'signal'] = 1 # 金叉
df.loc[df['cross_short'] & df['cross_short'].shift(1).eq(False), 'signal'] = -1 # 死叉
return df
def execute_strategy(df, symbol, account_balance=100000):
# 初始化持仓与资金
position = 0
equity = account_balance
# 遍历交易信号
for i in range(1, len(df)):
current_signal = df['signal'].iloc[i]
prev_signal = df['signal'].iloc[i-1]
if current_signal == 1 and prev_signal != 1:
# 开多仓(外汇使用保证金交易)
if symbol.startswith("EURUSD"):
position = 1 # 1标准手
equity -= df['close'].iloc[i] * 100000 # 假设1标准手保证金
else:
# 股票交易(1手=100股)
shares = int(equity * 0.9 / df['close'].iloc[i]) // 100 * 100
position = shares
equity -= shares * df['close'].iloc[i]
elif current_signal == -1 and prev_signal != -1:
# 开空仓(股票需支持融券)
if symbol.startswith("600519"):
shares = int(equity * 0.9 / df['close'].iloc[i]) // 100 * 100
position = -shares
equity += shares * df['close'].iloc[i] # 融券卖出获得资金
# 平仓逻辑(此处简化处理,实际需考虑手续费)
if prev_signal != current_signal and position != 0:
equity += position * df['close'].iloc[i]
position = 0
return equity
def backtest_multiple_symbols(symbols):
results = {}
for symbol in symbols:
# 获取数据并处理
df = quote.get_kline(symbol, start_date="2023-01-01", interval="30min")
df = calculate_ma(df)
# 执行回测
final_equity = execute_strategy(df, symbol)
returns = (final_equity - 100000) / 100000 * 100
results[symbol] = {
"final_equity": final_equity,
"returns": returns
}
return results
symbols = ["EURUSD", "600519.SH", "XAUUSD"]
results = backtest_multiple_symbols(symbols)
print("策略回测结果:")
for symbol, res in results.items():
print(f"{symbol}: 最终权益{res['final_equity']:.2f}元,收益率{res['returns']:.2f}%")