量化交易是用模型和程序,根据历史数据和规则自动买卖金融资产,刚入门可以看看这份量化百科。
量化交易最核心的东西,其实是回测。没数据没回测,策略就跟瞎子摸象一样。我自己早期就是先写了一个小框架,把历史数据丢进去,看看策略表现,起起伏伏的,平均也算能稳住收益。长期是肯定能看到规律的,但是短期内不一定,我期间也经历过连续几个月收益掉下去的情况。
这篇主要分享下我的 python 回测框架:
数据管理 历史数据都公开的。把数据整理好,策略用的时候直接拿就行。我以前就是自己抓数据,后来发现用现成 API 快得多。
策略逻辑 我的策略就是很简单的均线交叉。古老但是有效:短期均线上穿长期均线就买,反过来就卖。可能现在看有点老了/简单了,但不影响测试策略思路。
执行引擎 模拟下单、算手续费和滑点。早期没注意这块,结果回测收益和实盘差别挺大,所以还是要加上。
绩效评估 计算收益率、最大回撤、夏普比率等。长期来看,能帮你判断策略稳不稳,但短期很波动,我就遇到过连续几个月都亏的情况。
我就直接贴我常用的最简版本,大家可以自己玩:
import pandas as pd
# 数据加载器
class DataHandler:
def __init__(self, data: pd.DataFrame):
self.data = data
def get_data(self):
return self.data
# 简单策略:均线交叉
class Strategy:
def generate_signals(self, df):
df['signal'] = 0
df.loc[df['close'] > df['close'].rolling(5).mean(), 'signal'] = 1
df.loc[df['close'] < df['close'].rolling(5).mean(), 'signal'] = -1
return df
# 回测执行
class Backtest:
def __init__(self, data, strategy):
self.data = data
self.strategy = strategy
def run(self):
df = self.strategy.generate_signals(self.data)
df['returns'] = df['close'].pct_change() * df['signal'].shift(1)
df['cum_returns'] = (1 + df['returns']).cumprod()
return df
# 示例数据
data = pd.DataFrame({'close': [100, 102, 101, 103, 105, 107, 106, 108, 110, 109]})
dh = DataHandler(data)
strategy = Strategy()
bt = Backtest(dh.get_data(), strategy)
result = bt.run()
print(result[['close', 'signal', 'cum_returns']])
这个版本简单但够用,特别是当个入门工具,挺不错的。
import matplotlib.pyplot as plt
plt.plot(result['cum_returns'], label='策略累计收益')
plt.title('回测结果')
plt.xlabel('时间')
plt.ylabel('累计收益')
plt.legend()
plt.show() `
我自己做的时候就是看这条曲线,长期是能看出策略趋势的,但短期波动挺大的,所以别被一两个月的亏损吓到
关于金融数据 API ,我用过alpha vantage、 alltick,都 OK 。自己挑的时候,看下数据是否准确、接入是不是省事、市场覆盖面适不适合你。
好了,我的框架分享到这里。玩量化的话,建议先搭一个框架,把数据、策略、回测流程跑通,长期来看肯定能节省很多摸索时间。