Backtrader量化平台教程(一):backtrader的整体框架
| 分类: 指标自动化 |
1.预备
-
if
__name__ '__main__':== -
# Create a cerebro entity -
cerebro = bt.Cerebro() -
# Add a strategy -
cerebro.addstrategy(TestStrategy) -
# 本地数据,笔者用Wind获取的东风汽车数据以csv形式存储在本地。 -
# parase_dates = True是为了读取csv为dataframe的时候能够自动识别datetime格式的字符串,big作为index -
# 注意,这里最后的pandas要符合backtrader的要求的格式 -
dataframe = pd.read_csv('dfqc.csv', index_col= 0,parse_dates= True) -
dataframe['openinterest'] = 0 -
data = bt.feeds.PandasData(dataname=dataframe, -
fromdate = datetime.datetime(2015, 1, 1), -
todate = datetime.datetime(2016, 12, 31) -
) -
# Add the Data Feed to Cerebro -
cerebro.adddata(data) -
# Set our desired cash start -
cerebro.broker.setcash(100.0) -
# 设置每笔交易交易的股票数量 -
cerebro.addsizer(bt.sizers.FixedSize, stake=10) -
# Set the commission -
cerebro.broker.setcommission(commission=0.0) -
# Print out the starting conditions -
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue()) -
# Run over everything -
cerebro.run() -
# Print out the final result -
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue()) -
cerebro.plot()
-
#
设置每笔交易交易的股票数量 -
cerebro.addsizer(bt.sizers.FixedSize, stake=10)
-
bt.sizers.FixedSize
2.我们的策略
2.1策略的生命周期
策略的完整生命周期如下:
0.__init__
1.Birth: start
2.Childhood: prenext
3.Adulthood: next
这个方法是最核心的,就是每次移动到下一的时间点,策略将会调用这个方法,所以,策略的核心往往都是写在这个方法里的。
4.Death: stop
2.2策略当中的回调函数
notify_order(order):下的单子,order的任何状态变化都将引起这一方法的调用
notify_trade(trade):任何一笔交易头寸的改变都将调用这一方法
notify_cashvalue(cash,
value):任何现金和资产组合的变化都将调用这一方法
notify_store(msg, *args,
**kwargs):可以结合cerebro类进行自定义方法的调用
那么问题接踵而至,这里我们只关注前2种方法中监测对象的可变化方式。
trade指的是一笔头寸,trdae是open的状态指当前时刻,这一标的的头寸从0变到某一非零值。trade是closed则刚好相反。
ref: 唯一id
size (int): trade的当前头寸
price (float): trade资产的当前价格
value (float): trade的当前价值
commission (float): trade的累计手续费
pnl (float): trade的当前pnl
pnlcomm (float): trade的当前pnl减去手续费
isclosed (bool): 当前时刻trade头寸是否归零
isopen (bool): 新的交易更新了trade
justopened (bool): 新开头寸
dtopen (float): trade open的datetime
dtclose (float):
Orders
order.status可以返回order的当前状态
order.isbuy可以获得这笔order是否是buy
order.executed.price
order.executed.value
order.executed.comm
分别可以获得执行order的价格,总价,和手续费
2.3代码
-
class
TestStrategy(bt.Strategy): -
params = ( -
('maperiod', 15), -
) -
-
def log( self,txt, None):dt= -
''''' Logging function fot this strategy''' -
dt = dt or self.datas[0].datetime.date(0) -
print('%s, %s' % (dt.isoformat(), txt)) -
-
def __init__( self): -
# Keep a reference to the "close" line in the data[0] dataseries -
self.dataclose = self.datas[0].close -
-
# To keep track of pending orders and buy price/commission -
self.order = None -
self.buyprice = None -
self.buycomm = None -
-
# Add a MovingAverageSimple indicator -
self.sma = bt.indicators.SimpleMovingAverage( -
self.datas[0], period= self.params.maperiod) -
def start( self): -
print("the world )call me!" -
-
def prenext( self): -
print("not mature" ) -
-
def notify_order( self,order): -
if order.status in[order.Submitted, order.Accepted]: -
# Buy/Sell order submitted/accepted to/by broker - Nothing to do -
return -
-
# Check if an order has been completed -
# Attention: broker could reject order if not enougth cash -
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)) -
-
self.buyprice = order.executed.price -
self.buycomm = order.executed.comm -
else: #Sell -
self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' % -
(order.executed.price, -
order.executed.value, -
order.executed.comm)) -
-
self.bar_executed = self)len( -
-
elif order.status in[order.Canceled, order.Margin, order.Rejected]: -
self.log('Order Canceled/Margin/Rejected' ) -
-
self.order = None
3.Backtrader的indicator
-
def
__init__( self): -
# Keep a reference to the "close" line in the data[0] dataseries -
self.dataclose = self.datas[0].close -
-
# To keep track of pending orders and buy price/commission -
self.order = None -
self.buyprice = None -
self.buycomm = None -
-
# Add a MovingAverageSimple indicator -
self.sma = bt.indicators.SimpleMovingAverage( -
self.datas[0], period= self.params.maperiod)

加载中…