一直想试试用backtrader实现日内交易(做T)的回测,之前一直用的是日线的回测,日线回测写起来最简单,不用考虑T+1,不过它的所有操作要等到下一天开盘才能操作,时间上会滞后很多,很多时候策略给出了正确的信号,但是下单时晚了一天结果就大不相同了。

今天这篇实现一个最简单的日内交易回测,一开盘就买,收盘前卖出,不做选股和择时,为之后搭建日内交易策略作基础。

数据选用2024年1月2日至2024年5月29日的1分钟线数据。策略代码 strategy.py 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import datetime
import backtrader as bt
import traceback

class IntraDayStrategy(bt.Strategy):
def __init__(self):
self.order=None
self.trade = None
self.myposition={'buy_date':None,'size':0,'available_size':0}

def log(self, txt, dt=None):
dt = dt or self.datas[0].datetime.datetime(0)
print('%s, %s' % (dt.isoformat(), txt))
# 记录交易收益情况
def notify_trade(self, trade):
if trade.isclosed:
print('毛收益 %0.2f, 扣佣后收益 % 0.2f, 佣金 %.2f, 市值 %.2f, 现金 %.2f' %
(trade.pnl, trade.pnlcomm, trade.commission, self.broker.getvalue(), self.broker.getcash()))


def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
# 订单状态 submitted/accepted,无动作
return

# 订单完成
if order.status in [order.Completed]:
if order.isbuy():
self.log('买单执行,%s, %.2f, %i' % (order.data._name,
order.executed.price, order.executed.size))
self.myposition['buy_date']=order.data.datetime.date(0)
# 更新可用仓位
self.myposition['available_size']=self.myposition['size']
# 更新刚买入的仓位
self.myposition['size']=order.executed.size

elif order.issell():
self.log('卖单执行, %s, %.2f, %i' % (order.data._name,
order.executed.price, order.executed.size))
self.myposition['buy_date']=None
self.myposition['available_size']=0 # 重置可用仓位
print('佣金 %.2f, 市值 %.2f, 现金 %.2f' %
( order.executed.comm, self.broker.getvalue(), self.broker.getcash()))

else:
self.log('订单作废 %s, %s, isbuy=%i, size %i, open price %.2f' %
(order.data._name, order.getstatusname(), order.isbuy(), order.created.size, order.data.open[0]))
self.order=None # 重置订单状态

def next(self):
if self.order:
return
# 没有当天没有买入则一开盘就买入
# 有持仓则收盘前1分钟平昨日仓
if self.myposition['buy_date']!=self.data.datetime.date(0):
cash = self.broker.get_cash()
# 不全仓买入,以实现日内交易,避免下一天买入时资金不够
size=0
if cash > 90000:
size = int(cash * 0.40 / 100 / self.data.close[0]) * 100
else :
size = int(cash * 0.90 / 100 / self.data.close[0]) * 100

try:
if(self.data.datetime.time() == datetime.time(hour=9,minute=31,second=00)):
self.buy(size=size,exectype=bt.Order.Market)
except Exception:
traceback.print_exc()
else:

# 收盘前一分钟平可用仓
if self.data.datetime.time() == datetime.time(hour=14,minute=58,second=00) \
and self.myposition['available_size'] > 0:
self.sell(size=self.myposition['available_size'])

main.py 如下:

阅读全文 »

在使用各种技术指标做回测后,我发现没有什么技术指标是百分之百准确的,比如MACD,它只有在单边行情时有较高的准确率,震荡行情就会频繁止损。

如果能在技术分析的基础上加上对新闻消息的判断,能够及时地根据最新的新闻进行决策,那就能提高我们胜率。

如果已经开通了券商的量化权限,那股票、期货的行情数据就可以用券商的接口了,但是如果想获取新闻数该怎么办呢?

我在网上找了一圈,大部分的接口都是要钱的,免费好用的不多,基本上都有些限制。今天这篇介绍的是akshare,它主要提供行情数据,也支持部分财经新闻数据,通过调用各大平台公开api来获取数据。很多量化教程或开源的量化项目也都是用akshare来获取数据。它支持的数据类型非常多,基本上你能想到的数据接口它都有。大家可以去查看它的文档了解它所支持的各类数据:https://akshare.akfamily.xyz/tutorial.html

akshare支持的新闻数据主要有这些:

阅读全文 »

前段时间开通了qmt的权限,简单体验了一下qmt,真是一言难尽😂,看不懂它的界面设计,太难用了,而且还不支持自动登录,它记不住密码每次都要手动输一遍密码。

好在qmt还有一个miniqmt模式,它支持用xtquant库在我们自己的编程环境中调用相应的量化接口(在qmt中写的代码只支持在qmt环境中运行)。

话不多说,首先来解决自动登录问题吧。那要怎么实现自动登录呢,界面上的自动登录选择框是坏的。我在网上找到了一篇通过脚本启动miniqmt的教程:http://book.piginzoo.com/knowledge/develope/miniqmt.html

我在这篇教程的基础上完善了一下。下面是具体的步骤:

  1. 进入qmt的安装目录:
    3b11af609238ec1d56a8424734f1c54d.png

  2. 新建一个copylinkmini.bat文件,用于获取登录凭证的临时文件,linkmini就是miniqmt启动时所需的登录凭证文件,它会在登录时自动生成,在登录后自动删除,所以只要我们复制一份linkmini文件,再通过相应的启动命令就能实现自动登录了。

阅读全文 »

量化交易要想实盘,最重要的就是能通过程序下单,目前各大券商都有可以申请量化交易的权限,不过门槛各不相同,有的完全没门槛,比如国金证券;有的是低门槛资金量达标即可开通权限,比如万和证券;有的是高门槛,比如东方财富。

好吧,看完我上面这段话,大家应该能猜到我现在都在哪几家券商开户了。目前我已经开通了万和掘金和国金qmt,那为什么还要折腾东方财富呢?

答案是佣金,炒股的人都知道,买卖股票的交易佣金有一个5块的起步价。如果是高频交易或者说资金量比较少只买几手时,这佣金就太贵了。

今天这篇是介绍怎么通过easytrader来实现东方财富的程序化下单,东方财富虽然买卖股票有5块的起步价,但是买卖ETF是免5的。我主要交易ETF,而东财的量化权限门槛比较高暂时还开不了。所以就想着有没有非官方的方法实现下单。

原版的easytrader已经好久不更新了 https://github.com/shidenggui/easytrader 而且它不支持东方财富,我找到了一个支持东方财富的修改版的easytrader https://github.com/jadepeng/pytrader。

阅读全文 »

在上一篇文章中,我们通过CrossOver实现了在M1芯片的Mac上运行Windows版的掘金量化,但是因为没有python环境,无法使用掘金量化的sdk。

这篇文章就来讲一下怎么在M1芯片的Mac上通过docker运行x86架构linux镜像,实现对掘金量化sdk的调用。

首先是启用mac的Rosetta。Rosetta是苹果公司为搭载Apple芯片的Mac电脑开发的二进制翻译技术。它可以让专为英特尔处理器(x86架构)设计的应用程序在Apple芯片(ARM架构)上运行。

1
/usr/sbin/softwareupdate --install-rosetta --agree-to-license

然后启动docker,如果没安装docker的话,需要先安装好docker,建议安装docker desktop省心好用。

阅读全文 »

国内的量化终端通常只支持x86架构的windows,对于intel芯片的老Mac电脑可以安装虚拟机的方式运行,而对于m系列芯片的新Mac电脑,则会有点麻烦,虽然可以通过安装arm版的windows虚拟机来跑x86架构的程序,但速度和兼容性都存在很大问题。

我之前尝试过在arm版的windows虚拟机上运行掘金量化,但是一出界面就会报错,只能作罢。

在一番折腾后,我发现可以通过CrossOver实现在M1芯片的Mac上使用掘金量化。今天,我们就来详细讲解如何在Mac M1上使用CrossOver安装掘金量化软件。

什么是CrossOver?

CrossOver是一款由CodeWeavers开发的商业软件,它基于开源的Wine项目,旨在让用户无需Windows系统就能在Mac和Linux上运行Windows应用程序。与原生虚拟机软件相比,CrossOver更轻量,不需要安装整个Windows操作系统,使用起来也更加方便。

阅读全文 »

外盘和内盘是股票交易中的术语,用于描述买卖力量的强弱。

外盘是指股票的买家以卖家的卖出价而买入成交,成交价为申卖价,表示买盘比较积极。当成交价在卖出价时,将成交数量加入外盘累计数量中。若外盘累计数量比内盘累计数量大很多,表示很多人在抢盘买入股票,这时股票有股价上涨趋势。在国内股票软件中,外盘通常用红色数字表示。

内盘则是指卖家以买家的买入价而卖出成交,成交价为申买价,表示抛盘比较踊跃。当成交价在买入价时,将现手数量加入内盘累计数中。若内盘累计数量比外盘累计数量大很多,而股价下跌时,表示很多人在强抛卖出股票。在国内股票软件中,内盘通常用绿色数字表示。

总的来说,外盘和内盘这两个数据大体可以用来判断买卖力量的强弱。若外盘数量大于内盘,则表现买方力量较强,若内盘数量大于外盘则说明卖方力量较强。但需要注意的是,内外盘之比并不一定能准确地反映股票走势的强弱,因为庄家有可能制造虚假的内外盘数据。因此,在做出投资决策时,需要综合考虑多个因素。

江达小记

阅读全文 »

之前的多周期回测主要适用于股票,今天这篇来说一下期货的多周期回测,期货和股票最大的不同是期货有夜盘,支持T+0。

期货的日线是从前一交易日的夜盘开始到当天的日盘结束,也就是前一天的21点到当天的15点。如果直接加载数据到backtrader的话,默认日线会从当天的23:59:59开始,也就是假如今天是4月17日,那4月17日的日线从4月17日23:59:59形成, 这对于股票来讲没有问题,因为股票的交易时间是9:30到15:00,在盘中用的日线就是前一天的日线。

但是对于期货则不一样了,如果还按照backtrader默认的规则加载,则会在当天的21:00:00至23:59:59前使用前两天的日线(因为从21点开始就算下一天了),在下一天的0点后使用前一天的日线。所以需要对日线收盘时间进行调整。

backtrader的csv数据源加载器提供了调整k线结束时间的功能,只要在添加数据源时加上sessionend参数就可以了。

下面以螺纹钢的15分钟数据和日线数据为例说明一下调整前后的区别:

阅读全文 »

前面那篇文章讲了怎么通过加载多个周期的数据源实现多周期回测,这一篇讲通过单一数据源,利用backtrader的resample功能合成大周期数据源实现多周期回测。

下面以上篇文章的例子,讲一下怎么实现。

比如我只有1分钟k线,想实现这样的一个日内择时的策略:若当前分钟线的收盘价小于前一天的日线最低价则买入,若当前分钟线的收盘价大于前一天的最高价则卖出,怎么做呢?

可以这样,把1分钟线添加到cerebro中,然后通过1分钟线合成日线,策略启动后,每次执行next方法时self.datas都会调用下一根分钟线和分钟线所在日期的日线,这样在next方法中只用考虑当前分钟线和前一天日线就可以了。

下面是具体的代码,用的恒生科技ETF2024年3月份的数据:
main.py

阅读全文 »

从去年年初开始生成式AI的浪潮已经席卷全世界,从最开始的chatgpt一枝独秀到后来大模型的百花齐放。AI已经离我们越来越近了,那怎么把AI的能力用到炒股上呢?今天这篇讲最简单的最容易上手的,让AI帮我们分析新闻,整理数据。

目前国内可以免费用的AI大模型主要有:文心一言【https://yiyan.baidu.com/】、通义千问【https://tongyi.aliyun.com/qianwen/】、讯飞星火【https://xinghuo.xfyun.cn/】、天工AI【https://www.tiangong.cn/chat/universal/016】、腾讯混元【https://hunyuan.tencent.com/bot/chat】
国外可以免费用的AI大模型主要有:chatgpt【https://chat.openai.com/】、gemini【https://gemini.google.com/app】

这里以文心一言为例,介绍一下怎么用它来分析新闻。

首先在对话框里输入以下提示语:

忘掉之前的所有指示。假定你是一位金融专家,一位有股票推荐经验的金融专家。请判断每一行消息是利好还是利空,如果是好消息,回答‘是’;如果是坏消息,回答‘否’;如果不确定,回答‘未知’。然后用简短的句子进行阐述。

阅读全文 »
0%