backtrader學習筆記(一).SMA

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @license : (C) Copyright 2017-2020.
# @Time    : 2020/5/23 13:01
# @File    : gpb_backtrade.py
# @Software: PyCharm
# @desc    :

from datetime import datetime
import pandas as pd
import backtrader as bt
import tushare as ts
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

class my_strategy1(bt.Strategy):
    # 全局設定交易策略的參數
    params = (
        ('maperiod', 10),
    )

    def __init__(self):
        # 指定價格序列
        self.dataclose = self.datas[0].close
        # 初始化交易指令、買賣價格和手續費
        self.order = None
        self.buyprice = None
        self.buycomm = None

        # 添加移動均線指標,內置了talib模塊
        self.sma = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=self.params.maperiod)

    def next(self):
        if self.order:  # 檢查是否有指令等待執行,
            return
        # 檢查是否持倉
        if not self.position:  # 沒有持倉
            # 執行買入條件判斷:收盤價格上漲突破10日均線
            if self.dataclose[0] > self.sma[0]:
                # 執行買入
                self.order = self.buy(size=500)
        else:
            # 執行賣出條件判斷:收盤價格跌破10日均線
            if self.dataclose[0] < self.sma[0]:
                # 執行賣出
                self.order = self.sell(size=500)


def get_data(code, start='2019-01-01', end='2020-05-22'):
    df = ts.get_k_data(code, autype='qfq', start=start, end=end)
    df.index = pd.to_datetime(df.date)
    df['openinterest'] = 0
    df = df[['open', 'high', 'low', 'close', 'volume', 'openinterest']]
    return df


def bt1():

    dataframe = get_data('000001')

    # 回測期間
    start = datetime(2010, 5, 20)
    end = datetime(2020, 5, 20)
    # 加載數據
    data = bt.feeds.PandasData(dataname=dataframe,
                               fromdate=start,
                               todate=end)
    
    # 初始化cerebro回測系統設置
    cerebro = bt.Cerebro()
    # 將數據傳入回測系統
    cerebro.adddata(data)
    # 將交易策略加載到回測系統中
    cerebro.addstrategy(my_strategy1)
    # 設置初始資本爲10,000
    startcash = 10000
    cerebro.broker.setcash(startcash)
    # 設置交易手續費爲 0.25%
    cerebro.broker.setcommission(commission=0.0025)

    d1 = start.strftime('%Y%m%d')
    d2 = end.strftime('%Y%m%d')
    print(f'初始資金: {startcash}\n回測期間:{d1}:{d2}')
    # 運行回測系統
    cerebro.run()
    # 獲取回測結束後的總資金
    portvalue = cerebro.broker.getvalue()
    pnl = portvalue - startcash
    print(f'淨收益: {round(pnl,2)}')

    # 打印結果
    print(f'總資金: {round(portvalue,2)}')

    cerebro.plot(style='candlestick')

if __name__ == '__main__':

    bt1()
初始資金: 10000
回測期間:20100520:20200520
淨收益: 1622.2
總資金: 11622.2

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章