量化分析基本框架示例

量化分析基本框架示例

Tushare ID: 434267

框架:Backtrader

数据:Tushare

安装方式:金融量化分析基础环境搭建

示例代码:

import pandas as pd  
from datetime import datetime
import backtrader as bt
import tushare as ts 
import matplotlib.pyplot as plt

ts.set_token('Tushare账户token')#获取方式请参考安装方式链接
pro = ts.pro_api()

#使用tushare旧版接口获取数据
def get_data(code,start,end):
    df = pro.daily(ts_code=code, start_date=start, end_date=end)
    df.index=pd.to_datetime(df.trade_date)
    df=df[['open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount']]
    df = df.rename(columns={"vol": "volume"})
    df = df.iloc[::-1]
    return df

class my_strategy1(bt.Strategy):
    #全局设定交易策略的参数
    params=(
        ('maperiod',20),
           )

    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 log(self, txt, dt=None):
        ''' 输出日志'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))
        
    def notify(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, order.Canceled, order.Margin]:
            if order.isbuy():
                self.log('订单买入:成交价%.2f元' % order.executed.price)
            elif order.issell():
                self.log('订单卖出:成交价%.2f元' % order.executed.price)
 
            self.bar_executed = len(self)
 
        # Write down: no pending order
        self.order = None
        
    def next(self):
        if self.order: # 检查是否有指令等待执行, 
            return
        # 检查是否持仓   
        if not self.position: # 没有持仓
            #执行买入条件判断:收盘价格上涨突破20日均线
            if self.dataclose[0] > self.sma[0]:
                #执行买入
                self.order = self.buy(size=500)         
        else:
            #执行卖出条件判断:收盘价格跌破20日均线
            if self.dataclose[0] < self.sma[0]:
                #执行卖出
                self.order = self.sell(size=500)
    
if __name__ == '__main__':
    
    
    #回测期间
    start=datetime(2020, 1, 31)
    end=datetime(2020, 3, 31)
    
    d1=start.strftime('%Y%m%d')
    d2=end.strftime('%Y%m%d')
    
    # 加载数据
    dataframe=get_data('600000.SH', d1, d2)
    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.2%
    cerebro.broker.setcommission(commission=0.002) 
    
    print(f'初始资金: {startcash}\n回测期间:{d1}:{d2}')
    #运行回测系统
    cerebro.run()
    #获取回测结束后的总资金
    portvalue = cerebro.broker.getvalue()
    pnl = portvalue - startcash
    #打印结果
    print(f'总资金: {round(portvalue,2)}')   
    print(f'净收益: {round(pnl,2)}')
    cerebro.plot()
    
    

注意事项:

1、Backtrader接收的DataFrame数据按时间由过去到现在进行排列,Tushare老版本的DataFrame数据也是按时间由过去到现在进行排列,因此可直接使用;但最新的Tushare接口是按照时间从现在到过去进行排列,因此需要df = df.iloc[::-1]进行倒序排列。

2、Backtrader默认作图时需要DataFrame数据中有成交量数据,并且列名必须为volume,Tushare老版本数据中有volume列名,新版本已更换为vol,所以需要重新命名df = df.rename(columns={"vol": "volume"})。

其他:

金融量化分析最新动态和源代码分享,请关注“量化之窗”公众号。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding的叶子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值