交易VIX交易所交易基金(VIX ETFs)

登录后收藏

Onsite backtest IDE

Quant Buffet 原生回测 IDE

Edit and run Quant Buffet Python for 交易VIX交易所交易基金(VIX ETFs) in the browser. Results update live with equity, drawdown, and metrics charts. Allowed: backtest.data, backtest.engine, backtest.metrics, numpy, pandas. Define ASSETS and make_on_day(prices). Shortcut: Ctrl+Enter. API docs →

Ready — edit code, then Run backtest.
IDE · 50 lines
Quant Buffet syntax cheat sheet (copy / insert)

Paste these fragments into the editor. The sandbox rejects QuantConnect, os, and network libraries.

Required imports
Only these libraries are allowed in the sandbox.
from __future__ import annotations

import numpy as np
import pandas as pd

from backtest.data import load_daily_prices
from backtest.engine import EngineConfig, PortfolioEngine
from backtest.metrics import compute_metrics
ASSETS list (whitelisted ETFs)
Module-level list. Tickers must be in the Quant Buffet whitelist.
ASSETS = ["SPY", "QQQ", "TLT", "GLD", "BIL"]
make_on_day contract
Must return (on_day, ready). on_day calls engine.set_target_weights.
def make_on_day(prices: pd.DataFrame):
    cols = [c for c in ASSETS if c in prices.columns]
    sma = prices[cols].rolling(200, min_periods=200).mean()
    state = {"last": None}

    def on_day(engine: PortfolioEngine, dt: pd.Timestamp) -> None:
        if sma.loc[dt].isna().all():
            return
        key = (dt.year, dt.month)
        if state["last"] == key:
            return
        state["last"] = key
        long = [
            s for s in cols
            if pd.notna(prices.at[dt, s]) and pd.notna(sma.at[dt, s])
            and prices.at[dt, s] > sma.at[dt, s]
        ]
        weights = {} if not long else {s: 1.0 / len(long) for s in long}
        engine.set_target_weights(dt, weights)

    ready = sma.dropna(how="all").index.min() if sma.notna().any().any() else None
    return on_day, ready
Set target weights
Weights should sum to about 1.0. Empty dict = 100% cash.
engine.set_target_weights(dt, {"SPY": 0.60, "BIL": 0.40})

Live backtest performance

CAGR
-5.22%
Sharpe
0.16
Max DD
-94.50%
Vol
39.98%
Sortino
0.19
Beta
0.60
Up days
55%

Run the backtest to populate charts.

Export to your platform

Transform Quant Buffet lab code (ASSETS + make_on_day / PortfolioEngine) into native classes for a third-party IDE — then copy and paste.

Run in: QuantConnect Cloud or LEAN CLI · QCAlgorithm with Equity securities and monthly rebalance.

Detected pattern: Absolute momentumAssets: SPY, TLT, GLD, BIL
# Generated from Quant Buffet → QuantConnect LEAN
# Strategy: 交易VIX交易所交易基金(VIX ETFs)
# Detected pattern: Absolute momentum
# Source uses Quant Buffet lab APIs (ASSETS + make_on_day / PortfolioEngine).
# Review fees, data, and risk before live trading — educational export only.

from AlgorithmImports import *


class QuantBuffetExport(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)
        tickers = ["SPY", "TLT", "GLD", "BIL"]
        self.symbols = []
        for t in tickers:
            if "-" in t:  # crypto proxy e.g. BTC-USD
                self.symbols.append(self.AddCrypto(t.replace("-USD", ""), Resolution.Daily).Symbol)
            else:
                self.symbols.append(self.AddEquity(t, Resolution.Daily).Symbol)
        self.Schedule.On(
            self.DateRules.MonthStart(self.symbols[0]),
            self.TimeRules.AfterMarketOpen(self.symbols[0], 30),
            self.Rebalance,
        )
        # Logic: Long assets with positive 252-day return; equal-weight; monthly.

    def Rebalance(self):
        # Pattern: abs_momentum — Long assets with positive 252-day return; equal-weight; monthly.
        # Default: equal-weight. Port your make_on_day weights here via SetHoldings.
        w = 1.0 / len(self.symbols) if self.symbols else 0.0
        for symbol in self.symbols:
            self.SetHoldings(symbol, w)

导出代码使用目标平台的原生类与库。请在第三方 IDE 中安装依赖后运行;实盘前请自行验证。

学术论文

Easy Volatility Investing

作者简单波动率投资 [点击查看论文]

机构
  • ?Double-Digit Numerics

原文论文截图

Screenshot from the original paper
Screenshot from the original paper

策略概要

该策略投资于4种波动率交易所交易票据(ETNs)(XIV、VXX、ZIV、VXZ),每日根据其83天动量对其进行排名。投资者持有过去83天表现最高的正表现交易所交易票据(ETN),前提是该表现为正。如果没有任何交易所交易票据(ETN)具有正表现,则投资组合保持未分配状态。交易信号每日检查,投资组合相应地进行再平衡,以确保与基于动量的策略保持一致。这种方法旨在通过优先考虑表现最佳的资产,同时避免那些具有负动量的资产,来捕捉波动率交易所交易票据(ETNs)的趋势,从而确保一个纪律性和动态性的投资过程。

II. 策略合理性

波动率溢价由时变投资者效用理论解释,该理论指出,投资者重视在危机期间表现良好的策略。长期波动率敞口提供危机保护,但带有负风险溢价。相反,做空波动率提供正风险溢价,但由于其高偏度,使投资者在危机期间面临极端损失。动量过滤器策略通过根据当前趋势在多空波动率敞口之间动态切换来解决这个问题,使投资者能够在危机期间获得波动率溢价,同时减轻严重负回报的风险。

回测表现

年化收益-5.22%
波动率39.98%
贝塔0.60
夏普比率0.16
索提诺比率0.19
最大回撤-94.50%
胜率55%