ptrade回测和实盘支持可转债日内tick/分时吗?

是支持的。
 
比如下面的部分代码片段,是用于导出可转债的日内分时数据的。最低颗粒,按照一分钟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,实际并没有进行交易。)
继续阅读 »
是支持的。
 
比如下面的部分代码片段,是用于导出可转债的日内分时数据的。最低颗粒,按照一分钟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,实际并没有进行交易。) 收起阅读 »

雪球上的小兵 重仓的融创 现在潜心修炼

之前在雪球上了解小兵,主要源于他狂傲装逼的个性,15年之后重仓的融创,收益率可能达到十多倍,中途不确定有没有减仓。

 
20220723003.png


2020年还40多元,现在只有4块多。目前还停牌了,复牌后又是腥风血雨的了。

现在已经跌破他的成本线了,色即是空,空即是色。 到头来,做了一轮大过山车,收获了寂寞。
 
现在他在雪球上也不怎么发言。 每天就是徒步, 打坐,修行。
 

20220723001.png

 

20220723002.png


不过还是挺喜欢他性格,放荡不羁,敢作敢为,不卖理财基金收割粉丝,也不会说自己在融创高位全部抛了,在地位又买回来这样伪大V的假话。
 
一个小兵,一个云蒙,都值得尊佩。
 
继续阅读 »
之前在雪球上了解小兵,主要源于他狂傲装逼的个性,15年之后重仓的融创,收益率可能达到十多倍,中途不确定有没有减仓。

 
20220723003.png


2020年还40多元,现在只有4块多。目前还停牌了,复牌后又是腥风血雨的了。

现在已经跌破他的成本线了,色即是空,空即是色。 到头来,做了一轮大过山车,收获了寂寞。
 
现在他在雪球上也不怎么发言。 每天就是徒步, 打坐,修行。
 

20220723001.png

 

20220723002.png


不过还是挺喜欢他性格,放荡不羁,敢作敢为,不卖理财基金收割粉丝,也不会说自己在融创高位全部抛了,在地位又买回来这样伪大V的假话。
 
一个小兵,一个云蒙,都值得尊佩。
  收起阅读 »

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库。
 
继续阅读 »
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 报错 : 
      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
 

20220722001.png

 
继续阅读 »
ubuntu20; ciso8601库是一个高性能的时间解析库,基于C底层写的。pip install ciso8601 报错 : 
      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
 

20220722001.png

  收起阅读 »

systemctl start influxdb 服务启动出错

又是一次典型的csdn踩坑记。。。。。
csdn的原文内容:
https://blog.csdn.net/xiangjai/article/details/123718413


20220721002.png


安装上面的配置走,ubuntu的influxdb一直无法启动。
 
只好一个一个选项的排除:
最后发现那个bind-address的问题:
 把端口哪行注释了,先用着。。。
bolt-path = "/var/lib/influxdb/influxd.bolt"
engine-path = "/var/lib/influxdb/engine"
enable = true
#bind-address = ":8086"
继续阅读 »
又是一次典型的csdn踩坑记。。。。。
csdn的原文内容:
https://blog.csdn.net/xiangjai/article/details/123718413


20220721002.png


安装上面的配置走,ubuntu的influxdb一直无法启动。
 
只好一个一个选项的排除:
最后发现那个bind-address的问题:
 把端口哪行注释了,先用着。。。
bolt-path = "/var/lib/influxdb/influxd.bolt"
engine-path = "/var/lib/influxdb/engine"
enable = true
#bind-address = ":8086"
收起阅读 »

influxdb 2.x和1.x 把api差也太多了吧。 基本不往上兼容

最讨厌这一类api的。
 
网上信息凌乱。
 
导致很多人写技术内容的时候不会提前说明当前的influxdb的版本。
 
只能不断地试错。
 
$ influx -precision rfc3339
Error: unknown shorthand flag: 'p' in -precision
See 'influx -h' for help
没有一个命令对得上的。。
 
后续自己写个influxdb 2.x的教程吧,当做自己的学习笔记也好。
 
### 更新
刚在写,结果就发现 v2.3 以上的接口又有分叉。。。 真的是日狗了的

20220721125727934.png


 
继续阅读 »
最讨厌这一类api的。
 
网上信息凌乱。
 
导致很多人写技术内容的时候不会提前说明当前的influxdb的版本。
 
只能不断地试错。
 
$ influx -precision rfc3339
Error: unknown shorthand flag: 'p' in -precision
See 'influx -h' for help
没有一个命令对得上的。。
 
后续自己写个influxdb 2.x的教程吧,当做自己的学习笔记也好。
 
### 更新
刚在写,结果就发现 v2.3 以上的接口又有分叉。。。 真的是日狗了的

20220721125727934.png


  收起阅读 »

QMT模拟盘和实盘切换

QMT
模拟信号是指在模型交易里以模拟形式运行策略后,产生的委托为模拟信号,此时委托不会产生任务,
也不会发送至柜台,即python产生的委托会在客户端节点被截断。python发出的所有交易信号(下单、
撤单等)由此规则约束。
 
 
 
20220720192827583.png

点击图片放大

使用QMT的客户端登录,在模型交易页面:
这个切换也比较简单,只要点击一下实盘,就可以马上切换。


欢迎关注公众号
继续阅读 »
模拟信号是指在模型交易里以模拟形式运行策略后,产生的委托为模拟信号,此时委托不会产生任务,
也不会发送至柜台,即python产生的委托会在客户端节点被截断。python发出的所有交易信号(下单、
撤单等)由此规则约束。
 
 
 
20220720192827583.png

点击图片放大

使用QMT的客户端登录,在模型交易页面:
这个切换也比较简单,只要点击一下实盘,就可以马上切换。


欢迎关注公众号 收起阅读 »

qmt获取可转债历史tick行情数据


20220720132706153.png

需要在mini qmt中获取历史tick,如果在qmt里面,只能获取到订阅行情的数据。
 
当然拿到数据后,它的tick数据是参差不齐的,虽然是L1的数据,当时有些时间间隔大于3s,而有些却可以小于3s。
 
所以可以对这些数据进行时间的重采样处理。 比如全部变为1s,或者变为3s,变为1分钟就没必要了。 因为获取行情本身就自带1m的数据参数。
 
result = df.resample('3S',).first().ffill()

dataframe重采样采用3秒的代码入行,而且要向前补全,因为某些时刻没有交易的话,它的价格还是上一档的价格。
 

20220720191743648.png

 
最后处理的数据如上图所示。
 
继续阅读 »

20220720132706153.png

需要在mini qmt中获取历史tick,如果在qmt里面,只能获取到订阅行情的数据。
 
当然拿到数据后,它的tick数据是参差不齐的,虽然是L1的数据,当时有些时间间隔大于3s,而有些却可以小于3s。
 
所以可以对这些数据进行时间的重采样处理。 比如全部变为1s,或者变为3s,变为1分钟就没必要了。 因为获取行情本身就自带1m的数据参数。
 
result = df.resample('3S',).first().ffill()

dataframe重采样采用3秒的代码入行,而且要向前补全,因为某些时刻没有交易的话,它的价格还是上一档的价格。
 

20220720191743648.png

 
最后处理的数据如上图所示。
  收起阅读 »

目前还有哪些券商可以万一免五 无门槛的?

年初监管放松了,多了几家万一免五的券商,到了年中,监管又严了起来,免五的又少了不少。
 
现在基本免五的都有入金门槛。 目前基本也没有不用入金的万一免五的券商了。
 
最低的万一免五的券商,入金2w,免五,最低0.1元。 可转债(新规后) 沪市十万分之五,深市十万分之五,最低0.1元。
基金万0.5,也是最低0.1元,算是非常厚道的了。
 
需要开通的可以微信联系,备注:开户;
 
 当然这里也有一些大券商可以免五,只不过入金门槛动不动就要20万,50万。 只需要入金2万的券商,不香吗?
 

 
 
继续阅读 »
年初监管放松了,多了几家万一免五的券商,到了年中,监管又严了起来,免五的又少了不少。
 
现在基本免五的都有入金门槛。 目前基本也没有不用入金的万一免五的券商了。
 
最低的万一免五的券商,入金2w,免五,最低0.1元。 可转债(新规后) 沪市十万分之五,深市十万分之五,最低0.1元。
基金万0.5,也是最低0.1元,算是非常厚道的了。
 
需要开通的可以微信联系,备注:开户;
 
 当然这里也有一些大券商可以免五,只不过入金门槛动不动就要20万,50万。 只需要入金2万的券商,不香吗?
 

 
  收起阅读 »

查询自己平时用的最多的linux命令

你平时使用最多的linux命令是什么呢?
 
可以用一行shell来统计
 
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10

得到如下结果:

20220718002.png

 
神奇吧。
 
上述语句主要对你的history 返回数据进行统计。
继续阅读 »
你平时使用最多的linux命令是什么呢?
 
可以用一行shell来统计
 
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10

得到如下结果:

20220718002.png

 
神奇吧。
 
上述语句主要对你的history 返回数据进行统计。 收起阅读 »

docker安装的podman报错

podman 报错
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
 
继续阅读 »
podman 报错
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提供的免费云主机  固定了几个端口给外部访问:

20220717001.png

 
如果我们做了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 控制服务启动的。
会包权限不够。
继续阅读 »
默认情况下,methodot提供的免费云主机  固定了几个端口给外部访问:

20220717001.png

 
如果我们做了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 控制服务启动的。
会包权限不够。 收起阅读 »

国金QMT开户

QMT
目前个人可知的QMT开户门槛最低,1W即可。 QMT支持股票,可转债,基金ETF,逆回购品种。
 

 
 
QMT本地运行python,支持本地pip安装第三库。
可以访问本地或者远程数据库。
 
国金的QMT支持云服务器部署。相比其他券商是一大优势。
且佣金低。
 
需要咨询了解的朋友可以加微信了解与开通: 记得备注 (低门槛QMT),否则没有低门槛开量化
 
继续阅读 »
目前个人可知的QMT开户门槛最低,1W即可。 QMT支持股票,可转债,基金ETF,逆回购品种。
 

 
 
QMT本地运行python,支持本地pip安装第三库。
可以访问本地或者远程数据库。
 
国金的QMT支持云服务器部署。相比其他券商是一大优势。
且佣金低。
 
需要咨询了解的朋友可以加微信了解与开通: 记得备注 (低门槛QMT),否则没有低门槛开量化
 
收起阅读 »

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

看了日志:

    
 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就可以看到:


这样就是成功了。
继续阅读 »
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
#!/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
 
 
继续阅读 »
脚本很简单。
 保存为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
 
  收起阅读 »

国信证券 可转债费率 支持iquant (QMT) 开通 支持Level2数据

QMT
国信证券可转债费率

7b95ffda7cfa6c54e89c7919d57564ec.jpeg


 国信证券支持iquant量化软件, 累计交易额达15w可开通,股票可以万一免五(免五有资金门槛)。
例:场内基金ETF 每次交易4万,累计4次交易即可开通 iQuant

可转债费率最为 深十万分之五,沪 十万分之五;


国信证券可以开通iquant(根据qmt做了一定的改动)。
 
 
iquant支持Level2的数据
 

mmexport1657537046201.jpg

 

mmexport1657537051844.jpg


mmexport1657537040857.jpg

 
 
mmexport1657537534426.png



mmexport1657537527875.png



mmexport1657537522780.png



国信证券的开通门槛比国盛,国金要低,不过费率要高一些,但它数据支持level2,是一个很大的优势 。
 入金2w 即可开通国信 量化

需要的朋友可以咨询:备注 开户
 


 
 
 
继续阅读 »
国信证券可转债费率

7b95ffda7cfa6c54e89c7919d57564ec.jpeg


 国信证券支持iquant量化软件, 累计交易额达15w可开通,股票可以万一免五(免五有资金门槛)。
例:场内基金ETF 每次交易4万,累计4次交易即可开通 iQuant

可转债费率最为 深十万分之五,沪 十万分之五;


国信证券可以开通iquant(根据qmt做了一定的改动)。
 
 
iquant支持Level2的数据
 

mmexport1657537046201.jpg

 

mmexport1657537051844.jpg


mmexport1657537040857.jpg

 
 
mmexport1657537534426.png



mmexport1657537527875.png



mmexport1657537522780.png



国信证券的开通门槛比国盛,国金要低,不过费率要高一些,但它数据支持level2,是一个很大的优势 。
 入金2w 即可开通国信 量化

需要的朋友可以咨询:备注 开户
 


 
 
  收起阅读 »

批量修改wordpress文章中的所有的链接

有时候你的文章中,某个地方的引用的链接失效了。需要你去替换一个新的链接。
 
假如只有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命令。
 
修改万后,刷新一下缓存就可以了。
继续阅读 »
有时候你的文章中,某个地方的引用的链接失效了。需要你去替换一个新的链接。
 
假如只有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命令。
 
修改万后,刷新一下缓存就可以了。 收起阅读 »

一创聚宽的实盘只支持每日开盘价和分钟交易

在一创的官网里面浏览到了一创上跑聚宽实盘的一些信息:
 
1.交易佣金是多少?

A股万分之二点五,最低五元手续费;
货币类ETF买卖和申赎均无费用;
场内基金只能买卖不能申赎,交易费用根据客户交易佣金来定,有最低5元限制;
具体情况请联系一创咨询;
2.平台支持的交易频率是多少?

支持「每分」和「每天」两个交易频率
3.平台支持的交易品种有哪些?

目前支持A股、场内基金。
4.可以同时跑几个实盘策略?

目前每个用户可以运行1个实盘策略,需要更多权限请联系自己的客户经理申请。
5.其他问题如何咨询?

查看常见问题及实盘说明文档
点击聚宽官网的在线客服免费咨询
6.请问实盘支持哪些系统
请您使用win7、8、9、10系统和mac系统进行实盘账户的绑定操作。目前暂时不支持win xp等系统和虚拟机。

不支持虚拟机和xp系统,费率万2.5(这个实在要吐槽一下,太太太贵)
只支持股票和场内基金,不支持可转债。
只能跑一个策略。(额。。。无力吐槽)
执行周期最低的是分钟级别,没有秒级别。
 

20220711004.png

 
 
其他量化平台实盘案例,可以参考本站其他文章。
 
 
继续阅读 »
在一创的官网里面浏览到了一创上跑聚宽实盘的一些信息:
 
1.交易佣金是多少?

A股万分之二点五,最低五元手续费;
货币类ETF买卖和申赎均无费用;
场内基金只能买卖不能申赎,交易费用根据客户交易佣金来定,有最低5元限制;
具体情况请联系一创咨询;
2.平台支持的交易频率是多少?

支持「每分」和「每天」两个交易频率
3.平台支持的交易品种有哪些?

目前支持A股、场内基金。
4.可以同时跑几个实盘策略?

目前每个用户可以运行1个实盘策略,需要更多权限请联系自己的客户经理申请。
5.其他问题如何咨询?

查看常见问题及实盘说明文档
点击聚宽官网的在线客服免费咨询
6.请问实盘支持哪些系统
请您使用win7、8、9、10系统和mac系统进行实盘账户的绑定操作。目前暂时不支持win xp等系统和虚拟机。

不支持虚拟机和xp系统,费率万2.5(这个实在要吐槽一下,太太太贵)
只支持股票和场内基金,不支持可转债。
只能跑一个策略。(额。。。无力吐槽)
执行周期最低的是分钟级别,没有秒级别。
 

20220711004.png

 
 
其他量化平台实盘案例,可以参考本站其他文章。
 
  收起阅读 »

ptrade的run_interval定时执行或者handle_data周期运行

在这几个函数里面打上标识,输出线程名字。

20220711001.png

 
可以知道,他们是通过多线程触发的。 每一次运行的线程名字都不一样。
所以在里面操作一些共享变量的时候,最好加锁操作。
 
比如:
    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()
继续阅读 »
在这几个函数里面打上标识,输出线程名字。

20220711001.png

 
可以知道,他们是通过多线程触发的。 每一次运行的线程名字都不一样。
所以在里面操作一些共享变量的时候,最好加锁操作。
 
比如:
    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
$ 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
然后就可以啦
 
继续阅读 »
下载命令:
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
 
批量写的时候,记得要加锁
 
 
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.

 
继续阅读 »
1. 随机生成一个数组数据
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运行)
 

20220706001.png

 点击查看大图

该QMT支持虚拟机内运行,也就是可以在云主机(腾讯云,阿里云这些服务器上)运行。
 
QMT

20220928003.jpg

点击查看大图

 
目前开通门槛低,时间有限,需要的朋友抓紧时间开通,过了这个时间就没有下次机会了。
 
交易费率: 量化没有流量费。(针对该营业部开户用户)
 
股票万一
可转债(新规) 沪:十万分之四点四,深:十万分之四
基金:万0.5
 没有流量费

需要的朋友可以加微信咨询开通:备注  一万量化开户  (否则不通过或者没有低门槛介绍)
 
继续阅读 »
(如果按证监会对证券公司的分类结果,(98家券商中,AA级只有15家,没有AAA级),算是头部券商,具备一定的实力)
 
该券商为AA级券商,GJ证券,腾讯入股的A股券商
 
该券商营业部最近对量化交易软件推广期,对开通门槛做了大幅降低, 目前只需要入金1W,既可以开通量化交易接口与软件,有Ptrade和QMT两个。 二者支持python语言编写策略,支持tick,分钟线,日线,等级别的实盘交易。
 

点击查看大图
 
Ptrade为云端部署,QMT为本地部署(你的策略只会放着本地,使用本地python运行)
 

20220706001.png

 点击查看大图

该QMT支持虚拟机内运行,也就是可以在云主机(腾讯云,阿里云这些服务器上)运行。
 
QMT

20220928003.jpg

点击查看大图

 
目前开通门槛低,时间有限,需要的朋友抓紧时间开通,过了这个时间就没有下次机会了。
 
交易费率: 量化没有流量费。(针对该营业部开户用户)
 
股票万一
可转债(新规) 沪:十万分之四点四,深:十万分之四
基金:万0.5
 没有流量费

需要的朋友可以加微信咨询开通:备注  一万量化开户  (否则不通过或者没有低门槛介绍)
 
收起阅读 »

重启ptrade策略会重新载入修改的代码吗?

会的。

20220705001.png

这个是方便你修改了代码,不用重新新建策略,重启一下,原来旧代码就会被覆盖的。
会的。

20220705001.png

这个是方便你修改了代码,不用重新新建策略,重启一下,原来旧代码就会被覆盖的。

qmt如何获取高频数据(大于3秒间隔的行情)

QMT
对于可转债日内交易的朋友,喜欢追涨杀跌。
 
可转债天生T+0, 适合使用量化工具进行操作,速度快,下单稳,快。
 
对于qmt而言,可以设置定时器,run_time.
 

20220704002.png

 
你可以设置1毫秒执行一次,笔者也试过,贼快。 然后你就打算在间隔1毫秒里面获取行情,你就可以获取近乎实时的行情数据了吗? 注意,拿实时行情数据使用 
获取分笔数据 ContextInfo.get_full_tick()
这个函数。
 
 
想多了。
 
即使你设置1毫秒,而行情数据更新是3s更新一次,你在3s的间隔内,无论你用多高的频率获取,拿到的数据还是一个快照,3秒的快照。 
 
也就是一般的操作,是无法突破快于3秒的行情。
 
那么如何突破呢。
 
使用订阅行情配合L2数据即可。
 
不过不一定所有的券商都支持L2数据。而且需要费用开通。
 
实际外面很多tushare,akshare数据源,他们的时间更新间隔也是大于3s的。 而集思录的数据源更新速度更慢,之前测试过,大约6s。
 
那么使用订阅行情如何获取快于3s的数据呢?
 
待续,持续更新ing。。。。
 

 
继续阅读 »
对于可转债日内交易的朋友,喜欢追涨杀跌。
 
可转债天生T+0, 适合使用量化工具进行操作,速度快,下单稳,快。
 
对于qmt而言,可以设置定时器,run_time.
 

20220704002.png

 
你可以设置1毫秒执行一次,笔者也试过,贼快。 然后你就打算在间隔1毫秒里面获取行情,你就可以获取近乎实时的行情数据了吗? 注意,拿实时行情数据使用 
获取分笔数据 ContextInfo.get_full_tick()
这个函数。
 
 
想多了。
 
即使你设置1毫秒,而行情数据更新是3s更新一次,你在3s的间隔内,无论你用多高的频率获取,拿到的数据还是一个快照,3秒的快照。 
 
也就是一般的操作,是无法突破快于3秒的行情。
 
那么如何突破呢。
 
使用订阅行情配合L2数据即可。
 
不过不一定所有的券商都支持L2数据。而且需要费用开通。
 
实际外面很多tushare,akshare数据源,他们的时间更新间隔也是大于3s的。 而集思录的数据源更新速度更慢,之前测试过,大约6s。
 
那么使用订阅行情如何获取快于3s的数据呢?
 
待续,持续更新ing。。。。
 

  收起阅读 »

雪球上卖号的大V 集合【合适新人拉黑的伪大V】 定期更新

排名不分先后: 【可能部分已经被雪球销号了】
 
小七滚雪球

20220704114001602.png


没啥干货,一堆广告,喜欢拉黑别人。 伪大v的一大特点就是喜欢拉黑别人。
 
--------------------------------
 
释老毛 【已被雪球禁言】

20220704114302425.png

 
 
 
 
 
 
继续阅读 »
排名不分先后: 【可能部分已经被雪球销号了】
 
小七滚雪球

20220704114001602.png


没啥干货,一堆广告,喜欢拉黑别人。 伪大v的一大特点就是喜欢拉黑别人。
 
--------------------------------
 
释老毛 【已被雪球禁言】

20220704114302425.png

 
 
 
 
 
  收起阅读 »

qmt的升级有点拉胯,居然不能一次到位?

最近有点时间没等qmt,登录的时候提示有更新,当前版本是v25(举例说明),
好的,点击确认,显示下载,即将更新到的版本为v26 , 等待几分钟后,更新完毕,需要自己重启。
 
结果重启后,提示系统需要更新,要更新到v27,什么? 居然现在还要这样迭代更新?

20220704103350573.png

 
终于更新了2次之后,登录上系统了。
 
继续阅读 »
最近有点时间没等qmt,登录的时候提示有更新,当前版本是v25(举例说明),
好的,点击确认,显示下载,即将更新到的版本为v26 , 等待几分钟后,更新完毕,需要自己重启。
 
结果重启后,提示系统需要更新,要更新到v27,什么? 居然现在还要这样迭代更新?

20220704103350573.png

 
终于更新了2次之后,登录上系统了。
 
收起阅读 »

可转债ETF T+0操作,0费率

可转债ETF属于支持参内日内交易的场内ETF基金,且部分券商可以支持0佣金,也就是你可以无限制地的0摩擦做T。

20220704001.png

 

当然,这个很看券商,不一定每一个券商都支持0费率。 
 
因为手上有不少券商经理朋友,逐个咨询后也得到了一些清单,哪些券商可以可转债etf0费率,哪些不行。
 
需要手续费的券商:
华宝证券
东方证券
 
 
 
帖子持续更新。。
 
 
继续阅读 »
可转债ETF属于支持参内日内交易的场内ETF基金,且部分券商可以支持0佣金,也就是你可以无限制地的0摩擦做T。

20220704001.png

 

当然,这个很看券商,不一定每一个券商都支持0费率。 
 
因为手上有不少券商经理朋友,逐个咨询后也得到了一些清单,哪些券商可以可转债etf0费率,哪些不行。
 
需要手续费的券商:
华宝证券
东方证券
 
 
 
帖子持续更新。。
 
  收起阅读 »

ptrade用的python版本?


20220625003.png

没法导入sys
 
而print的f-string也是无法导入的,导入报错,而f-string是从python3.6引入的。
所以ptrade内置的 python版本是低于3.6的,所以一些关键字async 也是无法使用的,
 
继续阅读 »

20220625003.png

没法导入sys
 
而print的f-string也是无法导入的,导入报错,而f-string是从python3.6引入的。
所以ptrade内置的 python版本是低于3.6的,所以一些关键字async 也是无法使用的,
  收起阅读 »

获取可转债历史分时tick数据 【python】

可转债的历史分时tick数据,基本在很多大平台,优矿,聚宽,米宽等平台都没有提供。
 
对于想做日内回测的朋友,是一件很痛苦的事情。
 
那么,接下来,本文结束一种通过第三方平台的数据,来把可转债的分时tick数据获取下来,并保存到本地数据库。
 

20220625001.png

 
2022-07-05 更新:

如果直接拿历史数据,可以拿到1分钟级别的数据,如上图所示。
 
如果要拿秒级别的,需要实时采集。
 
笔者使用sqlite做为内存缓存,盘后统一入到mysql中。

20220705002.png


如果盘中每隔3秒使用mysql储存,显然会造成不必要的io阻塞(开个线程存数据也是一个方案)。
 
使用sqlite的时候,设置为memeory模式,速度比存文件要快很多倍。
 
 
待续
继续阅读 »
可转债的历史分时tick数据,基本在很多大平台,优矿,聚宽,米宽等平台都没有提供。
 
对于想做日内回测的朋友,是一件很痛苦的事情。
 
那么,接下来,本文结束一种通过第三方平台的数据,来把可转债的分时tick数据获取下来,并保存到本地数据库。
 

20220625001.png

 
2022-07-05 更新:

如果直接拿历史数据,可以拿到1分钟级别的数据,如上图所示。
 
如果要拿秒级别的,需要实时采集。
 
笔者使用sqlite做为内存缓存,盘后统一入到mysql中。

20220705002.png


如果盘中每隔3秒使用mysql储存,显然会造成不必要的io阻塞(开个线程存数据也是一个方案)。
 
使用sqlite的时候,设置为memeory模式,速度比存文件要快很多倍。
 
 
待续 收起阅读 »

最近几天的有道云笔记保存的笔记全部丢失了

狗日了。网易越来越拉跨了。
 
最近几天记录了几篇笔记,基本全部都不见了,最新日期的还是6月17日的。中间这几天保存的笔记被狗吃了。
 
搜索功能也越做越垃圾,建议用一个 云文件同步+typora 做笔记就可以。
狗日了。网易越来越拉跨了。
 
最近几天记录了几篇笔记,基本全部都不见了,最新日期的还是6月17日的。中间这几天保存的笔记被狗吃了。
 
搜索功能也越做越垃圾,建议用一个 云文件同步+typora 做笔记就可以。