본문으로 건너뛰기
cccskills
무료GitHub에 공개

vnpy-export

Convert a Vibe-Trading backtest strategy or a written trading strategy into a Python class for vnpy. Map indicators and trading signals to vnpy conventions, with asset-specific order handling and instructions for loading the strategy for backtesting or live trading.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Export a Vibe-Trading backtest strategy to a runnable vnpy CtaTemplate Python class — supports A-share equities, futures, and crypto via BarGenerator + ArrayManager.

설치 방법 보기

이럴 때 유용합니다

  • Export a Vibe-Trading strategy to vnpy
  • Turn written trading rules into a CtaTemplate class
  • Adapt order handling for A-shares, futures, or crypto
  • Build strategies combining multiple timeframes

포함된 파일(2)

  • SKILL.md11.6 KB
  • scripts/cta_template.py4.4 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Overview

This skill translates a Vibe-Trading strategy into a vnpy CtaTemplate subclass .py file that can be loaded directly into the vnpy CTA Strategy App for live trading or vnpy backtesting.

Output file: artifacts/vnpy_strategy/<StrategyName>Strategy.py (inside the run directory).

vnpy is the most widely-used open-source quant framework in mainland China (39k+ GitHub stars). Use this skill when the user asks to export to vnpy, requests a /vnpy command, or wants to run a Vibe-Trading strategy inside vnpy's CTA backtester or live trading engine.


Workflow: Export from Backtest Run

  1. load_skill("vnpy-export") — read this guide
  2. read_file("config.json") — extract instrument, dates, parameters, interval
  3. read_file("code/signal_engine.py") — understand the Python signal logic
  4. Determine asset class from config.json → choose correct CtaTemplate convention (see below)
  5. Translate signal logic to CtaTemplate using the reference tables
  6. write_file("artifacts/vnpy_strategy/<StrategyName>Strategy.py") — save the output
  7. Return the class in a code block with setup instructions

Workflow: Generate from Description

  1. load_skill("vnpy-export") — read this guide
  2. Write a CtaTemplate class from the user's strategy description
  3. write_file("artifacts/vnpy_strategy/<StrategyName>Strategy.py") — save the output
  4. Return the class with setup and usage instructions

Asset Class Conventions

vnpy uses the same CtaTemplate base class for all asset types, but parameter conventions differ:

Asset ClassInstrument Examplevt_symbol FormatPosition Unit
A-share stockPing An Bank000001.SZSEshares (整手, min 100)
FuturesIF2406IF2406.CFFEXlots
CryptoBTC/USDTBTC/USDT.BINANCEcoin units

For stocks: use buy / sell only (no short selling unless margin account). For futures / crypto: use all four directions — buy, sell, short, cover.


CtaTemplate Structure

Every strategy must subclass CtaTemplate and implement these methods:

MethodPurpose
__init__Declare parameters, variables, BarGenerator, ArrayManager
on_initCalled once at startup; call load_bar(n) to warm up indicators
on_startCalled when strategy is started by user
on_stopCalled when strategy is stopped
on_tickReceives live tick data; forward to BarGenerator
on_barMain logic — called once per bar by BarGenerator
on_orderOrder status updates
on_tradeFill notifications
on_stop_orderStop-order status (if using stop orders)

Always call self.cancel_all() at the start of on_bar to avoid stale orders. Always call self.put_event() at the end of on_bar to refresh the UI.


Full Template

See scripts/cta_template.py for a complete, runnable example (MA crossover). The template below is the canonical skeleton — replace the # SIGNAL LOGIC section:

from vnpy_ctastrategy import (
    CtaTemplate,
    StopOrder,
    TickData,
    BarData,
    TradeData,
    OrderData,
    BarGenerator,
    ArrayManager,
)


class {{StrategyName}}Strategy(CtaTemplate):
    """
    Vibe-Trading export — {{StrategyName}}
    Generated from run: {{run_id}}
    Instrument: {{vt_symbol}}
    """

    author = "Vibe-Trading"

    # ── Parameters (editable in vnpy UI) ──────────────────────────────────
    {{param_name}} = {{param_default}}   # add one line per parameter

    parameters = [{{param_list_as_strings}}]

    # ── Variables (displayed in vnpy UI, reset on strategy restart) ────────
    {{var_name}} = 0.0   # add one line per runtime variable

    variables = [{{var_list_as_strings}}]

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)
        self.bg = BarGenerator(self.on_bar)
        self.am = ArrayManager()

        # initialise variable attributes to match class-level defaults
        # (vnpy requires instance attributes for variables declared above)

    def on_init(self):
        self.write_log("Strategy initialised")
        self.load_bar({{warmup_bars}})   # load enough bars to warm up all indicators

    def on_start(self):
        self.write_log("Strategy started")
        self.put_event()

    def on_stop(self):
        self.write_log("Strategy stopped")

    def on_tick(self, tick: TickData):
        self.bg.update_tick(tick)

    def on_bar(self, bar: BarData):
        self.cancel_all()

        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

        # ── INDICATOR CALCULATIONS ──────────────────────────────────────────
        # translate indicators from signal_engine.py using the mapping table

        # ── SIGNAL LOGIC ───────────────────────────────────────────────────
        # set cross_over / cross_under (or long_signal / short_signal) here

        # ── ORDER EXECUTION ────────────────────────────────────────────────
        if cross_over:
            if self.pos == 0:
                self.buy(bar.close_price, 1)
            elif self.pos < 0:
                self.cover(bar.close_price, 1)
                self.buy(bar.close_price, 1)
        elif cross_under:
            if self.pos == 0:
                self.short(bar.close_price, 1)
            elif self.pos > 0:
                self.sell(bar.close_price, 1)
                self.short(bar.close_price, 1)

        self.put_event()

    def on_order(self, order: OrderData):
        pass

    def on_trade(self, trade: TradeData):
        self.put_event()

    def on_stop_order(self, stop_order: StopOrder):
        pass

Python → ArrayManager Indicator Mapping

ArrayManager is vnpy's built-in vectorised indicator library. Always prefer it over pandas when the equivalent method exists — it is faster and avoids look-ahead bias.

Python (Vibe-Trading / pandas / ta-lib)vnpy ArrayManager
df['close'].rolling(n).mean()am.sma(n)
df['close'].ewm(span=n).mean()am.ema(n)
ta.RSI(close, n)am.rsi(n)
ta.MACD(close, 12, 26, 9)am.macd(12, 26, 9) → (macd, signal, hist)
Bollinger Bandsam.boll(n, dev) → (mid, upper, lower)
ATRam.atr(n)
ADXam.adx(n)
df['close'].rolling(n).std()am.std(n)
Stochastic K, Dam.kd(n, m) → (k, d)
df['high'].rolling(n).max()am.high_array[-n:].max()
df['low'].rolling(n).min()am.low_array[-n:].min()
Donchian channelam.donchian(n) → (upper, lower)
df['close'].shift(1) (previous bar)am.close_array[-2]
Last N bars as arrayam.sma(n, array=True) (returns full array)

Using arrays: pass array=True to get the full history array (e.g. for crossover detection):

fast_ma = am.sma(self.fast_window, array=True)
cross_over = fast_ma[-1] > slow_ma[-1] and fast_ma[-2] <= slow_ma[-2]

Signal → Order Mapping

Vibe-Trading signalPosition checkvnpy call
Long entryself.pos == 0self.buy(price, volume)
Long entry (reverse from short)self.pos < 0self.cover(price, vol); self.buy(price, vol)
Long exitself.pos > 0self.sell(price, volume)
Short entryself.pos == 0self.short(price, volume)
Short entry (reverse from long)self.pos > 0self.sell(price, vol); self.short(price, vol)
Short exitself.pos < 0self.cover(price, volume)
Close all (stop signal)anyself.cancel_all() then sell / cover as needed

Price conventions:

  • For backtesting: use bar.close_price (market order equivalent)
  • For live trading with limit orders: use bar.close_price ± a small offset (e.g. * 1.001)
  • For stop orders: use self.buy_stop(trigger, volume) / self.short_stop(trigger, volume)

Volume conventions:

  • Stocks: volume in shares; must be a multiple of 100 (round lots)
  • Futures: volume in lots (usually 1 for CtaTemplate strategies)
  • Crypto: volume in base-currency units (e.g., BTC)

Multi-Timeframe Strategies

When the Vibe-Trading strategy uses multiple timeframes (e.g., daily signal, hourly entry):

def __init__(self, ...):
    super().__init__(...)
    self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar)   # 5-min bars
    self.bg_d = BarGenerator(self.on_bar, window=1, on_window_bar=self.on_daily_bar,
                              interval=Interval.DAILY)          # daily bars
    self.am = ArrayManager()
    self.am_d = ArrayManager(size=100)                          # daily ArrayManager

def on_bar(self, bar: BarData):
    self.bg.update_bar(bar)    # feeds 5-min generator

def on_5min_bar(self, bar: BarData):
    self.bg_d.update_bar(bar)  # feeds daily generator
    # put intraday entry logic here

def on_daily_bar(self, bar: BarData):
    self.am_d.update_bar(bar)
    # put daily trend-filter logic here

Output File Instructions

Save the generated file to: artifacts/vnpy_strategy/<StrategyName>Strategy.py

To load in vnpy:

  1. Copy the file to your vnpy project's strategies/ folder (or any folder on sys.path)
  2. Open the vnpy Trader → CTA Strategy App
  3. Click Add Strategy → select <StrategyName>Strategy from the dropdown
  4. Set vt_symbol (e.g. IF2406.CFFEX) and adjust parameters
  5. Click Init → Start to begin

To run the vnpy backtester:

from vnpy_ctastrategy.backtesting import BacktestingEngine
from vnpy.trader.constant import Interval

engine = BacktestingEngine()
engine.set_parameters(
    vt_symbol="000001.SZSE",
    interval=Interval.DAILY,
    start=datetime(2020, 1, 1),
    end=datetime(2024, 1, 1),
    rate=0.0003,
    slippage=0.02,
    size=1,
    pricetick=0.01,
    capital=1_000_000,
)
engine.add_strategy({{StrategyName}}Strategy, {})
engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()

Quality Checklist

Before saving the output file:

  • Class name ends with Strategy and matches the filename
  • All parameters entries have matching class-level defaults and __init__ instance attributes
  • All variables entries have matching instance attributes initialised in __init__
  • on_bar calls self.cancel_all() at the start
  • on_bar calls self.put_event() at the end
  • on_bar returns early if not am.inited
  • Position direction checked with self.pos before every order call
  • Stocks: no short / cover calls unless margin trading is explicitly requested
  • load_bar(n) warmup in on_init is at least max(all indicator windows) + 2
  • Comment block at top of file notes the original Vibe-Trading run_id and instrument

References

  • vnpy CtaTemplate source: vnpy/app/cta_strategy/template.py
  • ArrayManager source: vnpy/app/cta_strategy/base.py
  • Official docs: https://www.vnpy.com/docs/cn/cta_strategy.html
  • Example strategies (official): vnpy/app/cta_strategy/strategies/

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Compare a Chinese company's US depositary receipts, Hong Kong shares, and mainland shares after adjusting for exchange rates and share ratios. Analyze pricing gaps, valuation differences, and delisting risks to support research into its different listings.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Compare A-share and H-share pricing gaps
  • Measure ADR premiums against Hong Kong shares
  • Review US delisting risks and Hong Kong listing alternatives
HKUDS/Vibe-Trading3.6만2026년 10월 19일 업데이트

akshare

무료

Retrieve stock prices, futures quotes, exchange rates, and economic indicators with the free Python library AKShare. The skill explains market-specific functions, symbol formats, and data preparation for analysis and testing strategies against historical data.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Retrieve historical prices for Chinese, US, and Hong Kong stocks
  • Collect Chinese GDP and consumer price data
  • Check futures quotes and foreign exchange rates
HKUDS/Vibe-Trading3.6만2026년 10월 19일 업데이트

alpha-zoo

무료

Explore bundled libraries of investment factors, signals used to compare securities, and inspect individual formulas and metadata. Evaluate a factor or an entire library across a chosen universe and period, producing aggregate performance statistics and an HTML report.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Find bundled momentum or reversal factors
  • Inspect a named factor's formula and metadata
  • Compare a factor library across a chosen universe and period
HKUDS/Vibe-Trading3.6만2026년 10월 19일 업데이트

Assess whether a Chinese A-share company may receive ST or *ST risk warnings next financial year. Review financial forecasts, dividends, audit opinions, and regulatory penalties, then report risk severity separately from confidence in the prediction.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Reviewing a Chinese A-share company's future ST risk
  • Assessing escalation risk for an existing ST or *ST stock
  • Checking revenue, equity, and dividend warning signs
HKUDS/Vibe-Trading3.6만2026년 10월 19일 업데이트

Plan portfolio allocations across assets using risk, correlations, return forecasts, and trading costs. Compare five optimization methods, produce settings for config.json, and define rebalancing rules that adjust holdings back toward their target weights.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Comparing allocations across stocks, bonds, and gold
  • Choosing an optimizer based on return forecasts and correlations
  • Preparing portfolio settings for config.json
HKUDS/Vibe-Trading3.6만2026년 10월 19일 업데이트

Diagnose failed or abnormal backtests, which test trading strategies on historical data. Inspect result files, strategy code, and configuration to identify bugs, make targeted repairs, rerun tests, and verify the updated metrics.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Investigating backtest execution errors
  • Finding why a strategy produces no trades
  • Checking delayed trades or low capital usage
HKUDS/Vibe-Trading3.6만2026년 10월 19일 업데이트

HKUDS의 스킬 모두 보기

이 스킬의 문제 신고