backtrader期權回測框架

使用backtrader數據進行回測,數據源來自于交易所爬取。

效果還行,我相信各位通過這個的框架學習,會對backtrader的應用有更深的領悟。包括數據的連接,新指標的加入。

導入框架:

__future__ import (absolute_import, division, print_function, unicode_literals)
import pymysql
from sqlalchemy import create_engine
import pandas as pd
import numpy as np
import pymssql
import datetime
import os.path
import sys
import backtrader as bt
import pandas as pd
import akshare as ak
import matplotlib
import matplotlib.pyplot as plt
from backtrader.feeds import PandasData
import datetime
from backtrader.feeds import PandasData
starttime = datetime.datetime.now()
print(starttime)

導入數據

df_read = pd.read_csv('option1.csv')
#df_read = df_read[~df_read['ts_code'].isin([0])]date_value_list  = []

創建策略

class BollStrategy(bt.Strategy):# 可配置策略參數params = dict(poneplot=False,  # 是否打印到同一張圖pstake=1,      # 單筆交易股票數據)def __init__(self):self.order = None# for i, d in enumerate(self.datas):#     #跳過第一只股票data,第一只股票data作為主圖數據#     if i == 0:#         if self.p.poneplot:#             d.plotinfo.plotmaster = self.datas[0]def prenext(self):# for i,d in enumerate(self.datas):# print(d._name)self.next()# 策略核心,根據條件執行買賣交易指令(必選)def next(self):# 獲取當天日期date = self.datas[0].datetime.date(0)# 獲取當天valuevalue = self.broker.getvalue()# 存入列表date_value_list.append((date, value))for i,d in enumerate(self.datas):#self.log(f'收盤價,{self.datas[i].close[0]}')dt,dn = self.datetime.date(), d._name   #獲取時間和股票代碼print(self.datas[i].rt[0])if self.order:returnpos = self.getposition(d).sizeif not pos:if self.datas[i].close[0] > 0:self.log(d._name, 'SELL Create, %2f' %self.datas[i].close[0])self.order = self.sell(d , size=self.p.pstake)elif self.datas[i].close[0] == 0 or self.datas[i].close[0] > pos.price * 2 or self.datas[i].rt[0] == 0 :self.log(d._name, 'CLOSE Create, %2f' % self.datas[i].close[0])self.order = self.close(d , size= self.p.pstake)#pass# print(self.datetime.date())# for i, d in enumerate(self.datas):#     pos = self.getposition(d)#     if not len(pos):#         if d.close[0]>0:#             self.sell(d,size= self.p.pstake)#         elif d.close[0] ==0 or d.close[0] > pos.price * 2:#             self.close(d,size= self.p.pstake)# for d in self.datas:#     if len(d) == 0:#         continue#     else:#         # 獲取當天日期#         date = self.datetime.date()#         print(self.datas[0].datetime[0])#         #print(date)#         #查看持倉盈利情況#         for i,d in enumerate(self.datas):#             pos = self.getposition(d)#             # if self.datas[i].close[0] < 0.05:#             #     self.close(d,size = self.params.pstake)#             if len(pos):#                 # print('{}, 持倉:{}, 成本價:{}, 當前價:{}, 盈虧:{:.2f}'.format(#                 #     d._name, pos.size, pos.price, pos.adjbase, pos.size * (pos.adjbase - pos.price)),#                 #     file=self.log_file)#                 # print('{}, 持倉:{}, 成本價:{}, 當前價:{}, 盈虧:{:.2f}'.format(#                 #     d._name, pos.size, pos.price, pos.adjbase, pos.size * (pos.adjbase - pos.price)),#                 #     )#                 if self.datas[i].close[0] == 0:#                     self.close(d,size=self.params.pstake)#         # 獲取當天value#         value = self.broker.getvalue()##         # 存入列表#         date_value_list.append((date, value))##         for i,d in enumerate(self.datas):#             #if self.datas[i].close[0] > 0.01:#             try:#                 if self.datas[i].close[0] > 0:#                     #print('buy',d.close[0])#                     self.sell(data = d, size=self.params.pstake)#                     #print(d._name)#                     #order.addinfo(ticker=d._name)#                     #print(d._name)#                 # else:#                 #     #print('sell',d.close[0])#                 #     self.close(data = d, size=self.params.pstake)#                 #     #order.addinfo(ticker=d._name)#                 #     #print(d._name)#             except:#                 pass#交易記錄日志def log(self,txt,dt = None,doprint=False):dt = dt or self.datas[0].datetime.date(0)f = open("log.txt",'a')date = self.datas[0].datetime.date(0)f.write(f'{date},{txt}')f.write("\n")f.close()print(f'{txt}')# 記錄交易收益情況(可省略,默認不輸出結果)def notify_trade(self, trade):if not trade.isclosed:returnself.log(f'策略收益:\n毛收益 {trade.pnl:.2f}, 凈收益 {trade.pnlcomm:.2f}')# 訂單狀態變化時引擎會調用notify_order# 記錄交易執行情況(可省略,默認不輸出結果)def notify_order(self, order):#print(order.getstatusname(order.status))if order.status in [order.Submitted, order.Accepted]:return# 如果交易已經完成,顯示成交信息if order.status in [order.Completed]:if order.isbuy() or order.issell():self.log(f'買入:\n價格:{order.executed.price},\成本:{order.executed.value},\手續費:{order.executed.comm}')self.buyprice = order.executed.priceself.buycomm = order.executed.commelse:self.log(f'賣出:\n價格:{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('交易失敗')self.order = None
#回測結束后輸出結果(可省略,默認輸出結果)# def stop(self):#     self.log('(MA均線: %2d日) 期末總資金 %.2f' %#              (self.params.maperiod, self.broker.getvalue()), doprint=True)def stop(self):self.log('期末總資金 %.2f' %(self.broker.getvalue()), doprint=True)

添加參數

#添加參數
class ETFOptionPandasData(PandasData):# 新增兩條數據線lines = ('rt',)# 新增數據在dataframe中的位置,分別是第6列和第7列params = (('rt', 6),)

調取數據,放入cerebro

cerebro = bt.Cerebro()
# 建立期權池
stk_pools = df_read['ts_code'].unique().tolist()
# 獲取期權數據
for stk_code in stk_pools:df = df_read[df_read['ts_code'] == stk_code]df.index = pd.to_datetime(df['datetime'])#print(df.head())#data = ETFOptionPandasData(dataname=df)df = df[['ts_code', 'open', 'high', 'low', 'close', 'volume','rt']]#print(df.head())data = ETFOptionPandasData(dataname = df,datetime = -1)cerebro.adddata(data, name = str(stk_code))

運行策略,添加交易參數

cerebro.broker.setcash(10000000.0)
cerebro.broker.setcommission(commission=1.62,margin = 2000,mult= 10000 )
cerebro.addstrategy(BollStrategy)
cerebro.broker.set_coc(True)#設置以當天收盤價成交
cerebro.run()  #減少內存。此設置會自動禁止數據預加載(preload)和指標預計算(runonce),也禁止繪圖plot,因為內存中數據不足以繪圖了。
for d in cerebro.datas:d.plotinfo.plot =False
print('cash',cerebro.broker.getvalue())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449494.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kong入門實戰

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 安裝kong-database docker run -d --name kong-database \-p 5432:5432 \-e "POSTGRES_USERkong" \-e "POSTGRES_DBkong&…

PAT A1048

示例思想中提到了二分以及two point概念&#xff0c;這個需要后面進行總結&#xff1b;這個示例也給出了一個新的思路。對于兩個數字和m&#xff0c;查找兩個加數&#xff0c;可以進行i和m-i的枚舉&#xff0c;通過遍歷數組查看兩個加數是否存在&#xff0c;來進行遍歷&#xf…

linux 32位平臺,文件大小受限于2G的解決方法

公司的asterisk系統已經發生了兩次crash&#xff0c;檢查日志&#xff0c;都是在日志文件寫滿到2G后自動執行轉儲時&#xff0c;日志還在寫繼續寫入而導致的。google以后&#xff0c;發現了下面這邊文章&#xff0c;贊&#xff01;解決了文件大小限于2G的問題&#xff0c;轉帖到…

【noip模擬賽4】Matrix67的派對 暴力dfs

【noip模擬賽4】Matrix67的派對描述 Matrix67發現身高接近的人似乎更合得來。Matrix67舉辦的派對共有N(1<N<10)個人參加&#xff0c;Matrix67需要把他們安排在圓桌上。Matrix67的安排原則是&#xff0c;圓桌上任意兩個相鄰人的身高之差不能超過K。請告訴Matrix67他共有多…

Backtrader多周期回測

獲取數據 result pd.read_csv(11.csv) df pd.DataFrame(dataresult) df df.set_index([datetime]) df 策略 class MultiTFStrategy(bt.Strategy):params ((period, 20),)# states definationEmpty, M15Hold, H1Hold, D1Hold range(4)States [Empty, M15Hold, H1Hold, D…

CentOS 7 防火墻操作

導語 今天說下防火墻的操作。CentOS 6 的防火墻是 iptables&#xff0c;CentOS 7 默認的是 firewall&#xff0c;以前的操作不再適用。 查看、開啟 服務器剛剛重啟完畢&#xff0c;先來看下防火墻的狀態&#xff0c;輸入 systemctl status firewalld 進行查看 這里是關閉的&…

Centos安裝nmon軟件 ( 測試 )

安裝 mkdir /usr/local/nmon cd /usr/local/nmon wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz tar zxvf nmon_linux_14i.tar.gz chmod 777 nmon_x86_64_sles11 12345 啟動 ./nmon_x86_64_sles11 1 說明&#xff1a; 按C顯示CPU信息&#xff0c;再按…

阿里云安裝Quantaxis

參考博客&#xff1a;https://github.com/QUANTAXIS/QUANTAXIS/issues/1395 之后進入阿里云中的Ubuntu界面 輸入&#xff1a; sudo yum install apt-transport-https ca-certificates curl software-properties-common Sudo yum install curl service network restartcd qua…

sorted_一個函數秒殺冒泡排序算法和選擇排序

sorted一招殺a [3,9,12,4,5,7,8,110]print(sorted(a,reverseTrue))# true為降序print(sorted(a,reverseFalse))# revers false為升序print(sorted(a))#默認是false升序排列Bubble_sort下面看看坑死人無數的冒泡排序內循環和外循環每次循環依次比較大小并來回挪坑,直到把目標值…

轉載給ffmpeg入門級:我的第一個調用FFmpeg庫的程序出爐

好消息&#xff0c;寫了第一個使用了ffmpeg的庫的小程序。看起來就是這么簡單的一個消息&#xff0c;但是you have no idea how much work that I did before it works...廢話少說&#xff0c;總結記錄之。。。一、安裝好Linux的虛擬機。我用的是FEDORA-16&#xff0c;當然別的…

runC爆嚴重安全漏洞,主機可被攻擊!使用容器的快打補丁

容器的安全性一直是容器技術的一個短板。關于容器最大的安全隱患是攻擊者可以使用惡意程序感染容器&#xff0c;更嚴重時可以攻擊主機系統。 2月11日&#xff0c;安全研究員Adam Iwaniuk和BorysPop?awski發現了容器運行時runC的一個安全漏洞&#xff0c;這個漏洞可以讓上述情況…

pandas操作sql數據庫

導包 import pymssql from sqlalchemy import create_engine import pandas as pd 連接數據庫 #讀數據 conn pymssql.connect(server.,user sa,password test,databasepos) sql select * from stock_data df0 pd.read_sql(sql,conn) 寫入數據 df pd.read_csv(option_…

MongoDB Mobile Sync for iOS推出Beta版本

2019年2月11日&#xff0c;MongoDB官方博客發文稱MongoDB Mobile Sync for iOS的Beta版本即將推出。MongoDB Mobile支持使用單一查詢語言進行本地和遠程數據訪問&#xff0c;包含兩個核心部分&#xff1a; MongoDB數據庫的移動優化版本&#xff0c;運行在本地設備上&#xff0c…

gdb好文章:GDB十分鐘教程

&#xff08;GUI調試器&#xff1a;insight和ddd&#xff09; list(l) &#xff1a;其作用就是列出程序的源代碼&#xff0c;默認每次顯示10行。 list 行號&#xff1a;將顯示當前文件以“行號”為中心的前后10行代碼&#xff0c;如&#xff1a;list 12 list 行號1,行號2: 將…

機器學習預測+akshare

import pandas as pd import akshare as ak import numpy as np import talib from datetime import datetime, timedelta import time 獲取股票數據 from_date 2010-01-01 from_date datetime.strptime(from_date,"%Y-%m-%d") day_nums 1 current_dt time.st…

[python作業AI畢業設計博客]比Selenium IDE更好用的錄制工具: Katalon Recorder

Selenium IDE(集成開發環境 Integrated Development Environment)是用于構建測試腳本的原型工具。 它是一個Firefox插件&#xff0c;提供了易于使用的界面&#xff0c;用于開發自動化測試。 但是最新的Selenium IDE總是彈出一系列如下的對話框&#xff0c;不能直接錄制&#xf…

CentOS 7 : Docker私有倉庫搭建和使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 系統環境&#xff1a; CentOS 7.2 192.168.0.179&#xff1a;docker倉庫 192.168.0.60&#xff1a;客戶端 安裝并啟動docker yum -y…

價值投資/指標選股(akshare)

利用akshare的數據源&#xff0c;可以獲取所有的股票數據以及公開的財務數據&#xff0c;可以進行條件篩選&#xff0c;獲取滿足條件的股票。 這套模板可以用于價值投資&#xff0c;指標選股。選股周期為日線級別。然后結果可以郵箱發送。 import time import akshare as ak #…

gdb常用命令

[rootredhat home]#gdb 調試文件&#xff1a;啟動gdb (gdb) l &#xff1a;&#xff08;字母l&#xff09;從第一行開始列出源碼 (gdb) break n :在第n行處設置斷點 (gdb) break func&#xff1a;在函數func()的入口處設置斷點 (gdb) info break&#xff1a; 查看斷點信息 (gdb…

有前途的人工智能大數據分析相關職業:Python數據科學入門之路

2019獨角獸企業重金招聘Python工程師標準>>> 為什么學習Python數據科學&#xff1f; Python是數據科學職業所需的寶貴技能之一。Python是數據科學的首選編程語言。 2016年&#xff0c;它超越了R on Kaggle&#xff0c;這是數據科學競賽的首選平臺。2017年&#xff0…