1 Star 0 Fork 6

高强/BackTrader初尝试

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
SimpleStrategy.py 2.96 KB
一键复制 编辑 原始数据 按行查看 历史
mw8216 提交于 2021-08-15 01:03 . update
import backtrader as bt
class SimpleStrategy(bt.Strategy):
# 策略参数
params = dict(
period=20, # 均线周期
look_back_days=30,
printlog=False
)
def __init__(self):
self.mas = dict()
#遍历所有股票,计算20日均线
for data in self.datas:
self.mas[data._name] = bt.ind.SMA(data.close, period=self.p.period)
def next(self):
#计算截面收益率
rate_list=[]
for data in self.datas:
if len(data)>self.p.look_back_days:
p0=data.close[0]
pn=data.close[-self.p.look_back_days]
rate=(p0-pn)/pn
rate_list.append([data._name,rate])
#股票池
long_list=[]
sorted_rate=sorted(rate_list,key=lambda x:x[1],reverse=True)
long_list=[i[0] for i in sorted_rate[:10]]
# 得到当前的账户价值
total_value = self.broker.getvalue()
p_value = total_value*0.9/10
for data in self.datas:
#获取仓位
pos = self.getposition(data).size
if not pos and data._name in long_list and \
self.mas[data._name][0]>data.close[0]:
size=int(p_value/100/data.close[0])*100
self.buy(data = data, size = size)
if pos!=0 and data._name not in long_list or \
self.mas[data._name][0]<data.close[0]:
self.close(data = data)
def log(self, txt, dt=None,doprint=False):
if self.params.printlog or doprint:
dt = dt or self.datas[0].datetime.date(0)
print(f'{dt.isoformat()},{txt}')
#记录交易执行情况(可省略,默认不输出结果)
def notify_order(self, order):
# 如果order为submitted/accepted,返回空
if order.status in [order.Submitted, order.Accepted]:
return
# 如果order为buy/sell executed,报告价格结果
if order.status in [order.Completed]:
if order.isbuy():
self.log(f'买入:\n价格:{order.executed.price:.2f},\
成本:{order.executed.value:.2f},\
手续费:{order.executed.comm:.2f}')
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
else:
self.log(f'卖出:\n价格:{order.executed.price:.2f},\
成本: {order.executed.value:.2f},\
手续费{order.executed.comm:.2f}')
self.bar_executed = len(self)
# 如果指令取消/交易失败, 报告结果
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('交易失败')
self.order = None
#记录交易收益情况(可省略,默认不输出结果)
def notify_trade(self,trade):
if not trade.isclosed:
return
self.log(f'策略收益:\n毛收益 {trade.pnl:.2f}, 净收益 {trade.pnlcomm:.2f}')
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/dl-high-strength/backtrader-initial-attempt.git
[email protected]:dl-high-strength/backtrader-initial-attempt.git
dl-high-strength
backtrader-initial-attempt
BackTrader初尝试
master

搜索帮助