双均线策略的Backtrader实现
1.导入相关的Python库和金融大数据接口库(本次使用的是Tushare)
投资最重要的三件事
我们都知道,做任何的投资不外乎三个方面:选标、择时、套利,什么意思呢?
选标:就是选择你要投资的标的,你需要投资的资产,比如房地产、金融资产、商品等不同类大类资产,当然YU股思基今天要说的量化框架是投资金融标的资产。
择时:当你选择好自己的投资资产后,接下来你就要选择合适的入场时机了,不是任何时候入场你都可以胜利的,好的入场时机是非常关键,决定你的投资成败的关键,任何一种投资必须经历此环节。那么对于股票和基金投资,什么时候是好的入场时机呢,这个就千人千面了,有的选择基本面研究来选择入场时机,有的选择技术面研究来选择入场时机,有的两者结合起来看,总之无论何种方法,都是要进行研究验证的,切不可盲目入场,否则你可能死的很惨。
套利:就是通过你的选择标的和择时来获取收益,当然套利有很多种方法,比如做多的“低买高卖”,做空的“高卖低买”,还有很多的对冲套利,总之方法有很多种,一定要选择适合自己的方法,也是自己最明白的方法,因为你要相信投资永远赚的是你认知的钱。
那我们都知道了投资要经历以上三个过程:选标、择时、套利,那么依据历史数据来回溯我们这三个投资过程就至关重要了,只有很好的回溯历史,才能更好指导未来的投资,大大提升投资的胜率,才能够明白什么是好的投资策略,什么是失败的投资策略,长期形成自己的特有投资逻辑。
今天YU股思基就给大家介绍一个Python的量化框架:Backtrader,免费的Python开源量化框架,这个框架十分完善,基本上可以实现在投资里大部分的逻辑和回测。
Backtrader:A feature-rich Python framework for backtesting and trading
这是Backtrader的官网的介绍,你就可以知道他是干什么的了,用于回测和交易的Python框架。
下面就举一个简单的例子和大家介绍该怎么用这个Python量化框架
双均线策略
我们知道在股票投资中,常用的一个技术指标就是移动平均线MA,MA有不同的周期,比如常用的有5日、10日、20日、30日、60日、120日等,当然都是可以自由设置的,YU股思基常用的就是MA5/MA13/MA34,我称之为短线精灵鼠均线系统。
双均线策略基本逻辑是:
根据长期均线和短期均线的交叉情况来确定交易信号,即:当短期均线从下往上穿越长期均线时,形成金叉,做多;反之,当长期均线从上往下穿越短期均线时,形成死叉,做空或平仓。本次使用双均线策略如下:
均线:以 5 日均线为短期均线、以 10 日均线为长期均线;
买入开仓:当前无持仓,当日 5 日均线上穿 10 日均线,金叉,第二天以市价单买入,开仓;
卖出平仓:当前持有多单,当日 5 日均线下穿 10 日均线,死叉,第二天以市价单卖出,平仓。
双均线策略的Backtrader实现
1.导入相关的Python库和金融大数据接口库(本次使用的是Tushare)
from __future__ import (absolute_import,division,print_function,unicode_literals)
import datetime
import os.path
import sys
import pandas as pd
import tushare as ts #tushare作为data feed 数据源
import backtrader as bt
#tushare接口授权
token = '你的接口token'
pro = ts.pro_api(token=token)
ts.set_token(token=token) #使用复权行情必须设置接口token
2.定义一个获取标的资产的历史行情数据方法
方法定义为带参数的:参数是标的代码,以及行情历史数据区间的开始时间和结束时间。
'''
获取标的历史数据,并将标的数据生成backtrader指定格式的数据,为了是把
数据传给backtrader,框架
'''
def get_stock_data(code,start_date,end_date):
df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)
df = df.iloc[::-1,:]
df.reset_index(inplace=True,drop=True)
df = df[['trade_date','open','high','low','close','vol']]
df.columns = ['date','open','high','low','close','volume']
df['openinterest'] = [0] * len(df)
df = df.set_index('date')
df.index = pd.to_datetime(df.index)
print(df)
return df
3.定义实现双均线策略逻辑的类和方法
# 创建策略类:双均线策略
class TwoSmaStrategy(bt.Strategy):
params = (('short', 5), ('long', 10)) # 可调整的参数
def __init__(self):
self.order = None # 初始化订单
self.sma_s = bt.indicators.MovingAverageSimple(self.datas[0].lines.close, period=self.params.short) # 短期均线指标
self.sma_l = bt.indicators.MovingAverageSimple(self.datas[0].lines.close, period=self.params.long) # 长期均线指标
# 策略方法
def next(self):
# 检查是否已经买入
if not self.position:
# 如果没有买入,并且短期均线 > 长期均线,说明涨势,买入
if self.sma_s[0] > self.sma_l[0]:
self.order = self.buy()
else:
# 已经买了,并且短期均线 < 长期均线,说明跌势,卖出
if self.sma_s[0] < self.sma_l[0]:
self.order = self.sell()
4.策略实现回测的业务主逻辑实现(本次使用的标的资产是贵州茅台,仅仅是作为举例使用,不作为任何投资依据)
if __name__ == '__main__':
cerebro = bt.Cerebro() #初始化
cerebro.addstrategy(TwoSmaStrategy)
data = get_stock_data(code='600519.SH',start_date='20201208',end_date='20221216')
datafeed = bt.feeds.PandasData(dataname = data) #必须将df数据转换为btfeed格式
cerebro.adddata(datafeed)
cerebro.broker.setcash(10000000.0) #设置策略初始资金,默认是10000
print('组合初始资产价值:%.2f' % cerebro.broker.getvalue())
cerebro.run()
print('组合最终资产价值:%.2f' % cerebro.broker.getvalue())
cerebro.plot(style='bar')
(想要获取完整代码的朋友,关注YU股思基私信获取)
Backtrader框架的策略实现结果如下:
从策略结果可以清楚看出,买点在哪,卖点在哪,以及策略回测的效果如何,回测结果统计区间是:20201208-20221216。
通过以上实现,大家可以看出,只要有想法,Backtrader的Python量化框架就能告诉你历史表现怎么样,策略是否具有价值一清二楚。历史不会重演,但历史一定会惊人的相似。
联系客服