编码如下:
```python
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import datetime
import backtrader as bt # 导入 Backtrader
import backtrader.indicators as btind # 导入策略分析模块
import backtrader.feeds as btfeeds # 导入数据模块
import tushare as ts
import pandas as pd
class TestStrategy(bt.Strategy):
# 可选,设置回测的可变参数:如移动均线的周期
# params = (
# (..., ...), # 最后一个“,”最好别删!
# )
def log(self, txt, dt=None):
'''可选,构建策略打印日志的函数:可用于打印订单记录或交易记录等'''
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
def __init__(self):
'''必选,初始化属性、计算指标等'''
#移动平均线初始化
self.dataclose=self.datas[0].close
self.sma5=btind.MovingAverageSimple(self.dataclose,period=5)
self.sma10=btind.MovingAverageSimple(self.dataclose,period=10)
self.order = None
def notify_order(self, order):
'''可选,打印订单信息'''
# 等待订单提交、订单被cerebro接受
pass
# 等待订单完成
if order.status in [order.Completed]:
if order.isbuy():
self.log(
'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
else:
self.log(
'SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
# 如果订单保证金不足,将不会完成,而是执行以下拒绝程序
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
self.order =None
def notify_trade(self, trade):
'''可选,打印交易信息'''
if not trade.isclosed:
return
self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
(trade.pnl, trade.pnlcomm)) # pnl:盈利 pnlcomm:手续费
def next(self):
'''必选,编写交易策略逻辑'''
if self.order:
return
if not self.position :
if self.sma5[0] > self.sma10[0]and self.sma5[-1] < self.sma10[-1]:
self.order = self.buy()
else:
if self.sma5[0] < self.sma10[0] and self.sma5[-1] > self.sma10[-1] :
self.order = self.sell()
if __name__ == '__main__':
cerebro=bt.Cerebro ()
cerebro.optstrategy(TestStrategy)
cerebro .broker .set_cash(100000.0)
cerebro .broker .setcommission(commission= 0.0005)
df = ts.get_k_data(code='600519', start='2000-01-01')
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df = df.loc[:, :"volume"]
df['openinterest'] = 0
df.to_csv('./maotao.csv')
dataframe = pd.read_csv('./maotao.csv',parse_dates= True ,index_col= 0)
data=btfeeds .PandasData (dataname=dataframe ,fromdate=datetime.datetime(2010,1,1),todate=datetime.datetime(2022,1,23) )
cerebro .adddata(data)
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 启动回测
cerebro.run()
# 打印回测完成后的资金
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
执行结果如下:
Starting Portfolio Value: 100000.00
2018-12-21, OPERATION PROFIT, GROSS -18.00, NET -18.58
2019-01-04, BUY EXECUTED, Price: 587.28, Cost: 587.28, Comm 0.29
2019-02-25, SELL EXECUTED, Price: 730.75, Cost: 587.28, Comm 0.37
2019-02-25, OPERATION PROFIT, GROSS 143.47, NET 142.81
2019-02-28, BUY EXECUTED, Price: 737.90, Cost: 737.90, Comm 0.37
2019-03-12, SELL EXECUTED, Price: 763.82, Cost: 737.90, Comm 0.38
2019-03-12, OPERATION PROFIT, GROSS 25.92, NET 25.17
2019-03-19, BUY EXECUTED, Price: 803.00, Cost: 803.00, Comm 0.40
2019-03-28, SELL EXECUTED, Price: 793.43, Cost: 803.00, Comm 0.40
2019-03-28, OPERATION PROFIT, GROSS -9.57, NET -10.37
2019-04-01, BUY EXECUTED, Price: 860.00, Cost: 860.00, Comm 0.43
2019-05-07, SELL EXECUTED, Price: 893.28, Cost: 860.00, Comm 0.45
2019-05-07, OPERATION PROFIT, GROSS 33.28, NET 32.40
2019-05-17, BUY EXECUTED, Price: 927.02, Cost: 927.02, Comm 0.46
2019-05-24, SELL EXECUTED, Price: 865.00, Cost: 927.02, Comm 0.43
2019-05-24, OPERATION PROFIT, GROSS -62.02, NET -62.92
2019-05-31, BUY EXECUTED, Price: 900.53, Cost: 900.53, Comm 0.45
2019-06-10, SELL EXECUTED, Price: 857.98, Cost: 900.53, Comm 0.43
2019-06-10, OPERATION PROFIT, GROSS -42.55, NET -43.43
2019-06-14, BUY EXECUTED, Price: 911.00, Cost: 911.00, Comm 0.46
2019-07-10, SELL EXECUTED, Price: 980.93, Cost: 911.00, Comm 0.49
2019-07-10, OPERATION PROFIT, GROSS 69.93, NET 68.98
2019-07-30, BUY EXECUTED, Price: 976.50, Cost: 976.50, Comm 0.49
2019-08-07, SELL EXECUTED, Price: 949.50, Cost: 976.50, Comm 0.47
2019-08-07, OPERATION PROFIT, GROSS -27.00, NET -27.96
2019-08-13, BUY EXECUTED, Price: 1016.16, Cost: 1016.16, Comm 0.51
2019-09-12, SELL EXECUTED, Price: 1066.00, Cost: 1016.16, Comm 0.53
2019-09-12, OPERATION PROFIT, GROSS 49.84, NET 48.80
2019-09-23, BUY EXECUTED, Price: 1157.00, Cost: 1157.00, Comm 0.58
2019-10-10, SELL EXECUTED, Price: 1127.00, Cost: 1157.00, Comm 0.56
2019-10-10, OPERATION PROFIT, GROSS -30.00, NET -31.14
2019-10-16, BUY EXECUTED, Price: 1168.00, Cost: 1168.00, Comm 0.58
2019-10-24, SELL EXECUTED, Price: 1164.95, Cost: 1168.00, Comm 0.58
2019-10-24, OPERATION PROFIT, GROSS -3.05, NET -4.22
2019-10-31, BUY EXECUTED, Price: 1196.00, Cost: 1196.00, Comm 0.60
2019-11-26, SELL EXECUTED, Price: 1186.68, Cost: 1196.00, Comm 0.59
2019-11-26, OPERATION PROFIT, GROSS -9.32, NET -10.51
2019-12-12, BUY EXECUTED, Price: 1156.00, Cost: 1156.00, Comm 0.58
2019-12-25, SELL EXECUTED, Price: 1143.00, Cost: 1156.00, Comm 0.57
2019-12-25, OPERATION PROFIT, GROSS -13.00, NET -14.15
2020-01-02, BUY EXECUTED, Price: 1128.00, Cost: 1128.00, Comm 0.56
2020-01-07, SELL EXECUTED, Price: 1077.50, Cost: 1128.00, Comm 0.54
2020-01-07, OPERATION PROFIT, GROSS -50.50, NET -51.60
2020-01-16, BUY EXECUTED, Price: 1118.87, Cost: 1118.87, Comm 0.56
2020-01-22, SELL EXECUTED, Price: 1070.00, Cost: 1118.87, Comm 0.54
2020-01-22, OPERATION PROFIT, GROSS -48.87, NET -49.96
2020-02-11, BUY EXECUTED, Price: 1063.00, Cost: 1063.00, Comm 0.53
2020-02-28, SELL EXECUTED, Price: 1070.30, Cost: 1063.00, Comm 0.54
2020-02-28, OPERATION PROFIT, GROSS 7.30, NET 6.23
2020-03-05, BUY EXECUTED, Price: 1136.31, Cost: 1136.31, Comm 0.57
2020-03-17, SELL EXECUTED, Price: 1055.00, Cost: 1136.31, Comm 0.53
2020-03-17, OPERATION PROFIT, GROSS -81.31, NET -82.41
2020-03-27, BUY EXECUTED, Price: 1085.00, Cost: 1085.00, Comm 0.54
2020-06-16, SELL EXECUTED, Price: 1398.50, Cost: 1085.00, Comm 0.70
2020-06-16, OPERATION PROFIT, GROSS 313.50, NET 312.26
2020-06-23, BUY EXECUTED, Price: 1435.00, Cost: 1435.00, Comm 0.72
2020-07-21, SELL EXECUTED, Price: 1646.64, Cost: 1435.00, Comm 0.82
2020-07-21, OPERATION PROFIT, GROSS 211.64, NET 210.10
2020-08-03, BUY EXECUTED, Price: 1686.88, Cost: 1686.88, Comm 0.84
2020-08-10, SELL EXECUTED, Price: 1627.97, Cost: 1686.88, Comm 0.81
2020-08-10, OPERATION PROFIT, GROSS -58.91, NET -60.57
2020-08-18, BUY EXECUTED, Price: 1697.38, Cost: 1697.38, Comm 0.85
2020-09-09, SELL EXECUTED, Price: 1699.67, Cost: 1697.38, Comm 0.85
2020-09-09, OPERATION PROFIT, GROSS 2.29, NET 0.59
2020-09-17, BUY EXECUTED, Price: 1700.00, Cost: 1700.00, Comm 0.85
2020-09-22, SELL EXECUTED, Price: 1650.00, Cost: 1700.00, Comm 0.83
2020-09-22, OPERATION PROFIT, GROSS -50.00, NET -51.67
2020-10-12, BUY EXECUTED, Price: 1700.00, Cost: 1700.00, Comm 0.85
2020-10-23, SELL EXECUTED, Price: 1740.78, Cost: 1700.00, Comm 0.87
2020-10-23, OPERATION PROFIT, GROSS 40.78, NET 39.06
2020-11-05, BUY EXECUTED, Price: 1717.00, Cost: 1717.00, Comm 0.86
2020-11-19, SELL EXECUTED, Price: 1684.50, Cost: 1717.00, Comm 0.84
2020-11-19, OPERATION PROFIT, GROSS -32.50, NET -34.20
2020-11-25, BUY EXECUTED, Price: 1761.50, Cost: 1761.50, Comm 0.88
2020-12-02, SELL EXECUTED, Price: 1746.00, Cost: 1761.50, Comm 0.87
2020-12-02, OPERATION PROFIT, GROSS -15.50, NET -17.25
2020-12-08, BUY EXECUTED, Price: 1815.00, Cost: 1815.00, Comm 0.91
2020-12-30, SELL EXECUTED, Price: 1870.00, Cost: 1815.00, Comm 0.94
2020-12-30, OPERATION PROFIT, GROSS 55.00, NET 53.16
2020-12-31, BUY EXECUTED, Price: 1941.00, Cost: 1941.00, Comm 0.97
2021-01-20, SELL EXECUTED, Price: 2008.00, Cost: 1941.00, Comm 1.00
2021-01-20, OPERATION PROFIT, GROSS 67.00, NET 65.03
2021-01-27, BUY EXECUTED, Price: 2141.89, Cost: 2141.89, Comm 1.07
2021-02-25, SELL EXECUTED, Price: 2209.00, Cost: 2141.89, Comm 1.10
2021-02-25, OPERATION PROFIT, GROSS 67.11, NET 64.93
2021-03-18, BUY EXECUTED, Price: 2035.00, Cost: 2035.00, Comm 1.02
2021-03-25, SELL EXECUTED, Price: 1970.01, Cost: 2035.00, Comm 0.99
2021-03-25, OPERATION PROFIT, GROSS -64.99, NET -66.99
2021-04-01, BUY EXECUTED, Price: 2021.00, Cost: 2021.00, Comm 1.01
2021-04-13, SELL EXECUTED, Price: 2020.00, Cost: 2021.00, Comm 1.01
2021-04-13, OPERATION PROFIT, GROSS -1.00, NET -3.02
2021-04-21, BUY EXECUTED, Price: 2076.00, Cost: 2076.00, Comm 1.04
2021-04-30, SELL EXECUTED, Price: 2026.00, Cost: 2076.00, Comm 1.01
2021-04-30, OPERATION PROFIT, GROSS -50.00, NET -52.05
2021-05-18, BUY EXECUTED, Price: 2065.00, Cost: 2065.00, Comm 1.03
2021-06-10, SELL EXECUTED, Price: 2195.00, Cost: 2065.00, Comm 1.10
2021-06-10, OPERATION PROFIT, GROSS 130.00, NET 127.87
2021-06-11, BUY EXECUTED, Price: 2239.00, Cost: 2239.00, Comm 1.12
2021-06-15, SELL EXECUTED, Price: 2195.10, Cost: 2239.00, Comm 1.10
2021-06-15, OPERATION PROFIT, GROSS -43.90, NET -46.12
2021-07-02, BUY EXECUTED, Price: 2075.00, Cost: 2075.00, Comm 1.04
2021-07-05, SELL EXECUTED, Price: 2000.00, Cost: 2075.00, Comm 1.00
2021-07-05, OPERATION PROFIT, GROSS -75.00, NET -77.04
2021-07-22, BUY EXECUTED, Price: 1960.00, Cost: 1960.00, Comm 0.98
2021-07-23, SELL EXECUTED, Price: 1937.82, Cost: 1960.00, Comm 0.97
2021-07-23, OPERATION PROFIT, GROSS -22.18, NET -24.13
2021-08-16, BUY EXECUTED, Price: 1696.00, Cost: 1696.00, Comm 0.85
2021-08-18, SELL EXECUTED, Price: 1624.66, Cost: 1696.00, Comm 0.81
2021-08-18, OPERATION PROFIT, GROSS -71.34, NET -73.00
2021-08-31, BUY EXECUTED, Price: 1589.80, Cost: 1589.80, Comm 0.79
2021-09-02, SELL EXECUTED, Price: 1632.99, Cost: 1589.80, Comm 0.82
2021-09-02, OPERATION PROFIT, GROSS 43.19, NET 41.58
2021-09-07, BUY EXECUTED, Price: 1661.03, Cost: 1661.03, Comm 0.83
2021-09-16, SELL EXECUTED, Price: 1603.00, Cost: 1661.03, Comm 0.80
2021-09-16, OPERATION PROFIT, GROSS -58.03, NET -59.66
2021-09-27, BUY EXECUTED, Price: 1750.00, Cost: 1750.00, Comm 0.88
2021-10-21, SELL EXECUTED, Price: 1841.10, Cost: 1750.00, Comm 0.92
2021-10-21, OPERATION PROFIT, GROSS 91.10, NET 89.30
2021-10-28, BUY EXECUTED, Price: 1825.20, Cost: 1825.20, Comm 0.91
2021-11-02, SELL EXECUTED, Price: 1796.70, Cost: 1825.20, Comm 0.90
2021-11-02, OPERATION PROFIT, GROSS -28.50, NET -30.31
2021-11-22, BUY EXECUTED, Price: 1849.00, Cost: 1849.00, Comm 0.92
2021-12-22, SELL EXECUTED, Price: 2040.00, Cost: 1849.00, Comm 1.02
2021-12-22, OPERATION PROFIT, GROSS 191.00, NET 189.06
2021-12-28, BUY EXECUTED, Price: 2133.00, Cost: 2133.00, Comm 1.07
2022-01-04, SELL EXECUTED, Price: 2055.00, Cost: 2133.00, Comm 1.03
2022-01-04, OPERATION PROFIT, GROSS -78.00, NET -80.09
Final Portfolio Value: 100000.00