使用python实现一个简单的数字货币交易回测系统

BaseStrategy(策略基类)

BaseStrategy,交易策略基类

回调函数

  • on_start:策略开始运行
  • on_stop:策略运行结束
  • next_bar:回测收到新的K线时调用

其他函数

  • record:记录自定义数据
  • output_record:输出数据记录文件

Broker(经纪人)

Broker 经纪人,负责处理处理撮合交易订单等功能.

交易相关函数

  • pos:当前仓位
  • cancel_all:取消所有订单
  • buy:做多
  • sell:平多
  • short:做空
  • cover:平空
  • create_stop_order:创建止盈止损订单

示例代码

行情数据这里用的是币安上爬取的分钟数据,关于数据的爬取和整理可以看这里

    from common.time_utils import timestamp_to_datetime

    # 读取分钟数据
    df = pd.read_csv('ETHUSDT-1m.csv', converters={
   
        'Open time': timestamp_to_datetime,
        'Close time': timestamp_to_datetime
    })

    # 数据清洗
    df.rename(columns={
   
        'Open time': 'open_time',
        'Close time': 'close_time',
        'Open': 'open',
        'High': 'high',
        'Low': 'low',
        'Close': 'close',
        'Volume': 'volume',
    }, inplace=True)

    # 截取指定时间范围的数据
    df = df[df['open_time'] >= '2021-05-01']
    df = df[df['close_time'] <= '2021-06-01']

    df.reset_index(inplace=True, drop=True)
    # print(df)

    broker = Broker()
    broker.set_symbol('ETHUSDT')
    broker.set_strategy(TripleFilterTradeSystemStrategy) # 设置策略类
    broker.set_leverage(1.0)  # 杠杆比例
    broker.set_cash(3600)  # 1初始资金.
    broker.set_commission(7 / 10000)  # 手续费
    broker.set_backtest_data(df)  # 数据.
    broker.run()
    broker.calculate().to_csv('triple_filter_trade_system_backtest.csv', index=False)
    broker.output_record('triple_filter_trade_system_record.csv')

    # 参数优化, 穷举法, 遗传算法。
    # broker.optimize_strategy(long_period=[i for i in range(30, 60, 5)], short_period=[i for i in range(5, 30, 1)])

数据可视化

策略中通过record方法记录了行情数据和交易信号,数据如下:
在这里插入图片描述

使用bokeh将K线数据、交易信号和相关技术指标可视化

from math import pi
from bokeh.plotting import figure
import numpy as np
from common.indicator import EMA
import pandas as pd
import talib
from bokeh.layouts import column
from bokeh.io import output_file, show, save
from bokeh.models import ColumnDataSource, HoverTool, RangeTool, CDSView, BooleanFilter, DataRange1d, LinearAxis, \
    Range1d, CustomJS
from datetime import datetime
from common.time_utils import timestamp_to_datetime


class Signal:

    def __init__(self, data, marker='inverted_triangle', color='#10B479'):
        """
        信号
        :param data: 信号集数据
        :param marker: 标记类型
        :param color: 颜色
        """
        self.data = data
        self.marker = marker
        self.color = color

    @staticmethod
    def signal_below_price(data, price, func)
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
量化交易回测系统是一个比较复杂的系统,需要考虑很多因素,包括数据获取、数据处理、策略回测交易执行等。以下是一个简单的量化交易回测系统的示例代码,用Python实现: ``` import pandas as pd import yfinance as yf # 获取股票数据 def get_stock_data(ticker, start_date, end_date): data = yf.download(ticker, start=start_date, end=end_date) return data # 计算技术指标 def calculate_indicator(data): data['MA10'] = data['Adj Close'].rolling(window=10).mean() data['MA60'] = data['Adj Close'].rolling(window=60).mean() data['MACD'] = data['Adj Close'].ewm(span=12).mean() - data['Adj Close'].ewm(span=26).mean() data['Signal'] = data['MACD'].ewm(span=9).mean() return data # 回测交易策略 def backtest_strategy(data): data['Position'] = 0 data['Position'][data['MA10'] > data['MA60']] = 1 data['Position'][data['MA10'] < data['MA60']] = -1 data['Position'][data['MACD'] < data['Signal']] = -1 data['Position'][data['MACD'] > data['Signal']] = 1 data['Returns'] = data['Adj Close'].pct_change() * data['Position'].shift(1) data['Cumulative Returns'] = (1 + data['Returns']).cumprod() return data # 执行交易 def execute_trade(data, capital): data['Shares'] = (capital * data['Position']) // data['Adj Close'] data['Cash'] = capital - (data['Shares'] * data['Adj Close']).cumsum() data['Total'] = data['Cash'] + (data['Shares'] * data['Adj Close']).cumsum() return data # 测试 ticker = 'AAPL' start_date = '2015-01-01' end_date = '2021-01-01' capital = 100000 data = get_stock_data(ticker, start_date, end_date) data = calculate_indicator(data) data = backtest_strategy(data) data = execute_trade(data, capital) print(data.tail()) ``` 以上代码实现一个简单交易策略,即根据股票的10日移动平均线和60日移动平均线的交叉以及MACD指标的金叉和死叉来确定交易信号,然后根据信号执行交易并计算收益。这个交易策略非常简单,只是为了演示如何实现一个量化交易回测系统。在实际应用中,需要根据具体的需求设计更加复杂的交易策略,并考虑更多的因素,如手续费、滑点等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值