#!/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