V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
matters
V2EX  ›  投资

有人做量化交易吗?分享个回测框架

  •  
  •   matters · 1 天前 · 277 次点击

    量化交易是用模型和程序,根据历史数据和规则自动买卖金融资产,刚入门可以看看这份量化百科

    量化交易最核心的东西,其实是回测。没数据没回测,策略就跟瞎子摸象一样。我自己早期就是先写了一个小框架,把历史数据丢进去,看看策略表现,起起伏伏的,平均也算能稳住收益。长期是肯定能看到规律的,但是短期内不一定,我期间也经历过连续几个月收益掉下去的情况。

    这篇主要分享下我的 python 回测框架:

    回测框架四大模块

    1. 数据管理 历史数据都公开的。把数据整理好,策略用的时候直接拿就行。我以前就是自己抓数据,后来发现用现成 API 快得多。

    2. 策略逻辑 我的策略就是很简单的均线交叉。古老但是有效:短期均线上穿长期均线就买,反过来就卖。可能现在看有点老了/简单了,但不影响测试策略思路。

    3. 执行引擎 模拟下单、算手续费和滑点。早期没注意这块,结果回测收益和实盘差别挺大,所以还是要加上。

    4. 绩效评估 计算收益率、最大回撤、夏普比率等。长期来看,能帮你判断策略稳不稳,但短期很波动,我就遇到过连续几个月都亏的情况。

    Python 回测框架实操示例

    我就直接贴我常用的最简版本,大家可以自己玩:

    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 vantagealltick,都 OK 。自己挑的时候,看下数据是否准确、接入是不是省事、市场覆盖面适不适合你。

    好了,我的框架分享到这里。玩量化的话,建议先搭一个框架,把数据、策略、回测流程跑通,长期来看肯定能节省很多摸索时间。

    matters
        1
    matters  
    OP
       1 天前
    不会真没人玩量化吧(☉д⊙)
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 22:56 · PVG 06:56 · LAX 14:56 · JFK 17:56
    ♥ Do have faith in what you're doing.