#交易 #策略 #回测 #平台 #交易所 #量化 #框架

已删除 自动交易

回测,策略,多平台,量化交易框架

3 个版本

0.8.6 2023年11月12日
0.8.4 2023年10月26日
0.1.0 2023年7月27日

#9 in #量化

Apache-2.0

160KB
3.5K SLoC

自动交易

github Latest version Documentation Apache

回测,策略,多平台,量化交易框架。

backtest, strategy, multiple platforms, quantitative trading framework.

依赖

[dependencies]
auto-trading = "0.8.6"

示例 1

使用欧易交易所进行回测。

使用欧易交易所进行回测。

  • product: BTC-USDT-SWAP
  • level: Hour4
  • 范围: 1692963462000..
  • buy: cci(close, 20) <= -350
  • sell: cci(close, 20) >= 100
use auto_trading::*;

#[tokio::test]
async fn test_1() {
    let exchange = Okx::new().unwrap();

    let config = Config::new()
        .initial_margin(1000.0)
        .quantity(Unit::Quantity(0.01))
        .margin(Unit::Quantity(10.0))
        .lever(100)
        .open_fee(0.0002)
        .close_fee(0.0005)
        .maintenance(0.004);

    let backtester = Backtester::new(exchange, config);

    let result = backtester
        .start(
            |cx| {
                if cx.position().is_none() {
                    if cci(cx.close, 20) <= -350.0 {
                        let result = cx.order(Side::BuyLong, 0.0);
                        println!(
                            "开仓委托结果 {} {} {:?}",
                            time_to_string(cx.time),
                            cx.close,
                            result
                        );
                    }
                } else {
                    if cci(cx.close, 20) >= 100.0 {
                        let result = cx.order(Side::BuySell, 0.0);
                        println!(
                            "平仓委托结果 {} {} {:?}",
                            time_to_string(cx.time),
                            cx.close,
                            result
                        );
                    }
                }
            },
            "BTC-USDT-SWAP",
            Level::Hour4,
            1692963462000..,
        )
        .await
        .unwrap();

    println!("历史仓位 {:#?}", result);
    println!("所有盈亏 {}", result.iter().map(|v| v.profit).sum::<f64>());
}

使用币安交易所只需要做简单的修改。

使用币安交易所只需进行简单修改。

let exchange = Binance::new().unwrap();

使用本地交易所,从文件获取读取 k 线数据。

使用本地交易所,从文件中读取 k 线数据。

let exchange = LocalExchange::new().push(
    "BTC-USDT-SWAP",
    Level::Hour4,
    serde_json::from_str(include_str!("BTC-USDT-SWAP-4h.json")).unwrap(),
    0.01,
    0.0,
);

更多的委托参数。

更多委托参数。

cx.order_condition(
    side,
    price,
    quantity,
    margin,
    stop_profit_condition,
    stop_loss_condition,
    stop_profit,
    stop_loss,
);

示例 2

使用 1 分钟时间级别的 k 线数据在 4 小时的策略上回测,你的强平,平仓,开仓,盈亏会按照 1 分钟的时间级别刷新,而策略的调用周期为 4 小时。

使用 1 分钟时间级别的 k 线数据对 4 小时策略进行回测,你的强制平仓、平仓、开仓和盈亏会按照 1 分钟的时间级别刷新,而策略的调用周期为 4 小时。

强烈建议使用 1 分钟级别的 k 线数据进行回测。

use auto_trading::*;

#[tokio::test]
async fn test_2() {
    // 使用 1 分钟的 k 线数据。
    let k = serde_json::from_str::<Vec<K>>(include_str!("../BTC-USDT-SWAP-1m.json")).unwrap();

    let exchange = LocalExchange::new()
        .push("BTC-USDT-SWAP", Level::Minute1, k.clone(), 0.01, 0.0)
        .push(
            "BTC-USDT-SWAP",
            Level::Hour4,
            // k 线转换
            k_convert(k, Level::Hour4),
            0.01,
            0.0,
        );

    // Level::Minute1 -> Level::Hour4
    Backtester::new(exchange, Config::new())
        .start_amplifier(
            |cx| println!("{} {}", cx.time, time_to_string(cx.time)),
            "BTC-USDT-SWAP",
            Level::Minute1,
            Level::Hour4,
            0,
        )
        .await
        .unwrap();
}

内置函数

auto_trading::util 内置了 crossover, crossunder, highest, lowest, sma, ema, rma, cci, macd 等其他函数。

auto_trading::util 中包含 crossover, crossunder, highest, lowest, sma, ema, rma, cci, macd 等其他内置函数。

use auto_trading::*;

#[tokio::test]
async fn test_3() {
    println!("{}", time_to_string(1145141919810));
    println!("{}", string_to_time("2006-04-16 06:58:39"));
    println!(
        "{:?}",
        get_k_range(
            &Okx::new().unwrap(),
            "BTC-USDT-SWAP",
            Level::Hour4,
            1695212739000..1695644739000
        )
        .await
        .unwrap()
    );
}

数据系列

策略的 cx.open, cx.high, cx.low, cx.close 的数据类型为 auto_trading::base::Source,它不会因为越界而发生 panic。

策略中 cx.open, cx.high, cx.low, cx.close 的数据类型为 auto_trading::base::Source,它们不会因为越界错误而引发 panic。

#[test]
fn test_4() {
    let array = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
    let source = Source::new(&array);
    assert!(source == 1.0);
    assert!(source[2] == 3.0);
    assert!(source[10].is_nan());
    assert!((&source[1..4]) == &[2.0, 3.0, 4.0][..]);
    assert!((&source[10..]).len() == 0);
}

可视化

使用 to_html 函数将回测结果可视化。

使用 to_html 函数来可视化回测结果。

架构

  • exchange 交易所。
  • config 交易配置。
  • backtester 回测器。
  • match 引擎 撮合引擎。
  • strategy 策略。
                                          +========+
                                          | config |
                                          +========+
                                              ||
                                              ||
+================+                            vv
| okx            |     +==========+     +============+     +==========+
| binance        | --> | exchange | --> | backtester | <-- | strategy |
| local exchange |     +==========+     +============+     +==========+
+================+                            ^|
                                              ||
                                              |v
                                       +==============+
                                       | match engine |
                                       +==============+

依赖

~7–23MB
~306K SLoC