《中文Python穿云箭量化平台二次开发技术02》在backtrader中调用穿云箭自编公式运算模块进行【上涨角度公式】回测

《中文Python穿云箭量化平台》是纯Python开发的量化平台,因此其中很多Python模块,我们可以自己设计新的量化工具,例如自己新的行情软件、新的量化平台、以及各种量化研究工具。

穿云箭自带指标公式源码运行模块,可以为其他量化平台提供量化功能扩展或量化功能增强效果。

《中文Python穿云箭量化平台》本身是中文Python关键字的Python集成开发工具,支持纯英文Python,同时支持中文Python。

例如if语句。

c 复制代码
if NUMBER> 5:
    print("10大于5")

或者

c 复制代码
如果 数字 > 0 :  
    输出("数字大于0")

下面是中文Python程序演示。

要注意:如果脱离《中文Python穿云箭量化平台》编辑器,就不支持中文Python指令了。只支持纯英文Python指令代码,变量可以是中文等信息。

我们设计了一个自编公式指标【上涨角度公式】,想在backtrader中进行回测。

全部代码如下:

c 复制代码
import pandas as pd
import datetime
import backtrader as bt  #将Backtrader引入到咱们程序中,命名为bt。
import HP_bt as hbt
import HP_tdx as htdx  #小白量化行情模块
from HP_formula import *  #小白量化公式函数模块
import HP_tdxgs as hgs  #小白通达信公式库

hq=htdx.TdxInit(ip='183.60.224.178',port=7709)  ##初始化通达信
gs='''
MM1:=MAX(C,O);
MM2:=MIN(C,O);
MA3:=EMA(C,3);
BD:=ATAN((MA3/REF(MA3,1)-1)*100)*180/3.1416;
BDD:=EMA(BD,3);
ENTERLONG:CROSS(BDD,0);
EXITLONG:CROSS(0,BDD);

'''
tgs1=hgs.Tdxgs()     #创建公式解析器

# 建立一个策略
class TestStrategy(bt.Strategy):
    params = (
        ('maperiod', 20),
    )
 
    def log(self, txt, dt=None):
        ''' 提供记录功能'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s  %s' % (dt.isoformat(),txt))
 
    def __init__(self):
        # 引用到输入数据的close价格
        self.dataclose = self.datas[0].close
        self.order = None
        self.buyprice = None
        self.buycomm = None
        print(self.dataclose[-1])
        self.ma5=MA(pd.Series(list(self.dataclose)),self.params.maperiod)
        print(self.ma5.iloc[-1])
        #平均线        
        self.sma = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=self.params.maperiod)


    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 enough cash
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(
                    '执行买入, 价格: %.2f, 交易额: %.2f, 佣金 %.2f' %
                    (order.executed.price,
                     order.executed.value,
                     order.executed.comm))
 
                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else:  # Sell
                self.log('执行卖出, 价格: %.2f, 交易额: %.2f, 佣金 %.2f' %
                         (order.executed.price,
                          order.executed.value,
                          order.executed.comm))
 
            self.bar_executed = len(self)
 
        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
        #Gross:毛利;Net:净利)
        self.log('操作利润, 毛利 %.2f, 净利 %.2f' %
                 (trade.pnl, trade.pnlcomm))#记录下盈利数据。
 
##微信18578755056  QQ:2775205
    def next(self):

        self.log('Close, %.2f' % self.dataclose[0])
        print('close: ',self.datas[0].close[0])

        print('ENTERLONG: ', self.datas[0].ENTERLONG[0])
        print('EXITLONG: ', self.datas[0].EXITLONG[0])
 
       # Check if an order is pending ... if yes, we cannot send a 2nd one
        if self.order:
            return
 
        # Check if we are in the market
        if not self.position:
 
            # 出现买点
            if self.datas[0].ENTERLONG[0] > 0:
 
                # BUY, BUY, BUY!!! (with all possible default parameters)
                self.log('BUY CREATE, %.2f' % self.dataclose[0])
 
                # Keep track of the created order to avoid a 2nd order
                self.order = self.buy()
 
        else:
            # 出现卖点 
            if self.datas[0].EXITLONG[0] > 0:
                self.log('SELL CREATE, %.2f' % self.dataclose[0])
                self.order = self.sell()

if __name__ == '__main__':
    cerebro = bt.Cerebro()  #创建了一个机器人大脑(Cerebro),同时隐含创建了一个borker(券商)。
    # 0.1% ... 除以100去掉%号。
    cerebro.broker.setcommission(commission=0.001)
    
    cerebro.broker.set_cash(20000000)  #设置资金
    cerebro.addsizer(bt.sizers.FixedSize, stake=10000)   #设置交易数量
    
    # 增加一个策略
    cerebro.addstrategy(TestStrategy)    

    #设置一一些参数数据    
    start_date = datetime.datetime(2024, 1, 2)  # 回测开始时间
    end_date = datetime.datetime(2024, 8, 16)  # 回测结束时间

    #获取数据
    c='600650'
    #df=pd.read_csv('/xbdata2/day/'+c+'.csv', encoding= 'gbk')
    df=htdx.get_security_bars(nCategory=4,nMarket = 1,code=c,nStart=0, nCount=800) #获取指定范围的证券K线
    df=hgs.initmydf(df)   #小白量化行情数据规格化
    tgs1.loaddf(df)     #加载小白量化格式的行情数据表
    df=tgs1.rungs(gs)  #运行指标公式源码,并返回新的行情表。返回表中包含指标公式的输出数据,


    lst=['ENTERLONG', 'EXITLONG']
    
    mydata=hbt.mkdata(lst=lst)
    #加载数据   
    df['date']=pd.to_datetime(df['datetime'])
    df.index=pd.to_datetime(df['date'])
    exec(mydata)
    
    data = HP_PandasData(dataname=df, fromdate=start_date, todate=end_date)

    cerebro.adddata(data)  # 将数据传入回测系统
    
  

    print('开始资金: %.2f' % cerebro.broker.getvalue())
    cerebro.run()  # 执行策略
    print('结束资金: %.2f' % cerebro.broker.getvalue())
    
    cerebro.plot()  #可视化-画图
    

这个代码也可以在其他编辑中运行,例如VsCode等。

好了,欢迎继续关注我的博客。后面我们介绍更多的二次开发技术。

超越自己是我的每一步!我的进步就是你的进步!

相关推荐
明月_清风16 分钟前
FastAPI 从入门到实战:3 分钟构建高性能异步 API
后端·python·fastapi
笨拙的老猴子21 分钟前
[特殊字符] Java GC机制详解:G1、ZGC、Shenandoah全面解析与版本演进对比
java·开发语言
bellus-22 分钟前
ubuntu26测试win10的ollama大模型性能
python
水木流年追梦24 分钟前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来24 分钟前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
liuyunshengsir37 分钟前
PyTorch 动态量化(Dynamic Quantization)
人工智能·pytorch·python
电子云与长程纠缠1 小时前
UE5制作六边形包裹球体效果
开发语言·python·ue5
砍材农夫1 小时前
物联网 基于netty构建mqtt协议规范(遗嘱与保留消息)
java·开发语言·物联网·netty
DFT计算杂谈1 小时前
KPROJ编译教程
java·前端·python·算法·conda
froginwe111 小时前
Python3 迭代器与生成器
开发语言