ptrade回测和实盘支持可转债日内tick/分时吗?
是支持的。
比如下面的部分代码片段,是用于导出可转债的日内分时数据的。最低颗粒,按照一分钟k线获取。 ptrade里面能够获取到的最小频率单位。
然后在handle_data里面加入相关的order就可以交易了。(上面的代码主要是保存tick/分时数据到mysql,实际并没有进行交易。) 收起阅读 »
比如下面的部分代码片段,是用于导出可转债的日内分时数据的。最低颗粒,按照一分钟k线获取。 ptrade里面能够获取到的最小频率单位。
def initialize(context):
# 初始化策略
g.code_mapper = date_code_mapper()
log.info(g.code_mapper)
g.error_set=set()
def last_n_day(date,n,origin_fmt,target_fmt):
return (datetime.datetime.strptime(date, origin_fmt) - datetime.timedelta(days=n)).strftime(target_fmt)
def post_fix(code):
return code + '.SZ' if code.startswith('12') else code + '.SS'
def handle_data(context, data):
date=context.blotter.current_dt.strftime('%Y%m%d')
if date not in g.code_mapper:
return
security_list=g.code_mapper.get(date)
for code in security_list:
code=post_fix(code)
try:
df = get_history(1, frequency='1m', field=['open' ,'high','low','close'], security_list=code, fq='pre',include=False)
except Exception as e:
if code not in g.error_set:
log.info(e)
log.info('代码获取数据 出错{}'.format(code))
g.error_set.add(code)
continue
df['ticker']=code
g.result.append(df)
def after_trading_end(context, data):
#engine = DBS
db = DBSelector()
conn = db.get_engine()
date=context.blotter.current_dt.strftime('%Y%m%d%H%M')
if len(g.result)==0:
return
df = pd.concat(g.result)
try:
df.to_sql('minute_info',con=conn,if_exists='append')
except Exception as e:
log.info(e)
g.result=
def before_trading_start(context, data):
g.result=
然后在handle_data里面加入相关的order就可以交易了。(上面的代码主要是保存tick/分时数据到mysql,实际并没有进行交易。) 收起阅读 »
ciso8601 性能对比 datetime 默认库
In [1]: import datetime, aniso8601, iso8601, isodate, dateutil.parser, arrow, ciso8601
In [2]: ds = u'2014-01-09T21:48:00.921000'
In [3]: %timeit ciso8601.parse_datetime(ds)
1000000 loops, best of 3: 204 ns per loop
In [4]: %timeit datetime.datetime.strptime(ds, "%Y-%m-%dT%H:%M:%S.%f")
100000 loops, best of 3: 15 µs per loop
In [5]: %timeit dateutil.parser.parse(ds)
10000 loops, best of 3: 122 µs per loop
In [6]: %timeit aniso8601.parse_datetime(ds)
10000 loops, best of 3: 28.9 µs per loop
In [7]: %timeit iso8601.parse_date(ds)
10000 loops, best of 3: 42 µs per loop
In [8]: %timeit isodate.parse_datetime(ds)
10000 loops, best of 3: 69.4 µs per loop
In [9]: %timeit arrow.get(ds).datetime
10000 loops, best of 3: 87 µs per loop
In [1]: import datetime, aniso8601, iso8601, isodate, dateutil.parser, arrow, ciso8601
In [2]: ds = u'2014-01-09T21:48:00.921000+05:30'
In [3]: %timeit ciso8601.parse_datetime(ds)
1000000 loops, best of 3: 525 ns per loop
In [4]: %timeit dateutil.parser.parse(ds)
10000 loops, best of 3: 162 µs per loop
In [5]: %timeit aniso8601.parse_datetime(ds)
10000 loops, best of 3: 36.8 µs per loop
In [6]: %timeit iso8601.parse_date(ds)
10000 loops, best of 3: 53.5 µs per loop
In [7]: %timeit isodate.parse_datetime(ds)
10000 loops, best of 3: 82.6 µs per loop
In [8]: %timeit arrow.get(ds).datetime
10000 loops, best of 3: 104 µs per loop
Even with time zone information, ciso8601 is 70x as fast as aniso8601.
Tested on Python 2.7.10 on macOS 10.12.6 using the following modules:
ciso8601 是纳秒级别的,如果要对上千万的数据操作,建议使用ciso这个C库。
收起阅读 »
ubuntu 安装ciso8601库 失败, 已解决
ubuntu20; ciso8601库是一个高性能的时间解析库,基于C底层写的。pip install ciso8601 报错 :
看样子,是setuptool的问题。 为了避免动这个默认库,可以安装降级版本的ciso。
pip install ciso8601==1.0.7
收起阅读 »
Collecting setuptools>=40.8.0
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. (read timeout=15)")': /packages/a4/53/bfc6409447ca024558b8b19d055de94c813c3e32c0296c48a0873a161cf5/setuptools-63.2.0-py3-none-any.whl
Downloading setuptools-63.2.0-py3-none-any.whl (1.2 MB)
━━━━╸ 0.1/1.2 MB 102.5 kB/s eta 0:00:11
ERROR: Exception:
Traceback (most recent call last):
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/urllib3/response.py", line 435, in _error_catcher
yield
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/urllib3/response.py", line 516, in read
data = self._fp.read(amt) if not fp_closed else b""
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/cachecontrol/filewrapper.py", line 90, in read
data = self.__fp.read(amt)
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/http/client.py", line 462, in read
n = self.readinto(b)
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/http/client.py", line 506, in readinto
n = self.fp.readinto(b)
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/socket.py", line 704, in readinto
return self._sock.recv_into(b)
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/ssl.py", line 1241, in recv_into
return self.read(nbytes, buffer)
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/ssl.py", line 1099, in read
return self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/cli/base_command.py", line 167, in exc_logging_wrapper
status = run_func(*args)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/cli/req_command.py", line 205, in wrapper
return func(self, options, args)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/commands/install.py", line 341, in run
requirement_set = resolver.resolve(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/resolver.py", line 94, in resolve
result = self._result = resolver.resolve(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/resolvelib/resolvers.py", line 481, in resolve
state = resolution.resolve(requirements, max_rounds=max_rounds)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/resolvelib/resolvers.py", line 348, in resolve
self._add_to_criteria(self.state.criteria, r, parent=None)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/resolvelib/resolvers.py", line 172, in _add_to_criteria
if not criterion.candidates:
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/resolvelib/structs.py", line 151, in __bool__
return bool(self._sequence)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/found_candidates.py", line 155, in __bool__
return any(self)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/found_candidates.py", line 143, in <genexpr>
return (c for c in iterator if id(c) not in self._incompatible_ids)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/found_candidates.py", line 47, in _iter_built
candidate = func()
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/factory.py", line 215, in _make_candidate_from_link
self._link_candidate_cache[link] = LinkCandidate(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/candidates.py", line 291, in __init__
super().__init__(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/candidates.py", line 161, in __init__
self.dist = self._prepare()
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/candidates.py", line 230, in _prepare
dist = self._prepare_distribution()
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/resolution/resolvelib/candidates.py", line 302, in _prepare_distribution
return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/operations/prepare.py", line 428, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/operations/prepare.py", line 473, in _prepare_linked_requirement
local_file = unpack_url(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/operations/prepare.py", line 155, in unpack_url
file = get_http_url(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/operations/prepare.py", line 96, in get_http_url
from_path, content_type = download(link, temp_dir.path)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/network/download.py", line 146, in __call__
for chunk in chunks:
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/cli/progress_bars.py", line 53, in _rich_progress_bar
for chunk in iterable:
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_internal/network/utils.py", line 63, in response_chunks
for chunk in response.raw.stream(
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/urllib3/response.py", line 573, in stream
data = self.read(amt=amt, decode_content=decode_content)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/urllib3/response.py", line 538, in read
raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/contextlib.py", line 137, in __exit__
self.gen.throw(typ, value, traceback)
File "/tmp/pip-standalone-pip-oas0cddc/__env_pip__.zip/pip/_vendor/urllib3/response.py", line 440, in _error_catcher
raise ReadTimeoutError(self._pool, None, "Read timed out.")
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
看样子,是setuptool的问题。 为了避免动这个默认库,可以安装降级版本的ciso。
pip install ciso8601==1.0.7
收起阅读 »
systemctl start influxdb 服务启动出错
又是一次典型的csdn踩坑记。。。。。
csdn的原文内容:
https://blog.csdn.net/xiangjai/article/details/123718413
安装上面的配置走,ubuntu的influxdb一直无法启动。
只好一个一个选项的排除:
最后发现那个bind-address的问题:
把端口哪行注释了,先用着。。。
csdn的原文内容:
https://blog.csdn.net/xiangjai/article/details/123718413
安装上面的配置走,ubuntu的influxdb一直无法启动。
只好一个一个选项的排除:
最后发现那个bind-address的问题:
把端口哪行注释了,先用着。。。
bolt-path = "/var/lib/influxdb/influxd.bolt"收起阅读 »
engine-path = "/var/lib/influxdb/engine"
enable = true
#bind-address = ":8086"
docker安装的podman报错
podman 报错
本来计划在docker里面安装一个docker,启动docker报错,
于是安装了一个podman,结果ps -a的时候报错。
唯一的办法,可能就是启动第一个docker的时候使用特权模式, privillage=True
收起阅读 »
ERRO[0000] 'overlay' is not supported over overlayfs
Error: error creating libpod runtime: 'overlay' is not supported over overlayfs: backing file system is unsupported for this graph driver
本来计划在docker里面安装一个docker,启动docker报错,
于是安装了一个podman,结果ps -a的时候报错。
唯一的办法,可能就是启动第一个docker的时候使用特权模式, privillage=True
收起阅读 »
映射端口 methodot 云主机 外部访问
默认情况下,methodot提供的免费云主机 固定了几个端口给外部访问:
如果我们做了web,要怎么映射出来呢?
很简单,只要把web端口改为8001 - 8005 之中的一个。
然后用上面表格中对应的端口映射来访问就可以了
比如下面的flask代码:
因为8001映射出去的端口是 33442,
所以你可以在浏览器访问你的主机:
curl http://xxxxxxxxxxxxx.methodot.com:33442/
话说,之前以为这个主机随时提桶跑路的,不过用到现在还好。
每一个应用都是一个docker镜像。 所以你的linux系统是无法使用 systemctl 控制服务启动的。
会包权限不够。 收起阅读 »
如果我们做了web,要怎么映射出来呢?
很简单,只要把web端口改为8001 - 8005 之中的一个。
然后用上面表格中对应的端口映射来访问就可以了
比如下面的flask代码:
from flask import Flask, jsonify
# 最基本的测试
app =Flask(__name__)
@app.route('/about')
def about():
return 'this is about page'
@app.route('/404')
def error_handle():
return '404 error'
@app.route('/')
def error_handle():
return jsonify({'code':100})
if __name__=='__main__':
app.run(host='0.0.0.0',port=8001,debug=True)
因为8001映射出去的端口是 33442,
所以你可以在浏览器访问你的主机:
curl http://xxxxxxxxxxxxx.methodot.com:33442/
话说,之前以为这个主机随时提桶跑路的,不过用到现在还好。
每一个应用都是一个docker镜像。 所以你的linux系统是无法使用 systemctl 控制服务启动的。
会包权限不够。 收起阅读 »
vmware player Unable to install all modules. See log for details
Vmware player
Unable to install all modules. See log for details
ubuntu下的vmware play经常会让更新模块。一起点击确认就可以正常编译更新。
而且一定要编译后才能打开虚拟机系统
但是奇怪的是,最近一次点击 更新,报错:
显示的英文错误信息:
Unable to install all modules. See log for details
看了日志:
报错信息在这里:
遇到问题后就google一番。
果然还是老外大神多。
翻了一个解决方案后,终于找到一个可行的。【所以必须的英语水平还是要的】
可行的方案:
去github下载最新的host-modules
https://github.com/mkubecek/vmware-host-modules
下载一个最新的。
然后解压:
得到以下文件
然后我们打包两个文件夹
这时,文件夹下多了2个tar的文件,vmmon.tar和vmnet.tar
然后拷贝到 目录:
/usr/lib/vmware.modules.source
之后可以直接编译:
安装完成之后,再次打开vmware player就可以看到:
这样就是成功了。
收起阅读 »
Unable to install all modules. See log for details
ubuntu下的vmware play经常会让更新模块。一起点击确认就可以正常编译更新。
而且一定要编译后才能打开虚拟机系统
但是奇怪的是,最近一次点击 更新,报错:
显示的英文错误信息:
Unable to install all modules. See log for details
看了日志:
26 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmmon-only/./include/vm_assert.h:372:22: note: in definition of macro ‘ASSERT_ON_COMPILE’
25 2022-07-15T02:15:09.595Z In(05) host-7426 372 | _Static_assert(e, #e); \
24 2022-07-15T02:15:09.595Z In(05) host-7426 | ^
23 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmmon-only/./include/vm_asm_x86.h:215:7: note: in expansion of macro ‘ASSERT_ON_COMPILE_SELECTOR_SIZE’
22 2022-07-15T02:15:09.595Z In(05) host-7426 215 | ASSERT_ON_COMPILE_SELECTOR_SIZE(expr); \
21 2022-07-15T02:15:09.595Z In(05) host-7426 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmmon-only/./include/vm_asm_x86.h:227:22: note: in expansion of macro ‘SET_SEGREG’
19 2022-07-15T02:15:09.595Z In(05) host-7426 227 | #define SET_GS(expr) SET_SEGREG(gs, expr)
18 2022-07-15T02:15:09.595Z In(05) host-7426 | ^~~~~~~~~~
17 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmmon-only/common/task.c:2726:10: note: in expansion of macro ‘SET_GS’
16 2022-07-15T02:15:09.595Z In(05) host-7426 2726 | SET_GS(gs);
15 2022-07-15T02:15:09.595Z In(05) host-7426 | ^~~~~~
14 2022-07-15T02:15:09.595Z In(05) host-7426 make[2]: *** [scripts/Makefile.build:285: /tmp/modconfig-PB4afO/vmmon-only/common/task.o] Error 1
13 2022-07-15T02:15:09.595Z In(05) host-7426 make[2]: *** Waiting for unfinished jobs....
12 2022-07-15T02:15:09.595Z In(05) host-7426 make[1]: *** [Makefile:1875: /tmp/modconfig-PB4afO/vmmon-only] Error 2
11 2022-07-15T02:15:09.595Z In(05) host-7426 make: *** [Makefile:117: vmmon.ko] Error 2
10 2022-07-15T02:15:09.595Z In(05) host-7426 Using kernel build system.
9 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmnet-only/driver.c: In function ‘VNetFileOpUnlockedIoctl’:
8 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmnet-only/driver.c:966:7: warning: this statement may fall through [-Wimplicit-fallthrough=]
7 2022-07-15T02:15:09.595Z In(05) host-7426 966 | {
6 2022-07-15T02:15:09.595Z In(05) host-7426 | ^
5 2022-07-15T02:15:09.595Z In(05) host-7426 /tmp/modconfig-PB4afO/vmnet-only/driver.c:976:4: note: here
4 2022-07-15T02:15:09.595Z In(05) host-7426 976 | case SIOCGETAPIVERSION:
3 2022-07-15T02:15:09.595Z In(05) host-7426 | ^~~~
2 2022-07-15T02:15:09.595Z In(05) host-7426 Skipping BTF generation for /tmp/modconfig-PB4afO/vmnet-only/vmnet.ko due to unavailability of vmlinux
1 2022-07-15T02:15:09.595Z In(05) host-7426 Unable to install all modules. See log for details.
报错信息在这里:
host-7426 Skipping BTF generation for /tmp/modconfig-PB4afO/vmnet-only/vmnet.ko due to unavailability of vmlinux
host-7426 Unable to install all modules. See log for details
遇到问题后就google一番。
果然还是老外大神多。
翻了一个解决方案后,终于找到一个可行的。【所以必须的英语水平还是要的】
可行的方案:
去github下载最新的host-modules
https://github.com/mkubecek/vmware-host-modules
下载一个最新的。
然后解压:
unzip w16.2.3-k5.17.zip
得到以下文件
INSTALL
LICENSE
Makefile
README
vmmon-only
vmnet-only
然后我们打包两个文件夹
vmmon-only
vmnet-only
tar -cf vmmon.tar vmmon-only
tar -cf vmnet.tar vmnet-only
这时,文件夹下多了2个tar的文件,vmmon.tar和vmnet.tar
然后拷贝到 目录:
/usr/lib/vmware.modules.source
sudo cp -v vmmon.tar vmnet.tar /usr/lib/vmware/modules/source/
之后可以直接编译:
sudo vmware-modconfig --console --install-all
安装完成之后,再次打开vmware player就可以看到:
这样就是成功了。
收起阅读 »
linux监控shell进程是否运行,不运行的时候自动启动
脚本很简单。
保存为monitor.sh
给个执行权限
chmod +x monitor.sh
然后设置定时任务,
比如隔5分钟运行一次上面的脚本
*/5 * * * * monitor.sh
收起阅读 »
保存为monitor.sh
#!/bin/bash
line=$(ps -aux | grep -c /usr/sbin/ssh | grep -v "grep")
# 匹配的行数
if [ $line -eq 1 ];
then
sudo /etc/init.d/ssh restart
# 重启ssh服务
else
echo ssh is running....
# 向日志发送邮件,显示ssh运行中。。。
fi
给个执行权限
chmod +x monitor.sh
然后设置定时任务,
比如隔5分钟运行一次上面的脚本
*/5 * * * * monitor.sh
收起阅读 »
批量修改wordpress文章中的所有的链接
有时候你的文章中,某个地方的引用的链接失效了。需要你去替换一个新的链接。
假如只有2,3篇文章需要修改,那么就很简单,进入wordpress的后台进行修改。
但如果动辄几十篇,甚至上百上千篇文章,手动修改就工作量太大了,且容易出错。
那么可以选择后台数据库直接修改。
1. 先备份一下数据库,以防操作失误导致数据丢失。
2. 打开数据库软件,比如navicat
找到wp_post 这个表
运行下面的命令:
上面的sql命令就是把crop.png 的图片改为 resize.png 的图片的mysql命令。
修改万后,刷新一下缓存就可以了。 收起阅读 »
假如只有2,3篇文章需要修改,那么就很简单,进入wordpress的后台进行修改。
但如果动辄几十篇,甚至上百上千篇文章,手动修改就工作量太大了,且容易出错。
那么可以选择后台数据库直接修改。
1. 先备份一下数据库,以防操作失误导致数据丢失。
2. 打开数据库软件,比如navicat
找到wp_post 这个表
运行下面的命令:
UPDATE wp_posts set post_content = REPLACE(post_content,"crop.png","hxxy-resize.png") where post_content like '%crop.png%';
上面的sql命令就是把crop.png 的图片改为 resize.png 的图片的mysql命令。
修改万后,刷新一下缓存就可以了。 收起阅读 »
一创聚宽的实盘只支持每日开盘价和分钟交易
在一创的官网里面浏览到了一创上跑聚宽实盘的一些信息:
不支持虚拟机和xp系统,费率万2.5(这个实在要吐槽一下,太太太贵)
只支持股票和场内基金,不支持可转债。
只能跑一个策略。(额。。。无力吐槽)
执行周期最低的是分钟级别,没有秒级别。
其他量化平台实盘案例,可以参考本站其他文章。
收起阅读 »
1.交易佣金是多少?
A股万分之二点五,最低五元手续费;
货币类ETF买卖和申赎均无费用;
场内基金只能买卖不能申赎,交易费用根据客户交易佣金来定,有最低5元限制;
具体情况请联系一创咨询;
2.平台支持的交易频率是多少?
支持「每分」和「每天」两个交易频率
3.平台支持的交易品种有哪些?
目前支持A股、场内基金。
4.可以同时跑几个实盘策略?
目前每个用户可以运行1个实盘策略,需要更多权限请联系自己的客户经理申请。
5.其他问题如何咨询?
查看常见问题及实盘说明文档
点击聚宽官网的在线客服免费咨询
6.请问实盘支持哪些系统
请您使用win7、8、9、10系统和mac系统进行实盘账户的绑定操作。目前暂时不支持win xp等系统和虚拟机。
不支持虚拟机和xp系统,费率万2.5(这个实在要吐槽一下,太太太贵)
只支持股票和场内基金,不支持可转债。
只能跑一个策略。(额。。。无力吐槽)
执行周期最低的是分钟级别,没有秒级别。
其他量化平台实盘案例,可以参考本站其他文章。
收起阅读 »
ptrade的run_interval定时执行或者handle_data周期运行
在这几个函数里面打上标识,输出线程名字。
可以知道,他们是通过多线程触发的。 每一次运行的线程名字都不一样。
所以在里面操作一些共享变量的时候,最好加锁操作。
比如:
可以知道,他们是通过多线程触发的。 每一次运行的线程名字都不一样。
所以在里面操作一些共享变量的时候,最好加锁操作。
比如:
def query_offset(self,start,count):收起阅读 »
sqlite_str = 'select code,open,current from {} limit {},{}'.format(self.table_name,start,count)
cursor = self.db.cursor()
with lock:
try:
cursor.execute(sqlite_str)
except Exception as e:
log.info(e)
self.db.rollback()
else:
return cursor.fetchall()
aria2c 不能下载https的文件
下载命令:
aria2c https:// openresty.org/download/openresty-1.21.4.1-win64.zip
只要把https改为http就可以了。(前提是完整没有把http跳转到https)
aria2 http: //openresty.org/download/openresty-1.21.4.1-win64.zip
不过这个办法不是长久之计,要解决这个问题,需要你重新编译ariac2, 编译的时候添加 ssl参数就可以啦
进入ariac2的源码目录:
收起阅读 »
aria2c https:// openresty.org/download/openresty-1.21.4.1-win64.zip
$ aria2c
https: //openresty.org/download/openresty-1.21.4.1-win64.zip
07/10 10:58:58 [NOTICE] Downloading 1 item(s)
07/10 10:58:58 [ERROR] CUID#7 - Download aborted. URI=https: //openresty.org/download/openresty-1.21.4.1-win64.zip
Exception: [AbstractCommand.cc:351] errorCode=1 URI=https: //openresty.org/download/openresty-1.21.4.1-win64.zip
-> [InitiateConnectionCommandFactory.cc:87] errorCode=1 https is not supported yet.
07/10 10:58:58 [NOTICE] Download GID#b9bc95619990e7e4 not complete:
Download Results:
gid |stat|avg speed |path/URI
======+====+===========+=======================================================
b9bc95|ERR | n/a|
https: //openresty.org/download/openresty-1.21.4.1-win64.zip
http: //openresty.org/download/openresty-1.21.4.1-win64.zip
Status Legend:
(ERR):error occurred.
aria2 will resume download if the transfer is restarted.
If there are any errors, then see the log file. See '-l' option in help/man page for details.
只要把https改为http就可以了。(前提是完整没有把http跳转到https)
aria2 http: //openresty.org/download/openresty-1.21.4.1-win64.zip
不过这个办法不是长久之计,要解决这个问题,需要你重新编译ariac2, 编译的时候添加 ssl参数就可以啦
进入ariac2的源码目录:
./configure --with-openssl接着:
make && sudo make install然后就可以啦
收起阅读 »
python sqlite3 多线程 批量写入 【代码】
1. 随机生成一个数组数据
2. 在多线程里面批量插入数据
几个关注点:
sqlite3.connect(_type, check_same_thread=False) 要设置为False
批量写的时候,记得要加锁
假如不加锁会出错:
收起阅读 »
2. 在多线程里面批量插入数据
几个关注点:
sqlite3.connect(_type, check_same_thread=False) 要设置为False
批量写的时候,记得要加锁
import datetime
import random
import sqlite3
import threading
import logging as log
import time
lock = threading.Lock()
class SQLiteDBCls:
def __init__(self, cache=True):
_type = ":memory:"
self.db = sqlite3.connect(_type, check_same_thread=False)
self.table_name = 'tick_data'
def create_index(self):
cmd = 'CREATE INDEX code_ix ON {} (current)'.format(self.table_name)
with lock:
try:
cursor = self.db.cursor()
cursor.execute(cmd)
except Exception as e:
log.info(e)
self.db.rollback()
else:
self.db.commit()
def create_table(self):
# cursor = self.db.cursor()
cmd = 'create table if not exists {} (id INTEGER PRIMARY KEY AUTOINCREMENT,code text,open double,current time)'.format(
self.table_name)
with lock:
try:
cursor = self.db.cursor()
cursor.execute(cmd)
except Exception as e:
log.info(e)
self.db.rollback()
else:
self.db.commit()
def add(self, code, price, t):
cmd = 'insert into {} (code,open,current) values (?,?,?);'.format(self.table_name)
with lock:
try:
cursor = self.db.cursor()
cursor.execute(cmd, (code, price, t))
except Exception as e:
log.info(e)
self.db.rollback()
else:
self.db.commit()
def batch_add(self, data):
# 批量加入
print('===========',threading.current_thread().getName())
# log.info(threading.current_thread().getName())
cmd = 'insert into {} (code,open,current) values (?,?,?)'.format(self.table_name)
with lock:
try:
cursor = self.db.cursor()
cursor.executemany(cmd, data)
except Exception as e:
log.info(e)
self.db.rollback()
else:
self.db.commit()
def result(self):
cmd = 'select count(*) from `{}`'.format(self.table_name)
with lock:
try:
cursor = self.db.cursor()
cursor.execute(cmd)
except Exception as e:
log.info(e)
self.db.rollback()
else:
return cursor.fetchone()
def data_gen():
minute = 6000
code = ['123011.SS','110010.SS','112111.SS']
for i in range(minute):
current = (datetime.datetime.now()+datetime.timedelta(minutes=i)).strftime('%H:%M:%D')
data_list =
for c in code:
price = 5+random.random()+120
data = (c,price,current)
data_list.append(data)
yield data_list
# time.sleep(0.5)
app = SQLiteDBCls(cache=True)
app.create_table()
app.create_index()
def data_validation():
print(app.result())
app.sync_up()
def multithread_mode():
total_count = 0
thread_list =
for d in data_gen():
print(d)
total_count+=len(d)
# app.batch_add(d)
t=threading.Thread(target=app.batch_add,args=(d,))
thread_list.append(t)
for t in thread_list:
t.start()
for t in thread_list:
t.join()
print(total_count)
if __name__=='__main__':
multithread_mode()
data_validation()
假如不加锁会出错:
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/threading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "/home/xda/github/stock_strategy/sqlite_issue_debug.py", line 77, in batch_add
self.db.commit()
Exception in thread Thread-3824:
Exception in thread Thread-3826:
Traceback (most recent call last):
File "/home/xda/miniconda3/envs/cpy/lib/python3.9/threading.py", line 973, in _bootstrap_inner
sqlite3.OperationalError: cannot commit - no transaction is activeTraceback (most recent call last):
File "/home/xda/github/stock_strategy/sqlite_issue_debug.py", line 72, in batch_add
cursor.executemany(cmd, data)
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
收起阅读 »
低门槛开通量化交易接口Ptrade QMT (入金1万即可,AA级大券商)
(如果按证监会对证券公司的分类结果,(98家券商中,AA级只有15家,没有AAA级),算是头部券商,具备一定的实力)
该券商为AA级券商,GJ证券,腾讯入股的A股券商
该券商营业部最近对量化交易软件推广期,对开通门槛做了大幅降低, 目前只需要入金1W,既可以开通量化交易接口与软件,有Ptrade和QMT两个。 二者支持python语言编写策略,支持tick,分钟线,日线,等级别的实盘交易。
点击查看大图
Ptrade为云端部署,QMT为本地部署(你的策略只会放着本地,使用本地python运行)
点击查看大图
该QMT支持虚拟机内运行,也就是可以在云主机(腾讯云,阿里云这些服务器上)运行。
QMT
点击查看大图
目前开通门槛低,时间有限,需要的朋友抓紧时间开通,过了这个时间就没有下次机会了。
交易费率: 量化没有流量费。(针对该营业部开户用户)
股票万一
可转债(新规) 沪:十万分之四点四,深:十万分之四
基金:万0.5
没有流量费
需要的朋友可以加微信咨询开通:备注 一万量化开户 (否则不通过或者没有低门槛介绍)
收起阅读 »
该券商为AA级券商,GJ证券,腾讯入股的A股券商
该券商营业部最近对量化交易软件推广期,对开通门槛做了大幅降低, 目前只需要入金1W,既可以开通量化交易接口与软件,有Ptrade和QMT两个。 二者支持python语言编写策略,支持tick,分钟线,日线,等级别的实盘交易。
点击查看大图
Ptrade为云端部署,QMT为本地部署(你的策略只会放着本地,使用本地python运行)
点击查看大图
该QMT支持虚拟机内运行,也就是可以在云主机(腾讯云,阿里云这些服务器上)运行。
QMT
点击查看大图
目前开通门槛低,时间有限,需要的朋友抓紧时间开通,过了这个时间就没有下次机会了。
交易费率: 量化没有流量费。(针对该营业部开户用户)
股票万一
可转债(新规) 沪:十万分之四点四,深:十万分之四
基金:万0.5
没有流量费
需要的朋友可以加微信咨询开通:备注 一万量化开户 (否则不通过或者没有低门槛介绍)
收起阅读 »
qmt如何获取高频数据(大于3秒间隔的行情)
对于可转债日内交易的朋友,喜欢追涨杀跌。
可转债天生T+0, 适合使用量化工具进行操作,速度快,下单稳,快。
对于qmt而言,可以设置定时器,run_time.
你可以设置1毫秒执行一次,笔者也试过,贼快。 然后你就打算在间隔1毫秒里面获取行情,你就可以获取近乎实时的行情数据了吗? 注意,拿实时行情数据使用
想多了。
即使你设置1毫秒,而行情数据更新是3s更新一次,你在3s的间隔内,无论你用多高的频率获取,拿到的数据还是一个快照,3秒的快照。
也就是一般的操作,是无法突破快于3秒的行情。
那么如何突破呢。
使用订阅行情配合L2数据即可。
不过不一定所有的券商都支持L2数据。而且需要费用开通。
实际外面很多tushare,akshare数据源,他们的时间更新间隔也是大于3s的。 而集思录的数据源更新速度更慢,之前测试过,大约6s。
那么使用订阅行情如何获取快于3s的数据呢?
待续,持续更新ing。。。。
收起阅读 »
可转债天生T+0, 适合使用量化工具进行操作,速度快,下单稳,快。
对于qmt而言,可以设置定时器,run_time.
你可以设置1毫秒执行一次,笔者也试过,贼快。 然后你就打算在间隔1毫秒里面获取行情,你就可以获取近乎实时的行情数据了吗? 注意,拿实时行情数据使用
获取分笔数据 ContextInfo.get_full_tick()这个函数。
想多了。
即使你设置1毫秒,而行情数据更新是3s更新一次,你在3s的间隔内,无论你用多高的频率获取,拿到的数据还是一个快照,3秒的快照。
也就是一般的操作,是无法突破快于3秒的行情。
那么如何突破呢。
使用订阅行情配合L2数据即可。
不过不一定所有的券商都支持L2数据。而且需要费用开通。
实际外面很多tushare,akshare数据源,他们的时间更新间隔也是大于3s的。 而集思录的数据源更新速度更慢,之前测试过,大约6s。
那么使用订阅行情如何获取快于3s的数据呢?
待续,持续更新ing。。。。
收起阅读 »
获取可转债历史分时tick数据 【python】
可转债的历史分时tick数据,基本在很多大平台,优矿,聚宽,米宽等平台都没有提供。
对于想做日内回测的朋友,是一件很痛苦的事情。
那么,接下来,本文结束一种通过第三方平台的数据,来把可转债的分时tick数据获取下来,并保存到本地数据库。
2022-07-05 更新:
如果直接拿历史数据,可以拿到1分钟级别的数据,如上图所示。
如果要拿秒级别的,需要实时采集。
笔者使用sqlite做为内存缓存,盘后统一入到mysql中。
如果盘中每隔3秒使用mysql储存,显然会造成不必要的io阻塞(开个线程存数据也是一个方案)。
使用sqlite的时候,设置为memeory模式,速度比存文件要快很多倍。
待续 收起阅读 »
对于想做日内回测的朋友,是一件很痛苦的事情。
那么,接下来,本文结束一种通过第三方平台的数据,来把可转债的分时tick数据获取下来,并保存到本地数据库。
2022-07-05 更新:
如果直接拿历史数据,可以拿到1分钟级别的数据,如上图所示。
如果要拿秒级别的,需要实时采集。
笔者使用sqlite做为内存缓存,盘后统一入到mysql中。
如果盘中每隔3秒使用mysql储存,显然会造成不必要的io阻塞(开个线程存数据也是一个方案)。
使用sqlite的时候,设置为memeory模式,速度比存文件要快很多倍。
待续 收起阅读 »
最近几天的有道云笔记保存的笔记全部丢失了
狗日了。网易越来越拉跨了。
最近几天记录了几篇笔记,基本全部都不见了,最新日期的还是6月17日的。中间这几天保存的笔记被狗吃了。
搜索功能也越做越垃圾,建议用一个 云文件同步+typora 做笔记就可以。
最近几天记录了几篇笔记,基本全部都不见了,最新日期的还是6月17日的。中间这几天保存的笔记被狗吃了。
搜索功能也越做越垃圾,建议用一个 云文件同步+typora 做笔记就可以。