惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
H
Help Net Security
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
F
Fortinet All Blogs
腾讯CDC
博客园 - Franky
WordPress大学
WordPress大学
U
Unit 42

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
[分享] 如何避免量化回测里的未来函数?
matters · 2026-05-21 · via V2EX

上次问了回测和实盘差距的因素,V 友 @KeinHong 特别提了“数据有未来函数”,最近又重新研究了下这块,和大家分享下收获:

1. 什么是未来函数?

简单来说,就是在 T 时刻的代码逻辑里,使用了 T+1 时刻的信息。

最典型的逻辑错误:

  • 收盘价陷阱: 计算出今日收盘价突破压力位,然后在“今日开盘”买入。

  • 全局归一化: 在预处理数据时,用了整个数据集的最大值/最小值。

  • 偷看一眼: 使用 df\['close'\].shift(-1) 却忘了这是在模拟历史。

2. 难以察觉未来函数?

在复杂的策略中,未来函数往往隐藏在数据清洗和特征工程阶段。

一旦引入,回测结果就会变成上帝视角,曲线完美,但实盘时并没有上帝视角。

3. 尝试去掉未来函数

以下是一个简单的 Python 示例,演示如何获取数据并确保交易决策仅基于过去的信息。


import time
import requests
import pandas as pd

API_KEY = 'YOUR_API_KEY'
BASE_URL = 'https://quote.alltick.io/quote-b-api/kline'

def get_historical_data(symbol, bin_size='1m'):
    params = {
        'token': API_KEY,
        'symbol': symbol,
        'kline_type': bin_size, # 1m, 5m, 1h, 1d
        'query_count': 500
    }
    response = requests.get(BASE_URL, params=params)
    data = response.json()
    
    if data['code'] != 200:
        print("Error fetching data")
        return None
    
    df = pd.DataFrame(data['data']['list'])
    df['time'] = pd.to_datetime(df['t'], unit='s')
    df.set_index('time', inplace=True)
    return df[['o', 'h', 'l', 'c', 'v']] # Open, High, Low, Close, Volume

def backtest_logic(df):
    """
    一个简单的突破策略
    核心:确保信号产生后,在下一根 K 线才能成交
    """
    # 1. 特征计算:仅使用过去的数据 (shift 1 位)
    # 计算前 20 分钟的最高价,不包含当前这一分钟
    df['prev_high'] = df['c'].shift(1).rolling(window=20).max()
    
    # 2. 产生信号:当前价格 > 过去 20 分钟最高价
    # 注意:这里的 'c' 是当前时刻确定的,买入动作必须发生在‘未来’
    df['signal'] = df['c'] > df['prev_high']
    
    # 3. 模拟成交 (关键!避免未来函数)
    # 我们不能以产生信号那一刻的收盘价成交,而应模拟以“下一分钟开盘价”买入
    df['execution_price'] = df['o'].shift(-1) 
    
    # 计算收益
    df['returns'] = 0.0
    # 只有信号为 True 且我们有下一分钟成交价时才计算
    hold_mask = df['signal'].shift(1) == True
    df.loc[hold_mask, 'returns'] = (df['c'] - df['execution_price'].shift(1)) / df['execution_price'].shift(1)
    
    return df.dropna()

# 运行回测(以黄金 XAUUSD 为例)
gold_data = get_historical_data('XAUUSD')
if gold_data is not None:
    results = backtest_logic(gold_data)
    print(results[['c', 'prev_high', 'signal', 'returns']].tail(10))

4. 如何自测?

如果你怀疑回测有问题,尝试:

  1. 随机噪声法: 将历史数据的价格顺序随机打乱,如果策略还能跑出高收益,说明逻辑里肯定藏着未来函数——因为它正在利用“乱序”后的未来信息。

  2. 信号漂移检查: 记录下回测中某天的买入信号。然后删除该日期之后的所有数据,重新跑一遍。如果那个信号消失了,说明该信号依赖于未来的数据。

最后,回测是用来证伪的,要时刻警惕 shift(-1) 或 max(future) 的逻辑,才能在量化这条路上走得远一点。欢迎大家来讨论下避免未来函数的方式