量化交易之vn.py篇 - cta_strategy - DemoStrategy(一个稳定亏损的双均线策略...)

from vnpy.app.cta_strategy import (
    CtaTemplate,
    BarGenerator,
    ArrayManager
)

from typing import Any

from vnpy.trader.object import (
    BarData,
    TickData,
)

class DemoStrategy(CtaTemplate):


    author = "Post-Truth"


    # 定义参数
    fast_window = 10
    slow_window = 20

    # 定义变量
    fast_ma_1 = 0
    fast_ma_2 = 0
    slow_ma_1 = 0
    slow_ma_2 = 0
    

    parameters = [
        "fast_window",
        "slow_window"
    ]

    variables = [
        "fast_ma_1",
        "fast_ma_2",
        "slow_ma_1",
        "slow_ma_2"
    ]

    def __init__(
        self,
        cta_engine: Any,
        strategy_name: str,
        vt_symbol: str,
        setting: dict,
    ):
        super().__init__(self, cta_engine, strategy_name, vt_symbol, setting)

        self.bar_generator = BarGenerator(self.on_bar)
        self.array_manager = ArrayManager(10)
    

    def on_init(self):
        self.write_log("策略 DemoStrategy 初始化")
        
        self.load_bar(10)


    def on_start(self):
        self.write_log("策略 DemoStrategy 启动")
    

    def on_stop(self):
        self.write_log("策略 DemoStrategy 停止")

    
    def on_bar(self, bar: BarData):
        array_manager = self.array_manager

        array_manager.update_bar(bar=bar)
        if array_manager.inited:
            return


        fast_ma = array_manager.sma(self.fast_window, array=True)
        self.fast_ma_1 = fast_ma[-1]
        self.fast_ma_2 = fast_ma[-2]


        slow_ma = array_manager.sma(self.fast_window, array=True)
        self.slow_ma_1 = slow_ma[-1]
        self.slow_ma_2 = slow_ma[-2]

        cross_up = (self.fast_ma_1 > self.slow_ma_1) and (self.fast_ma_2 < self.slow_ma_2)
        cross_down = (self.fast_ma_1 < self.slow_ma_1) and (self.fast_ma_2 > self.slow_ma_2)
        

        if cross_up:

            price = bar.close_price + 5

            if not self.pos:
                self.buy(price=price, volume=1)
            elif self.pos < 0:
                self.cover(price=price, volume=1)  # 先平空
                self.buy(price=price, volume=1)
        
        elif cross_down:

            price = bar.close_price - 5

            if not self.pos:
                self.short(price=price, volume=1)
            elif self.pos > 0:
                self.sell(price=price, volume=1)
                self.short(price=price, volume=1)
        

        # 更新 图形 界面
        self.put_event()


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用vn.py库进行MA策略回测的示例代码。 首先,我们需要导入所需的库和数据: ```python from vnpy.app.cta_strategy.backtesting import BacktestingEngine, OptimizationSetting from vnpy.app.cta_strategy.strategies.ma_strategy import MAStrategy # 创建回测引擎对象 engine = BacktestingEngine() # 设置回测数据 engine.set_parameters( vt_symbol="IF88.CFFEX", interval="1m", start=datetime(2010, 1, 1), end=datetime(2021, 12, 31), rate=0.3/10000, slippage=0.2, size=300, pricetick=0.2, capital=1_000_000, ) # 添加策略 engine.add_strategy(MAStrategy, {'fast_window': 5, 'slow_window': 10}) # 加载数据 engine.load_data() # 运行回测 engine.run_backtesting() # 输出回测结果 df = engine.calculate_result() print(df[['net_pnl', 'total_profit', 'total_commission']]) ``` 这里我们使用`BacktestingEngine`类创建回测引擎对象,并设置回测参数,包括交易品种、回测时间、手续费等。然后我们添加`MAStrategy`策略,并使用`load_data()`方法加载数据,使用`run_backtesting()`方法运行回测,并使用`calculate_result()`方法计算回测结果,并输出净利润、总盈亏、总手续费等指标。 在上面的代码中,`MAStrategy`是一个简单的MA策略类,其中`fast_window`和`slow_window`分别表示快速和慢速移动平均线的窗口大小。下面是`MAStrategy`类的示例代码: ```python from vnpy.app.cta_strategy import ( CtaTemplate, Direction, StopOrder, TickData, BarData, TradeData, OrderData, BarGenerator, ArrayManager, ) class MAStrategy(CtaTemplate): """ 简单的MA策略 """ author = "vn.py" fast_window = 5 slow_window = 10 fixed_size = 1 fast_ma = 0.0 slow_ma = 0.0 parameters = ["fast_window", "slow_window", "fixed_size"] variables = ["fast_ma", "slow_ma"] 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, 5, self.on_5min_bar) self.am = ArrayManager() def on_init(self): self.write_log("策略初始化") self.load_bar(10) def on_start(self): self.write_log("策略启动") def on_stop(self): self.write_log("策略停止") def on_tick(self, tick: TickData): self.bg.update_tick(tick) def on_bar(self, bar: BarData): self.bg.update_bar(bar) def on_5min_bar(self, bar: BarData): self.am.update_bar(bar) if not self.am.inited: return self.fast_ma = self.am.sma(self.fast_window) self.slow_ma = self.am.sma(self.slow_window) if self.fast_ma > self.slow_ma: if self.pos == 0: self.buy(bar.close_price + 5, self.fixed_size) elif self.pos < 0: self.cover(bar.close_price + 5, self.fixed_size) self.buy(bar.close_price + 5, self.fixed_size) elif self.fast_ma < self.slow_ma: if self.pos == 0: self.sell(bar.close_price - 5, self.fixed_size) elif self.pos > 0: self.sell(bar.close_price - 5, self.fixed_size) self.short(bar.close_price - 5, self.fixed_size) ``` 在`MAStrategy`中,我们定义了`fast_window`和`slow_window`两个参数来设置快速和慢速移动平均线的窗口大小,并定义了`fixed_size`参数来设置每次交易的数量。在`on_5min_bar()`方法中,我们使用`ArrayManager`类计算快速和慢速移动平均线,并根据MA交叉信号进行买入和卖出操作。 除了单一品种的回测外,vn.py还支持多品种的回测和参数优化等功能,可以根据具体需要进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值