通知设置 新通知
QMT实时获取涨停股,筛选流通盘大于X的股票
QMT • 李魔佛 发表了文章 • 0 个评论 • 1426 次浏览 • 2024-02-07 18:28
直接上代码:# coding:gbk
import time
class G():
pass
g = G()
def init(ContextInfo):
g.hsa = [item for item in ContextInfo.get_stock_list_in_sector('沪深A股') if not item.endswith('BJ')]
g.vol_dict = {}
for stock in g.hsa:
g.vol_dict[stock] = ContextInfo.get_last_volume(stock)
ContextInfo.run_time("execution", "1nSecond", "2019-10-14 13:20:00")
def execution(ContextInfo):
t0 = time.time()
full_tick = ContextInfo.get_full_tick(g.hsa)
total_market_value = 0
total_ratio = 0
count = 0
for stock in g.hsa:
if full_tick[stock]['lastClose'] == 0:
continue
ratio = full_tick[stock]['lastPrice'] / full_tick[stock]['lastClose'] - 1
rise_price = round(full_tick[stock]['lastClose'] * 1.2, 2) if stock[0] == '3' or stock[:3] == '688' else round(
full_tick[stock]['lastClose'] * 1.1, 2)
# 如果要打印涨停品种
if abs(full_tick[stock]['lastPrice'] - rise_price) <0.01:
print(f"涨停股票 {stock} {ContextInfo.get_stock_name(stock)}")
market_value = full_tick[stock]['lastPrice'] * g.vol_dict[stock]
total_ratio += ratio * market_value
total_market_value += market_value
count += 1
# print(count)
total_ratio /= total_market_value
total_ratio *= 100
print(f'A股加权涨幅 {round(total_ratio, 2)}% 函数运行耗时{round(time.time() - t0, 5)}秒')
欢迎关注公众号:
可转债量化分析 查看全部
直接上代码:
# coding:gbk
import time
class G():
pass
g = G()
def init(ContextInfo):
g.hsa = [item for item in ContextInfo.get_stock_list_in_sector('沪深A股') if not item.endswith('BJ')]
g.vol_dict = {}
for stock in g.hsa:
g.vol_dict[stock] = ContextInfo.get_last_volume(stock)
ContextInfo.run_time("execution", "1nSecond", "2019-10-14 13:20:00")
def execution(ContextInfo):
t0 = time.time()
full_tick = ContextInfo.get_full_tick(g.hsa)
total_market_value = 0
total_ratio = 0
count = 0
for stock in g.hsa:
if full_tick[stock]['lastClose'] == 0:
continue
ratio = full_tick[stock]['lastPrice'] / full_tick[stock]['lastClose'] - 1
rise_price = round(full_tick[stock]['lastClose'] * 1.2, 2) if stock[0] == '3' or stock[:3] == '688' else round(
full_tick[stock]['lastClose'] * 1.1, 2)
# 如果要打印涨停品种
if abs(full_tick[stock]['lastPrice'] - rise_price) <0.01:
print(f"涨停股票 {stock} {ContextInfo.get_stock_name(stock)}")
market_value = full_tick[stock]['lastPrice'] * g.vol_dict[stock]
total_ratio += ratio * market_value
total_market_value += market_value
count += 1
# print(count)
total_ratio /= total_market_value
total_ratio *= 100
print(f'A股加权涨幅 {round(total_ratio, 2)}% 函数运行耗时{round(time.time() - t0, 5)}秒')
欢迎关注公众号:
可转债量化分析
迅投QMT投研版 有必要开吗?
QMT • 李魔佛 发表了文章 • 0 个评论 • 1301 次浏览 • 2024-02-06 15:03
处处透出一股割韭菜的味道。
到处拉人进群,然后群里问问题,他们会让你私聊,加你,说服你开通投研版。
投研版无非多一些数据,你用tushare或者自己爬虫就可以获取,他们非要放到投研版里面,付费使用。
价格是一年8,9千,感觉没有一点性价比。
qmt,minniqmt有交易功能,有数据获取功能,也可以自己接入外部数据。没必要花那些冤枉钱去按年付费买一个不实用的数据。
真的没有数据,或者没有能力获取,付费找人写个api接口,爬虫数据,也不贵。 可以终身使用。 不好过按年付费???
关键那群qmt的人水平也不咋地,看他们的文档就知道,变量用A,B,C,D,人品也不咋地,星球上还抄袭我的星球文章,足以说明水平和人品。
群里问点问题,就让你开个投研版咨询哈。 还不如来我的qmt ptrade技术群的,free且有求必应哈。
查看全部
处处透出一股割韭菜的味道。
到处拉人进群,然后群里问问题,他们会让你私聊,加你,说服你开通投研版。
投研版无非多一些数据,你用tushare或者自己爬虫就可以获取,他们非要放到投研版里面,付费使用。
价格是一年8,9千,感觉没有一点性价比。
qmt,minniqmt有交易功能,有数据获取功能,也可以自己接入外部数据。没必要花那些冤枉钱去按年付费买一个不实用的数据。
真的没有数据,或者没有能力获取,付费找人写个api接口,爬虫数据,也不贵。 可以终身使用。 不好过按年付费???
关键那群qmt的人水平也不咋地,看他们的文档就知道,变量用A,B,C,D,人品也不咋地,星球上还抄袭我的星球文章,足以说明水平和人品。
群里问点问题,就让你开个投研版咨询哈。 还不如来我的qmt ptrade技术群的,free且有求必应哈。
qmt获取北交所实时行情数据
QMT • 李魔佛 发表了文章 • 0 个评论 • 1155 次浏览 • 2024-01-24 13:39
首先试试获取实时的行情:
我获取的是这个北交所股票的数据:
获取北交所行情数据如下:
#-*-coding:gbk-*-
import datetime
code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)
def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
info = ContextInfo.get_full_tick(stock_code=["838402.BJ"])
print(info)
返回下面的数据:
对了下时间戳,是正确的。
然后试了下获取北交所的历史数据行情:
#-*-coding:gbk-*-
import datetime
code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)
download_history_data(code,"1d","20240105","")
def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
print(date)
hist = ContextInfo.get_market_data_ex(['close'],[code], period = "1d",count = 1)
print(hist)
代码里面我想用 download_history_data(code,"1d","20240105","") 下载历史数据。
在数据目录里面也能够获取到这个股票的历史数据文件。
可是在qmt里面却输出的是个空的dataframe。
数据目录下面是有数据的。。
感觉是qmt里面的功能还没有完善对北交所股票的支持。
查看全部
首先试试获取实时的行情:
我获取的是这个北交所股票的数据:
获取北交所行情数据如下:
#-*-coding:gbk-*-
import datetime
code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)
def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
info = ContextInfo.get_full_tick(stock_code=["838402.BJ"])
print(info)
返回下面的数据:
对了下时间戳,是正确的。
然后试了下获取北交所的历史数据行情:
#-*-coding:gbk-*-
import datetime
code = '838402.BJ'
def init(ContextInfo):
now = datetime.datetime.now()
print(now)
download_history_data(code,"1d","20240105","")
def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
date = timetag_to_datetime(realtime, "%Y-%m-%d %H:%M:%S")
print(date)
hist = ContextInfo.get_market_data_ex(['close'],[code], period = "1d",count = 1)
print(hist)
代码里面我想用 download_history_data(code,"1d","20240105","") 下载历史数据。
在数据目录里面也能够获取到这个股票的历史数据文件。
可是在qmt里面却输出的是个空的dataframe。
数据目录下面是有数据的。。
感觉是qmt里面的功能还没有完善对北交所股票的支持。
华泰matic能在虚拟机运行吗?
李魔佛 发表了文章 • 0 个评论 • 945 次浏览 • 2024-01-05 09:36
但matic却可以在hyper X虚拟机上运行。笔者在win11家庭版的hyper x测试过的。
ptrade调试经验分享(坑) 委托成交回调函数
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1269 次浏览 • 2023-12-22 10:30
之前的代码里面,由于少了一个if,导致如果code不在
g.start_buy_sell_queue
这个集合里面的话,就会报错。(但正常情况下都会有值,但问题就出现在一些特殊情况下)
不然你试试在
on_trade_response
里面直接raise一个Exception出来,日志里也不会有任何显示。
切近!!
on_trade_response 里面做好安全防护!! 最好是有些业务逻辑完成了在里面print一下,以确保是执行到后面的。 查看全部
ptrade精确参与集合竞价交易 时间设置问题
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1540 次浏览 • 2023-11-16 10:10
查了下日志。run_daily 设置的9:25运行,下单委托的时间在9:25:01 这个时间就被推到9:30开盘去成交了。
所以实际没有参与到9:25的集合竞价。
所以要参与集合竞价,需要设定在9:24分开始,然后不断在一个循环里面,用更小的时间颗粒,比如100ms去监听。
等到9:24:59的时间,才去下单。
import datetime
import time
RUN_TIME = '09:24'
def execution(context):
while 1:
current_second = datetime.datetime.now().strftime('%S')
if current_second >= '58':
break
time.sleep(0.1)
do_something()
def initialize(context):
# 初始化策略
run_daily(context, execution, RUN_TIME)
def handle_data(context, data):
pass
具体代码可以参照我的知识星球
查看全部
查了下日志。run_daily 设置的9:25运行,下单委托的时间在9:25:01 这个时间就被推到9:30开盘去成交了。
所以实际没有参与到9:25的集合竞价。
所以要参与集合竞价,需要设定在9:24分开始,然后不断在一个循环里面,用更小的时间颗粒,比如100ms去监听。
等到9:24:59的时间,才去下单。
import datetime
import time
RUN_TIME = '09:24'
def execution(context):
while 1:
current_second = datetime.datetime.now().strftime('%S')
if current_second >= '58':
break
time.sleep(0.1)
do_something()
def initialize(context):
# 初始化策略
run_daily(context, execution, RUN_TIME)
def handle_data(context, data):
pass
具体代码可以参照我的知识星球
迅投官网的示例代码真的无眼看。。。
QMT • 李魔佛 发表了文章 • 0 个评论 • 1400 次浏览 • 2023-11-10 01:17
变量名,类名用A ,B,C 噗, 没有一点含义,做什么鬼
class a():
pass
A = a()而且也不符合python风格。。。python类名推荐的大写字母开头,实例化对象用小写字母。
所以退一万步讲,上面的代码正常点的程序员写也应该是这样的。
class A():
pass
a = A()
其实正确的应该class GlobalCls():
pass
g = GlobalCls()
其他地方也是有这个毛病。
把代码喂给GPT,让它来分析一下:
得到如下结果:文件编码声明: #coding:gbk 是指定源文件的编码格式为GBK。在Python 3中,通常使用UTF-8作为文件编码格式,因此可以将该行删除或更改为#coding:utf-8。
类名和函数名: 根据PEP 8命名约定,类名应该使用大写字母开头的驼峰命名法(例如A改为A)。同样,函数名应该使用小写字母开头的小写命名法(例如init改为init,f改为f)。
类和实例: 在代码中定义了一个空类a,但没有给它任何属性或方法。如果不需要这个类,可以将其删除。
缩进和代码格式: Python非常依赖于正确的缩进,以指示代码块的层次结构。请确保代码的缩进是一致的,并使用适当的缩进级别(通常是4个空格)。
代码注释: 代码中有一些注释,但是大部分是被注释掉的。良好的注释可以增加代码的可读性和可维护性,建议在关键部分添加更多有用的注释。
异常处理: 代码中没有包含任何异常处理机制。在实际应用中,建议对可能引发异常的操作进行适当的异常处理,以提高代码的健壮性。
然后里面计算涨停是这样的: rise_price = round(full_tick[stock]['lastClose'] *1.2,2) if stock[0] == '3' or stock[:3] == '688' else round(full_tick[stock]['lastClose'] *1.1,2)
用昨收价* 1.2和1.1判断当前是否涨跌停。 首先,没有考虑到ST股,部分ST是5%涨停的。
其次,是直接用的昨收价,如果当天是分红除权日,昨收价没有做除权处理,得到的涨跌幅也是不准的。
当然这个文档最大的问题是,很多示例代码运行是直接报错的!!
查看全部
如果拿去做code review,估计会被喷的体无完肤。
变量名,类名用A ,B,C 噗, 没有一点含义,做什么鬼
class a():而且也不符合python风格。。。python类名推荐的大写字母开头,实例化对象用小写字母。
pass
A = a()
所以退一万步讲,上面的代码正常点的程序员写也应该是这样的。
class A():
pass
a = A()
其实正确的应该
class GlobalCls():
pass
g = GlobalCls()
其他地方也是有这个毛病。
把代码喂给GPT,让它来分析一下:
得到如下结果:
文件编码声明: #coding:gbk 是指定源文件的编码格式为GBK。在Python 3中,通常使用UTF-8作为文件编码格式,因此可以将该行删除或更改为#coding:utf-8。
类名和函数名: 根据PEP 8命名约定,类名应该使用大写字母开头的驼峰命名法(例如A改为A)。同样,函数名应该使用小写字母开头的小写命名法(例如init改为init,f改为f)。
类和实例: 在代码中定义了一个空类a,但没有给它任何属性或方法。如果不需要这个类,可以将其删除。
缩进和代码格式: Python非常依赖于正确的缩进,以指示代码块的层次结构。请确保代码的缩进是一致的,并使用适当的缩进级别(通常是4个空格)。
代码注释: 代码中有一些注释,但是大部分是被注释掉的。良好的注释可以增加代码的可读性和可维护性,建议在关键部分添加更多有用的注释。
异常处理: 代码中没有包含任何异常处理机制。在实际应用中,建议对可能引发异常的操作进行适当的异常处理,以提高代码的健壮性。
然后里面计算涨停是这样的:
rise_price = round(full_tick[stock]['lastClose'] *1.2,2) if stock[0] == '3' or stock[:3] == '688' else round(full_tick[stock]['lastClose'] *1.1,2)
用昨收价* 1.2和1.1判断当前是否涨跌停。 首先,没有考虑到ST股,部分ST是5%涨停的。
其次,是直接用的昨收价,如果当天是分红除权日,昨收价没有做除权处理,得到的涨跌幅也是不准的。
当然这个文档最大的问题是,很多示例代码运行是直接报错的!!
QMT | Ptrade 量化策略代写服务
李魔佛 发表了文章 • 0 个评论 • 2063 次浏览 • 2023-11-01 10:43
多年交易经验,量化交易与开发经验。所以很多策略,其实用户大体描述,就知道要注意哪些地方,会提出一些建议,用户要注意,需不需要添加一些判读条件等等。(当然,策略的具体参数都是设置可以调节的,你不需要把实际的参数告诉我,代码给你后,你自己运行策略的时候把你策略的真正参数填上去就好了。)
有偿,收费,价格美丽。根据策略实际的复杂程度与预估的工时,收费。(不根据代码数量,因为我写代码很精简)
我也帮你们咨询过了迅投的客服。 因为他们官网也有提供策略代写服务。他们是不问你策略,直接是5000起步哦。然后根据策略,在5000的基础上不断加。
咨询完,我都感觉我自己以前的报价太低了,呜。
PS: 之前还有迅投的前员工私底下接单写策略,然后到我的星球里面白嫖我的代码,调用我接口数据,被我发现后举报到星球的。后面那个客户发现代码里面藏有我的公众号信息哈,找到我让我修改接口数据哈。
需要的代写策略的盆友,可以关注公众号,在菜单栏那里的“代写量化程序”或者 后台回复:策略代写,获取联系方式哦
扫码关注公众号:
查看全部
迅投的QMT和恒生电子的Ptrade, 还有掘金, 量化策略编程, 实盘和回测都行。只要你的需求明确,白纸黑字描述清楚,都可以做。股票,ETF,可转债都行。
多年交易经验,量化交易与开发经验。所以很多策略,其实用户大体描述,就知道要注意哪些地方,会提出一些建议,用户要注意,需不需要添加一些判读条件等等。(当然,策略的具体参数都是设置可以调节的,你不需要把实际的参数告诉我,代码给你后,你自己运行策略的时候把你策略的真正参数填上去就好了。)
有偿,收费,价格美丽。根据策略实际的复杂程度与预估的工时,收费。(不根据代码数量,因为我写代码很精简)
我也帮你们咨询过了迅投的客服。 因为他们官网也有提供策略代写服务。他们是不问你策略,直接是5000起步哦。然后根据策略,在5000的基础上不断加。
咨询完,我都感觉我自己以前的报价太低了,呜。
PS: 之前还有迅投的前员工私底下接单写策略,然后到我的星球里面白嫖我的代码,调用我接口数据,被我发现后举报到星球的。后面那个客户发现代码里面藏有我的公众号信息哈,找到我让我修改接口数据哈。
需要的代写策略的盆友,可以关注公众号,在菜单栏那里的“代写量化程序”或者 后台回复:策略代写,获取联系方式哦
扫码关注公众号:
QMT获取A股全市场股票代码
QMT • 李魔佛 发表了文章 • 0 个评论 • 1507 次浏览 • 2023-10-25 15:23
"沪深A股"
完整代码:#-*-coding:gbk-*-
import time
start = False
ACCOUNT = ''
def init(ContextInfo):
now = time.ctime()
print(now)
ContextInfo.run_time("execution","30nSecond","2023-04-14 13:20:00")
def execution(ContextInfo):
data = ContextInfo.get_stock_list_in_sector('沪深A股')
print(len(data))
def handlebar(ContextInfo):
pass
当前共有5047只股票【2023-10-25 15:18:45.533】 start trading mode
【2023-10-25 15:18:45.533】 Wed Oct 25 15:18:45 2023
【2023-10-25 15:18:45.533】 5074
['000001.SZ', '000002.SZ', '000004.SZ', '000005.SZ', '000006.SZ', '000007.SZ', '000008.SZ', '000009.SZ', '000010.SZ', '000011.SZ', '000012.SZ', '000014.SZ', '000016.SZ', '000017.SZ', '000019.SZ', '000020.SZ', '000021.SZ', '000023.SZ', '000025.SZ', '000026.SZ', '000027.SZ', '000028.SZ', '000029.SZ', '000030.SZ', '000031.SZ', '000032.SZ', '000034.SZ', '000035.SZ', '000036.SZ', '000037.SZ', '000039.SZ', '000040.SZ', '000042.SZ', '000045.SZ', '000046.SZ', '000048.SZ', '000049.SZ', '000050.SZ', '000055.SZ', '000056.SZ', '000058.SZ', '000059.SZ', '000060.SZ', '000061.SZ', '000062.SZ', '000063.SZ', '000065.SZ', '000066.SZ', '000068.SZ', '000069.SZ', '000070.SZ', '000078.SZ', '000088.SZ', '000089.SZ', '000090.SZ', '000096.SZ', '000099.SZ', '000100.SZ', '000151.SZ', '000153.SZ', '000155.SZ', '000156.SZ', '000157.SZ', '000158.SZ', '000159.SZ', '000166.SZ', '000301.SZ', '000333.SZ', '000338.SZ', '000400.SZ', '000401.SZ', '000402.SZ', '000403.SZ', '000404.SZ', '000407.SZ', '000408.SZ', '000409.SZ', '000410.SZ', '000411.SZ', '000413.SZ', '000415.SZ', '000416.SZ', '000417.SZ', '000419.SZ', '000420.SZ', '000421.SZ', '000422.SZ', '000423.SZ', '000425.SZ', '000426.SZ',省略若干...
点击查看大图
是否遇到QMT或Ptrade的问题, 无从入手? 或者咨询无门 ?
来加入 知识星球 , 获取专业的技术解答, 量化实盘代码, 技术交流群
查看全部
"沪深A股"
完整代码:
#-*-coding:gbk-*-
import time
start = False
ACCOUNT = ''
def init(ContextInfo):
now = time.ctime()
print(now)
ContextInfo.run_time("execution","30nSecond","2023-04-14 13:20:00")
def execution(ContextInfo):
data = ContextInfo.get_stock_list_in_sector('沪深A股')
print(len(data))
def handlebar(ContextInfo):
pass
当前共有5047只股票
【2023-10-25 15:18:45.533】 start trading mode省略若干...
【2023-10-25 15:18:45.533】 Wed Oct 25 15:18:45 2023
【2023-10-25 15:18:45.533】 5074
['000001.SZ', '000002.SZ', '000004.SZ', '000005.SZ', '000006.SZ', '000007.SZ', '000008.SZ', '000009.SZ', '000010.SZ', '000011.SZ', '000012.SZ', '000014.SZ', '000016.SZ', '000017.SZ', '000019.SZ', '000020.SZ', '000021.SZ', '000023.SZ', '000025.SZ', '000026.SZ', '000027.SZ', '000028.SZ', '000029.SZ', '000030.SZ', '000031.SZ', '000032.SZ', '000034.SZ', '000035.SZ', '000036.SZ', '000037.SZ', '000039.SZ', '000040.SZ', '000042.SZ', '000045.SZ', '000046.SZ', '000048.SZ', '000049.SZ', '000050.SZ', '000055.SZ', '000056.SZ', '000058.SZ', '000059.SZ', '000060.SZ', '000061.SZ', '000062.SZ', '000063.SZ', '000065.SZ', '000066.SZ', '000068.SZ', '000069.SZ', '000070.SZ', '000078.SZ', '000088.SZ', '000089.SZ', '000090.SZ', '000096.SZ', '000099.SZ', '000100.SZ', '000151.SZ', '000153.SZ', '000155.SZ', '000156.SZ', '000157.SZ', '000158.SZ', '000159.SZ', '000166.SZ', '000301.SZ', '000333.SZ', '000338.SZ', '000400.SZ', '000401.SZ', '000402.SZ', '000403.SZ', '000404.SZ', '000407.SZ', '000408.SZ', '000409.SZ', '000410.SZ', '000411.SZ', '000413.SZ', '000415.SZ', '000416.SZ', '000417.SZ', '000419.SZ', '000420.SZ', '000421.SZ', '000422.SZ', '000423.SZ', '000425.SZ', '000426.SZ',
点击查看大图
是否遇到QMT或Ptrade的问题, 无从入手? 或者咨询无门 ?
来加入 知识星球 , 获取专业的技术解答, 量化实盘代码, 技术交流群
国金证券 国盛证券 QMT仿真客户端 PTrade仿真客户端 QMT测试版 Ptrade测试版
李魔佛 发表了文章 • 0 个评论 • 2235 次浏览 • 2023-10-22 12:54
国金证券 - QMT测试账号信息: 登录账号:*********** 登录密码:**********
QMT交易测试客户端下载链接 链接:
https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar
国金证券 - ptrade测试账号信息: 登录账号:********* 登录密码:********
ptrade交易测试客户端下载链接 链接:
https://download.gjzq.com.cn/temp/organ/gjzqptrade_ceshi.rar
测试时间10:00--17:00 如有什么问题,请和我们联系。谢谢!
下面是国盛证券提供的试用账户:
国盛证券 - 国盛智投软件下载(测试版)Ptrade
https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip
仿真账户:******* / ********
量化回测:支持1分钟、日线回测。
量化交易:支持LEVEL1 tick股票交易。
量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。
国盛证券-迅投QMT软件下载(测试版)
https://download.gszq.com/xt/XtItClient_x64_QMT_test_1.0.0.22650.exe
仿真账户:*******/********
支持VBA、Python开发策略 可以安装第三方库 软件帮助有文档,测试版历史数据不是很准确,以熟悉界面为主。
如果需要测试账号, 需要开通券商账号后找券商经理获取.
可以扫码联系开通
查看全部
下面是国金证券提供的试用账户:
国金证券 - QMT测试账号信息: 登录账号:*********** 登录密码:**********
QMT交易测试客户端下载链接 链接:
https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar
国金证券 - ptrade测试账号信息: 登录账号:********* 登录密码:********
ptrade交易测试客户端下载链接 链接:
https://download.gjzq.com.cn/temp/organ/gjzqptrade_ceshi.rar
测试时间10:00--17:00 如有什么问题,请和我们联系。谢谢!
下面是国盛证券提供的试用账户:
国盛证券 - 国盛智投软件下载(测试版)Ptrade
https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip
仿真账户:******* / ********
量化回测:支持1分钟、日线回测。
量化交易:支持LEVEL1 tick股票交易。
量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。
国盛证券-迅投QMT软件下载(测试版)
https://download.gszq.com/xt/XtItClient_x64_QMT_test_1.0.0.22650.exe
仿真账户:*******/********
支持VBA、Python开发策略 可以安装第三方库 软件帮助有文档,测试版历史数据不是很准确,以熟悉界面为主。
如果需要测试账号, 需要开通券商账号后找券商经理获取.
可以扫码联系开通
ptrade 全局对象g持久化对象保存失败
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1192 次浏览 • 2023-10-18 09:36
File "./fly_docker/IQEngine/utils/global_variable.py", line 50, in save
_pickle.PicklingError: Can't pickle <class 'IQEngine.user_module.PositionManager'>: attribute lookup PositionManager on IQEngine.user_module failed
原因是全局变量g 不能被持久化, 需要前面加__, 比如g.Name 要改成 g.__Name
全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以'__'开头;
涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的;
全局变量g中以'__'开头的变量为私有变量,持久化时将不会被保存;
具体可以参加 API文档:
https://ptradeapi.com 查看全部
2023-10-18 09:25:12 - ERROR - 全局对象g持久化对象保存失败,对象名:TARGET_STOCK_CODE,错误原因:Traceback (most recent call last):
File "./fly_docker/IQEngine/utils/global_variable.py", line 50, in save
_pickle.PicklingError: Can't pickle <class 'IQEngine.user_module.PositionManager'>: attribute lookup PositionManager on IQEngine.user_module failed
原因是全局变量g 不能被持久化, 需要前面加__, 比如g.Name 要改成 g.__Name
全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以'__'开头;
涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的;
全局变量g中以'__'开头的变量为私有变量,持久化时将不会被保存;
具体可以参加 API文档:
https://ptradeapi.com
ptrade/qmt 判断股票是否涨停
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1725 次浏览 • 2023-10-09 11:03
以ptrade为例:
先通过 get_snapshot - 取行情快照
其中里面有2个字段:
up_px:涨停价格(str:float);
down_px:跌停价格(str:float);用当前的最新价格和涨停跌停价格比较:
last_px:最新成交价(str:float);
if last_px>=up_px 就是达到涨停价,
还有判断此时的卖一上是否有挂单. 如果还有卖单, 说明此时的涨停板并没有封住, 被人砸开了.
跌停板的判断也是如此.
2. 使用现有的API函数, 更加简单方便, 这个方法只适用于ptrade, qmt没有类似的函数.
check_limit - 代码涨跌停状态判断
使用场景
该函数仅在交易模块可用。
接口说明
该接口用于标识当日股票的涨跌停情况。
注意事项:
无
参数
security:单只股票代码或者多只股票代码组成的列表,必填字段(list[str]/str);
返回
正常返回一个dict类型数据,包含每只股票代码的涨停状态。多只股票代码查询时其中部分股票代码查询异常则该代码返回既不涨停也不跌停状态0。(dict[str:int])
涨跌停状态说明:
2:触板涨停(已经是涨停价格,但还有卖盘);
1:涨停;
0:既不涨停也不跌停;
-1:跌停;
-2:触板跌停(已经是跌停价格,但还有买盘);
示例代码:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 代码涨跌停状态
stock_flag = check_limit(g.security)
log.info(stock_flag)
公众号: 可转债量化分析
查看全部
以ptrade为例:
先通过 get_snapshot - 取行情快照
其中里面有2个字段:
up_px:涨停价格(str:float);用当前的最新价格和涨停跌停价格比较:
down_px:跌停价格(str:float);
last_px:最新成交价(str:float);
if last_px>=up_px 就是达到涨停价,
还有判断此时的卖一上是否有挂单. 如果还有卖单, 说明此时的涨停板并没有封住, 被人砸开了.
跌停板的判断也是如此.
2. 使用现有的API函数, 更加简单方便, 这个方法只适用于ptrade, qmt没有类似的函数.
check_limit - 代码涨跌停状态判断
使用场景
该函数仅在交易模块可用。
接口说明
该接口用于标识当日股票的涨跌停情况。
注意事项:
无
参数
security:单只股票代码或者多只股票代码组成的列表,必填字段(list[str]/str);
返回
正常返回一个dict类型数据,包含每只股票代码的涨停状态。多只股票代码查询时其中部分股票代码查询异常则该代码返回既不涨停也不跌停状态0。(dict[str:int])
涨跌停状态说明:
2:触板涨停(已经是涨停价格,但还有卖盘);
1:涨停;
0:既不涨停也不跌停;
-1:跌停;
-2:触板跌停(已经是跌停价格,但还有买盘);
示例代码:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 代码涨跌停状态
stock_flag = check_limit(g.security)
log.info(stock_flag)
公众号: 可转债量化分析
小市值轮动-量化交易-程序化交易-Ptrade实盘
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1879 次浏览 • 2023-10-07 14:14
当前策略持有30只。
点击查看大图
点击查看大图
基于股票的策略不敢多买,属于试验阶段,后期仍然会不断根据市场调仓; 主仓依然在可转债。
公众号:可转债量化分析
如果需要策略代写,(ptrade、qmt,其他量化平台)
可以公众号后台回复:
策略代写
查看全部
一个因为蓝盾退债引起的报错【Ptrade/QMT】
李魔佛 发表了文章 • 0 个评论 • 1030 次浏览 • 2023-09-25 02:49
上去一看。
每一个tick都在报错:
好家伙? 怎么会有个 404001.SS的可转债代码的?
于是顺着代码去调试。 这个代码是从我的接口传过去的。
于是我看了下数据库。
赫然发现了一个蓝盾退债的玩意, 代码正是 404001, 无语中。 怎么这个代码不按常理来的呢。 虽说是三板的股票,可是转债代码改成4字头, 也是奇葩。
刚好也碰巧我的拼接后缀代码:
def modify_code(self, x):
return x + '.SZ' if x.startswith('12') else x + '.SS'
401开头,于是拼接了个.SS 后缀,导致ptrade无法正确识别这个代码行情。
可能用401001.SZ 可以拿到行情呢。
查看全部
上去一看。
每一个tick都在报错:
好家伙? 怎么会有个 404001.SS的可转债代码的?
于是顺着代码去调试。 这个代码是从我的接口传过去的。
于是我看了下数据库。
赫然发现了一个蓝盾退债的玩意, 代码正是 404001, 无语中。 怎么这个代码不按常理来的呢。 虽说是三板的股票,可是转债代码改成4字头, 也是奇葩。
刚好也碰巧我的拼接后缀代码:
def modify_code(self, x):
return x + '.SZ' if x.startswith('12') else x + '.SS'
401开头,于是拼接了个.SS 后缀,导致ptrade无法正确识别这个代码行情。
可能用401001.SZ 可以拿到行情呢。
ptrade最多支持同时运行多少个策略?
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1328 次浏览 • 2023-09-21 17:16
但同时运行的策略只有5个。
如果不需要的策略,可以把它暂停了,记住,不要随意暂停。 因为暂停了,重启后你的日志就会随之被清空。
平时也应该做好日志备份的习惯。 部分券商可以连接mysql,可以把数据导出,也可以顺便把日志也导出。
需要开通Ptrade或者代写的朋友可以咨询:
查看全部
Ptrade跟踪雪球组合自动调仓
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1337 次浏览 • 2023-09-19 20:25
根据指定的雪球组合, 自动跟踪组合的调仓与比例.
图随便截取的,具体跟踪的组合,客户自己可以直接配置.
目前是每10分钟刷新一次 组合数据,如果有更新就马上根据调仓.
盘前和收盘前2分钟, 会定期扫码, 以免到了收盘来不及成交, 留够足够的时间下单与撤单.
PS:图片与策略无关
耗时地方仍然是调试.
查看全部
ptrade量化策略:低位首板启动板-首板+低吸+单阳不破
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1485 次浏览 • 2023-09-05 22:44
Ptrade实现实盘自动交易代码。
(图片截图非本策略,随意贴的)
里面细节比较多。
得慢慢调。
国金QMT测试版|模拟盘 安装程序 下载
QMT • 李魔佛 发表了文章 • 0 个评论 • 3349 次浏览 • 2023-09-02 12:16
登录账号:******* 登录密码:*********
QMT交易测试客户端下载链接 链接:https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar
在线接口文档:
https://qmt.ptradeapi.com
需要开通QMT的视频的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。费率万一,可半年后免五。
开户后可提供技术相关解答。
查看全部
国金证券QMT测试账号信息:
登录账号:******* 登录密码:*********
QMT交易测试客户端下载链接 链接:https://download.gjzq.com.cn/temp/organ/gjzqqmt_ceshi.rar
在线接口文档:
https://qmt.ptradeapi.com
需要开通QMT的视频的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。费率万一,可半年后免五。
开户后可提供技术相关解答。
国盛证券Ptrade测试版下载 Ptrade模拟客户端 模拟账号
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1817 次浏览 • 2023-09-01 22:53
国盛证券Ptrade测试版下载 Ptrade模拟客户端 模拟账号
仿真客户端
国盛Ptrade测试版 模拟账户下载:
https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip
仿真账户: ***** / ****** 量化回测:支持1分钟、日线回测。 量化交易:支持LEVEL1 tick股票交易。 量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。
虽然ptrade有测试版本,但是个人还是非常不推荐使用测试版本。 以前在上面写过回测或者模拟盘,发现问题非常多,一个是数据缺了,数据错乱。以前被它坑过,后面基本都就不敢用了。 群里的兄弟大部分也被坑过,进群公告就是告诫他们,远离测试版。。。哈
实盘版本的需要开通才能申请,不同券商的门槛不一样。需要的朋友可以扫码咨询:
查看全部
国盛证券Ptrade测试版下载 Ptrade模拟客户端 模拟账号
仿真客户端
国盛Ptrade测试版 模拟账户下载:
https://download.gszq.com/ptrade/PTrade1.0-Client-V201906-00-000.zip
仿真账户: ***** / ****** 量化回测:支持1分钟、日线回测。 量化交易:支持LEVEL1 tick股票交易。 量化研究:提供云Ipython Notebook研究环境、行情数据2005年至今、可使用全市场金融数据。
虽然ptrade有测试版本,但是个人还是非常不推荐使用测试版本。 以前在上面写过回测或者模拟盘,发现问题非常多,一个是数据缺了,数据错乱。以前被它坑过,后面基本都就不敢用了。 群里的兄弟大部分也被坑过,进群公告就是告诫他们,远离测试版。。。哈
实盘版本的需要开通才能申请,不同券商的门槛不一样。需要的朋友可以扫码咨询:
国金QMT实盘版本下载地址
QMT • 李魔佛 发表了文章 • 0 个评论 • 2964 次浏览 • 2023-08-22 22:00
QMT实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqqmt.rar
安装路径最好不要有中文,和空格。
实盘版里面可以切换模拟和实盘。
在线接口文档:
https://qmt.ptradeapi.com
需要开通QMT的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。
开户后可提供技术相关解答。
附一个国金Ptrade的下载地址:
Ptrade实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqptd.rar
查看全部
QMT实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqqmt.rar
安装路径最好不要有中文,和空格。
实盘版里面可以切换模拟和实盘。
在线接口文档:
https://qmt.ptradeapi.com
需要开通QMT的朋友可以扫码咨询开通,目前国金开通门槛是入金2W就可以了。
开户后可提供技术相关解答。
附一个国金Ptrade的下载地址:
Ptrade实盘版下载地址:
https://download.gjzq.com.cn/gjty/organ/gjzqptd.rar
股票|可转债|基金|股指期货 数据白嫖 之 掘金量化版
李魔佛 发表了文章 • 0 个评论 • 1135 次浏览 • 2023-08-21 10:23
一些刚刚入门的星友可能会缺乏一些股票数据,转债数据或者接口源。之前星球分享不过不同的数据源:tushare,akshare,通达信pytdx,miniqmt,ptrade等等。
今天为大家介绍一个新的数据源,可以白嫖不用开户,只需要简单注册一个账号就可以拉取数据,注册过程花费30秒都不到。
https://www.myquant.cn/terminal
掘金量化
注册后用掘金量化终端登录,账号管理里有你的token,后续的数据调用都需要用的这个token,用于区分不同的用户。
有了token我们就可以开始白嫖数据了。from __future__ import print_function, absolute_import
from gm.api import *
set_token(juejin_token)
获取可转债的分钟数据
就这么简单,没有多余的参数。
不过分钟数据只能拿到最近180天的数据。而日线则可以拿到所有的数据。
另外一个获取历史数据的函数:
get_history_instruments
除了拿到开盘,收盘,最低,最高加和成交量等数据,还可以获取可转债特性的数据,比如转股价,正股标的,上市日期,退市日期等。
剩余规模可以通过另外一个函数获取:
bnd_get_amount_change
获取指数成分股get_constituents(index='SHSE.000300', fields='symbol, weight', df=True)比如上面实例代码获取的是沪深300指数当前的成分股,以及每个个股的权重。
数据文档
期货数据
除此之外还有一些期货,指数数据可以获取的。比如获取中证1000股指期货IM2212合约数据im_data = get_history_symbol(symbol='CFFEX.IM2212', start_date='2022-12-12', end_date='2022-12-16', df=True)
目前掘金量化也支持实盘交易,目前费率和门槛最低的是国盛证券,只需要入金5W就可以开通实盘版本,费率也是非常低的,最低可以到万一免五! 实盘掘金交易,股票需要再万一的基础上加0.2%,ETF,可转债这些品种还是原来的万0.5,简直良心券商!
需要开通的可以扫码咨询开通:
查看全部
一些刚刚入门的星友可能会缺乏一些股票数据,转债数据或者接口源。之前星球分享不过不同的数据源:tushare,akshare,通达信pytdx,miniqmt,ptrade等等。
今天为大家介绍一个新的数据源,可以白嫖不用开户,只需要简单注册一个账号就可以拉取数据,注册过程花费30秒都不到。
https://www.myquant.cn/terminal
掘金量化
注册后用掘金量化终端登录,账号管理里有你的token,后续的数据调用都需要用的这个token,用于区分不同的用户。
有了token我们就可以开始白嫖数据了。
from __future__ import print_function, absolute_import
from gm.api import *
set_token(juejin_token)
获取可转债的分钟数据
就这么简单,没有多余的参数。
不过分钟数据只能拿到最近180天的数据。而日线则可以拿到所有的数据。
另外一个获取历史数据的函数:
get_history_instruments
除了拿到开盘,收盘,最低,最高加和成交量等数据,还可以获取可转债特性的数据,比如转股价,正股标的,上市日期,退市日期等。
剩余规模可以通过另外一个函数获取:
bnd_get_amount_change
获取指数成分股get_constituents(index='SHSE.000300', fields='symbol, weight', df=True)比如上面实例代码获取的是沪深300指数当前的成分股,以及每个个股的权重。
数据文档
期货数据
除此之外还有一些期货,指数数据可以获取的。比如获取中证1000股指期货IM2212合约数据
im_data = get_history_symbol(symbol='CFFEX.IM2212', start_date='2022-12-12', end_date='2022-12-16', df=True)
目前掘金量化也支持实盘交易,目前费率和门槛最低的是国盛证券,只需要入金5W就可以开通实盘版本,费率也是非常低的,最低可以到万一免五! 实盘掘金交易,股票需要再万一的基础上加0.2%,ETF,可转债这些品种还是原来的万0.5,简直良心券商!
需要开通的可以扫码咨询开通:
QMT iQuant miniQMT它们有什么区别?
李魔佛 发表了文章 • 0 个评论 • 1899 次浏览 • 2023-08-18 15:46
对于第一次接触的朋友来说,经常会问到几个问题,QMT和iQuant,miniQMT有什么区别。
首先,QMT和iQuant都是有迅投开发的。miniQMT是在QMT底下的运行的一个极简模式。
接下来将详细的讲讲。
QMT vs iQuant
一般券商采购了迅投的QMT,接入行情数据服务器和交易服务器,和用户资金账户,就可以让他成为自己的量化交易软件。
而iQuant是有国信定制开发的。iQuant它的大部分券商的QMT的功能基本一样。 不同的地方有:
iQuant移除了VBA模型
下图是国金QMT,在新建策略下面,有VBA模型和python模型
而在国信的iQuant的策略开发模式下,只支持python模型,VBA编写模型的功能被移除了。
对于VBA而言,实际是一门古老的语言,至少在互联网领域,已经没见过几个人在用的了。
不过我在查询了一下它的在QMT里面的实盘交易代码,其实它还是挺适合熟悉通达信公式的朋友使用,很多语法是从通达信的公式演变而来的。
iQuant支持投资研究,使用jupyter notebook逐行运行,为了便于调试。
而其他的QMT均没有这个功能。 不过这个功能我试了下,它只是调用我系统的jupyter notebook,而且它有严重的bug,居然运行不了任何代码。(ptrade也有个类似这样的功能,可以逐行调用内置的获取行情的函数,ptrade的是可以正常运行的)
少数券商的QMT无法在虚拟机运行
QMT可以在虚拟机运行,大部分券商的QMT可以在虚拟机里面运行,这也意味这可以云主机服务器运行,比如阿里云,腾讯云这种,在云服务器上网络和系统稳定性都要比你在家里放的主机要好,因为QMT需要一台正在运行的Windows系统,且网络畅通。
只有少数券商的QMT无法在虚拟机里面运行。
之前笔者粗略地对比了下QMT读取的系统信息,异同点字在于磁盘序列号,想要硬刚的读者朋友在可以尝试修改虚拟机的硬盘序列号。
在python编写策略的代码层面,QMT和iQuant的接口文档也基本一致的,可能在一些功能函数上会有些少出入。二者写的python代码可互相在彼此上运行。
QMT 与 miniQMT
miniQMT属于QMT的一个子功能,一个精简功能下的自动交易框架,只支持实盘交易,不支持回测。在miniQMT模式下,你的策略代码将不在固定在自带的那个QMT软件下编写,而是可以自由地使用pycharm,vscode等编辑器,运行的时候直接使用 python xxxx.py 这样的形式启动。
只是券商很少对它进行宣传,以至于用它的人不多。
进入miniQMT的方法: 点击QMT程序,登录时勾选极简模式
注意:极简模式下,需要一直保持者这个miniQMT的登录程序在运行,意味者miniQMT也只能在windows系统下运行。
XtQuant
miniQMT的核心是XtQuant,XtQuant能提供哪些服务?
XtQuant是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的行情和交易相关的API接口。
XtQuant运行依赖环境
XtQuant目前提供的库包括Python3.6、3.7、3.8版本,不同版本的python导入时会自动切换。根据群友反馈,最新的版本可以支持到python3.11。
在运行使用XtQuant的程序前需要先启动MiniQMT客户端。
然后把你的QMT目录下的\bin.x64\Lib\site-packages\xtquant复制到你系统python目录下的site-packages。
然后就可以在你的代码里面导入QMT的函数,包括获取行情数据,下单函数。
它的帮助文档在bin.x64\Lib\site-packages\xtquant\doc 目录下。
从它的帮助文档来看,它是一套和QMT接口函数完全不一样的交易框架。
所以QMT的代码,无法直接拷贝到miniQMT中使用。虽然名字叫miniQMT,但感觉它提供的很多函数功能,要比QMT更为丰富,用户可以掌控的流程更多,更灵活。
iQuant版虽然也有精简版的miniQMT,但它对个人用户不提供下单功能呢,只有获取行情数据,财务数据等的数据权限。
还有一个与之配套的xtdata库,是专门用来获取行情数据的,而xttrade是专门用来交易下单的。
因为xtdata可以获取很多股票,可转债,ETF等等历史数据,所以即使你不用miniQMT做交易,你也可以白嫖它的数据,这比用积分的tushare简直不要太爽。比如可以获取到股票或可转债的日线,分钟线,甚至tick数据。
比如下面的代码就可以获取 众信转债 的某个时间的历史tick数据,并保存到文件。 只要稍微改造下,就可以获取全市场的转债的tick数据。
import pandas as pd
import datetime
def get_tick(code, start_time, end_time, period='tick'):
from xtquant import xtdata
xtdata.download_history_data(code, period=period, start_time=start_time, end_time=end_time)
data = xtdata.get_local_data(field_list=, stock_code=, period=period, count=10)
result_list = data df = pd.DataFrame(result_list)
df['time_str'] = df['time'].apply(lambda x: datetime.datetime.fromtimestamp(x / 1000.0))
return df
def process_timestamp(df, filename):
df = df.set_index('time_str')
result = df.resample('3S').first().ffill()
result = result[(result.index >= '2022-07-20 09:30') & (result.index <= '2022-07-20 15:00')]
result = result.reset_index()
result.to_csv(filename + '.csv')
def dump_single_code_tick():
# 导出单个转债的tick数据
code='128022'
start_date = '20210113'
end_date = '20210130'
post_fix = 'SZ' if code.startswith('12') else 'SH'
code = '{}.{}'.format(code,post_fix)
filename = '{}'.format(code)
df = get_tick(code, start_date, end_date)
dump_single_code_tick()
把上面保存为main.py, 然后执行python main.py , 片刻就可以看到生成的文件数据了。
结语
为了便于读者快速浏览帮助文档,可以在公众号后台回复对应的关键词获取对应的帮助文档:
qmt文档
miniqmt文档
如果想要体验qmt或者miniqmt自动交易的朋友,可以后台回复:开通qmt
即可获取低门槛低费率的开通qmt/iQuant的券商开户方式。
知识星球: 查看全部
对于第一次接触的朋友来说,经常会问到几个问题,QMT和iQuant,miniQMT有什么区别。
首先,QMT和iQuant都是有迅投开发的。miniQMT是在QMT底下的运行的一个极简模式。
接下来将详细的讲讲。
QMT vs iQuant
一般券商采购了迅投的QMT,接入行情数据服务器和交易服务器,和用户资金账户,就可以让他成为自己的量化交易软件。
而iQuant是有国信定制开发的。iQuant它的大部分券商的QMT的功能基本一样。 不同的地方有:
iQuant移除了VBA模型
下图是国金QMT,在新建策略下面,有VBA模型和python模型
而在国信的iQuant的策略开发模式下,只支持python模型,VBA编写模型的功能被移除了。
对于VBA而言,实际是一门古老的语言,至少在互联网领域,已经没见过几个人在用的了。
不过我在查询了一下它的在QMT里面的实盘交易代码,其实它还是挺适合熟悉通达信公式的朋友使用,很多语法是从通达信的公式演变而来的。
iQuant支持投资研究,使用jupyter notebook逐行运行,为了便于调试。
而其他的QMT均没有这个功能。 不过这个功能我试了下,它只是调用我系统的jupyter notebook,而且它有严重的bug,居然运行不了任何代码。(ptrade也有个类似这样的功能,可以逐行调用内置的获取行情的函数,ptrade的是可以正常运行的)
少数券商的QMT无法在虚拟机运行
QMT可以在虚拟机运行,大部分券商的QMT可以在虚拟机里面运行,这也意味这可以云主机服务器运行,比如阿里云,腾讯云这种,在云服务器上网络和系统稳定性都要比你在家里放的主机要好,因为QMT需要一台正在运行的Windows系统,且网络畅通。
只有少数券商的QMT无法在虚拟机里面运行。
之前笔者粗略地对比了下QMT读取的系统信息,异同点字在于磁盘序列号,想要硬刚的读者朋友在可以尝试修改虚拟机的硬盘序列号。
在python编写策略的代码层面,QMT和iQuant的接口文档也基本一致的,可能在一些功能函数上会有些少出入。二者写的python代码可互相在彼此上运行。
QMT 与 miniQMT
miniQMT属于QMT的一个子功能,一个精简功能下的自动交易框架,只支持实盘交易,不支持回测。在miniQMT模式下,你的策略代码将不在固定在自带的那个QMT软件下编写,而是可以自由地使用pycharm,vscode等编辑器,运行的时候直接使用 python xxxx.py 这样的形式启动。
只是券商很少对它进行宣传,以至于用它的人不多。
进入miniQMT的方法: 点击QMT程序,登录时勾选极简模式
注意:极简模式下,需要一直保持者这个miniQMT的登录程序在运行,意味者miniQMT也只能在windows系统下运行。
XtQuant
miniQMT的核心是XtQuant,XtQuant能提供哪些服务?
XtQuant是基于迅投MiniQMT衍生出来的一套完善的Python策略运行框架,对外以Python库的形式提供策略交易所需要的行情和交易相关的API接口。
XtQuant运行依赖环境
XtQuant目前提供的库包括Python3.6、3.7、3.8版本,不同版本的python导入时会自动切换。根据群友反馈,最新的版本可以支持到python3.11。
在运行使用XtQuant的程序前需要先启动MiniQMT客户端。
然后把你的QMT目录下的\bin.x64\Lib\site-packages\xtquant复制到你系统python目录下的site-packages。
然后就可以在你的代码里面导入QMT的函数,包括获取行情数据,下单函数。
它的帮助文档在bin.x64\Lib\site-packages\xtquant\doc 目录下。
从它的帮助文档来看,它是一套和QMT接口函数完全不一样的交易框架。
所以QMT的代码,无法直接拷贝到miniQMT中使用。虽然名字叫miniQMT,但感觉它提供的很多函数功能,要比QMT更为丰富,用户可以掌控的流程更多,更灵活。
iQuant版虽然也有精简版的miniQMT,但它对个人用户不提供下单功能呢,只有获取行情数据,财务数据等的数据权限。
还有一个与之配套的xtdata库,是专门用来获取行情数据的,而xttrade是专门用来交易下单的。
因为xtdata可以获取很多股票,可转债,ETF等等历史数据,所以即使你不用miniQMT做交易,你也可以白嫖它的数据,这比用积分的tushare简直不要太爽。比如可以获取到股票或可转债的日线,分钟线,甚至tick数据。
比如下面的代码就可以获取 众信转债 的某个时间的历史tick数据,并保存到文件。 只要稍微改造下,就可以获取全市场的转债的tick数据。
import pandas as pd
import datetime
def get_tick(code, start_time, end_time, period='tick'):
from xtquant import xtdata
xtdata.download_history_data(code, period=period, start_time=start_time, end_time=end_time)
data = xtdata.get_local_data(field_list=, stock_code=
, period=period, count=10)
result_list = data
df = pd.DataFrame(result_list)
df['time_str'] = df['time'].apply(lambda x: datetime.datetime.fromtimestamp(x / 1000.0))
return df
def process_timestamp(df, filename):
df = df.set_index('time_str')
result = df.resample('3S').first().ffill()
result = result[(result.index >= '2022-07-20 09:30') & (result.index <= '2022-07-20 15:00')]
result = result.reset_index()
result.to_csv(filename + '.csv')
def dump_single_code_tick():
# 导出单个转债的tick数据
code='128022'
start_date = '20210113'
end_date = '20210130'
post_fix = 'SZ' if code.startswith('12') else 'SH'
code = '{}.{}'.format(code,post_fix)
filename = '{}'.format(code)
df = get_tick(code, start_date, end_date)
dump_single_code_tick()
把上面保存为main.py, 然后执行python main.py , 片刻就可以看到生成的文件数据了。
结语
为了便于读者快速浏览帮助文档,可以在公众号后台回复对应的关键词获取对应的帮助文档:
qmt文档
miniqmt文档
如果想要体验qmt或者miniqmt自动交易的朋友,可以后台回复:开通qmt
即可获取低门槛低费率的开通qmt/iQuant的券商开户方式。
知识星球:
哪些券商有miniqmt? 门槛如何
QMT • 李魔佛 发表了文章 • 0 个评论 • 2315 次浏览 • 2023-08-11 12:04
它属于一个精简版的QMT,把回测功能,UI界面操作功能去除。
你可以把miniqmt导入到你的项目里面,直接操作下单。
from xtquant import xtdata
data = xtdata.get_market_data(field_list=['time', 'open', 'close', 'high', 'low', 'volume', 'amount'], stock_list=['603000.SH'], period='1d', start_time='20230101')
print(data)上面代码 可以直接在你的pycharm里面运行, 提前把 xtquant 这个包复制到系统路径,site-packages,或者自己加到环境变量。
MiniQMT支持新版本的Python
最新已经支持python3.6-3.11
更新方式:主QMT-设置-交易设置-模型设置里更新Python库
目前支持miniQTM的券商有哪些?
其实miniqmt是附属在QMT上的,正常有QMT的,默认就可以使用miniqmt,除非券商作妖,阉割了。
国金,国盛支持miniqmt,开通QMT后 miniqmt就是直接可以使用的。
而国信的miniqmt默认被阉割了,需要额外去申请。(可能还有些经理不敬业的,会和你说不支持miniqmt,曾经遇到过),不过国信的miniqmt开通后,个人只能拉取行情数据,是没有下单权限,下单券商是需要机构才可以申请。
国金的QMT,miniqmt的开通门槛会低一些,有入金2W就可以开通的营业部; 也有入金50W开通的营业部。 需要的盆友可以扫码咨询开通。
国盛的QMT,目前门槛比较高,需要资产100W才能开通。本身之前门槛还只是入金30W就可以的了,后面他们不断地提高门槛,提到50W,后面提高到100W,不过最近几天,营业部的经理和我说目前我这边开通只需要50W即可。
所以平时有优惠费率的时候就不要犹犹豫豫,把账户和权限开了再说,因为好事不常有,过了这个桥就没有这个店。
需要开户的盆友可以扫码咨询
查看全部
它属于一个精简版的QMT,把回测功能,UI界面操作功能去除。
你可以把miniqmt导入到你的项目里面,直接操作下单。
from xtquant import xtdata上面代码 可以直接在你的pycharm里面运行, 提前把 xtquant 这个包复制到系统路径,site-packages,或者自己加到环境变量。
data = xtdata.get_market_data(field_list=['time', 'open', 'close', 'high', 'low', 'volume', 'amount'], stock_list=['603000.SH'], period='1d', start_time='20230101')
print(data)
MiniQMT支持新版本的Python
最新已经支持python3.6-3.11
更新方式:主QMT-设置-交易设置-模型设置里更新Python库
目前支持miniQTM的券商有哪些?
其实miniqmt是附属在QMT上的,正常有QMT的,默认就可以使用miniqmt,除非券商作妖,阉割了。
国金,国盛支持miniqmt,开通QMT后 miniqmt就是直接可以使用的。
而国信的miniqmt默认被阉割了,需要额外去申请。(可能还有些经理不敬业的,会和你说不支持miniqmt,曾经遇到过),不过国信的miniqmt开通后,个人只能拉取行情数据,是没有下单权限,下单券商是需要机构才可以申请。
国金的QMT,miniqmt的开通门槛会低一些,有入金2W就可以开通的营业部; 也有入金50W开通的营业部。 需要的盆友可以扫码咨询开通。
国盛的QMT,目前门槛比较高,需要资产100W才能开通。本身之前门槛还只是入金30W就可以的了,后面他们不断地提高门槛,提到50W,后面提高到100W,不过最近几天,营业部的经理和我说目前我这边开通只需要50W即可。
所以平时有优惠费率的时候就不要犹犹豫豫,把账户和权限开了再说,因为好事不常有,过了这个桥就没有这个店。
需要开户的盆友可以扫码咨询
ptrade qmt无法登录问题
李魔佛 发表了文章 • 0 个评论 • 1667 次浏览 • 2023-08-08 14:44
实际上这是在周五晚上和周末出现的问题,这是计划内的维护。部分券商没有技术服务支持,用户可能连服务器日常维护服务通知都无法及时得到通知。
PS:其实,大部分券商基本也就那样,ptrade和qmt的技术支持基本等于0,不敢说全部,至少90%的情况是这样的。 以至于我自己维护了一个ptrade,qmt的技术群(审核才可以加),日常有空就在里面解决群友的问题。基本都是些基础问题,部分可能是券商数据问题,大部分是用户的代码问题。 查看全部
20行代码实现Ptrade一键清仓
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1306 次浏览 • 2023-07-28 02:16
万一遇到特殊情况要核的话,管快,1秒清空
def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0:
order_target(code, 0)
# 标准
def initialize(context):
# 初始化策略
run_daily(context, func, time='9:25')
def handle_data(context, data):
pass
实际只用11行代码。
如果只清除转债或者股票某个品种,可以在code那里加个判断def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0 and code.startswith(('12','11')): # 只清除转债
order_target(code, 0) 查看全部
万一遇到特殊情况要核的话,管快,1秒清空
def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0:
order_target(code, 0)
# 标准
def initialize(context):
# 初始化策略
run_daily(context, func, time='9:25')
def handle_data(context, data):
pass
实际只用11行代码。
如果只清除转债或者股票某个品种,可以在code那里加个判断
def func(context):
pos_dict = get_positions()
for code,pos in pos_dict.items():
enable_amount = pos.enable_amount
if enable_amount>0 and code.startswith(('12','11')): # 只清除转债
order_target(code, 0)
ptrade重启策略后日志被清空,正常的操作方式
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1272 次浏览 • 2023-07-25 04:36
然后就心满意足的退出Ptrade。
然后想起来有个日志想要查一下的。再进去一看,里面的几个月的日志就被清除了。 OMG
这个清除日志的操作虽然说是软件设置的。但是产品经理应该也要评估一下,哪怕我只是改一个时间,比如我把策略从9:15分执行改成9:16执行,只要改动,策略就需要被重启,才能生效。
试问,哪个策略能够几年不出错,不修改,一直在上面运行的呢? 退一万步讲,其实如果我知道我即将修改后重启策略,面对这几百个按时间切割的日志,我用什么工具导出呢?
软件自带的导出功能只能按照天数的。
所以对于运行很久的策略,如果需要修改里面的内容,我的建议是,直接停止程序,而不是重启。
然后把你的策略复制到一个新的策略里面,在新的策略里面改动参数。
然后直接运行这个新的策略,这样之前那个策略因为没有被重启,只是停止了,它的日志依然保存在ptrade的日历里面,你只需要选择指定的日期,就可以看到对应的历史数据。
更多ptrade、qmt,掘金的量化交易技巧,请查看星球。
查看全部
然后就心满意足的退出Ptrade。
然后想起来有个日志想要查一下的。再进去一看,里面的几个月的日志就被清除了。 OMG
这个清除日志的操作虽然说是软件设置的。但是产品经理应该也要评估一下,哪怕我只是改一个时间,比如我把策略从9:15分执行改成9:16执行,只要改动,策略就需要被重启,才能生效。
试问,哪个策略能够几年不出错,不修改,一直在上面运行的呢? 退一万步讲,其实如果我知道我即将修改后重启策略,面对这几百个按时间切割的日志,我用什么工具导出呢?
软件自带的导出功能只能按照天数的。
所以对于运行很久的策略,如果需要修改里面的内容,我的建议是,直接停止程序,而不是重启。
然后把你的策略复制到一个新的策略里面,在新的策略里面改动参数。
然后直接运行这个新的策略,这样之前那个策略因为没有被重启,只是停止了,它的日志依然保存在ptrade的日历里面,你只需要选择指定的日期,就可以看到对应的历史数据。
更多ptrade、qmt,掘金的量化交易技巧,请查看星球。
ptrade批量获取股票的昨天的收盘价,转为字典json【一】
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1574 次浏览 • 2023-07-17 19:50
ptrade接口文档:https://ptradeapi.com
笔者这里接写几个最简单的方式,供读者朋友参考。
下面代码适用于实盘,回测。
code_list = ['113578.SS','123014.SZ'] # 股票池,这里可以填几千个股票也没问题的
zz_df_price = get_price(code_list, start_date=None, end_date=None, frequency='1d', fields='close', fq=None, count=1)
yesterday_price_dict = zz_df_price.iloc[0].to_json()
讲解:
1.
code_list = ['113578.SS','123014.SZ'] # 股票池,这里可以填几千个股票也没问题的,比如你可以先拿沪深300指数的成分股,然后传入这个函数。
2.
zz_df_price = get_price(code_list, start_date=None, end_date=None, frequency='1d', fields='close', fq=None, count=1)
get_price: 获取历史数据。 这里不用get_history,因为这个函数太多bug了,主要是券商数据可能是缺的。拿历史数据我基本不敢用get_history。
因为我拿昨天的收盘价,所以我就不指定日期,只用count=1,获取1条数据,因为数据是从最新开始的,那么这一条数据肯定是上一个交易日的。
正常情况返回的数据是一个Pannel,三维的。不过因为filed=‘close',单个字段,特殊情况,这里返回的是一个dataframe
输出:
zz_df_price.iloc[0].to_json()
index 113578.SS 123014.SZ
2023-07-14 93.036 118.36
所以接下来要做的是,获取dataframe的第一行数据,直接转为json
得到:
'{"113578.SS":93.036,"123014.SZ":118.36}'
更多技术支持与解答,欢迎加入星球。
查看全部
ptrade接口文档:https://ptradeapi.com
笔者这里接写几个最简单的方式,供读者朋友参考。
下面代码适用于实盘,回测。
code_list = ['113578.SS','123014.SZ'] # 股票池,这里可以填几千个股票也没问题的
zz_df_price = get_price(code_list, start_date=None, end_date=None, frequency='1d', fields='close', fq=None, count=1)
yesterday_price_dict = zz_df_price.iloc[0].to_json()
讲解:
1.
code_list = ['113578.SS','123014.SZ'] # 股票池,这里可以填几千个股票也没问题的,比如你可以先拿沪深300指数的成分股,然后传入这个函数。
2.
zz_df_price = get_price(code_list, start_date=None, end_date=None, frequency='1d', fields='close', fq=None, count=1)
get_price: 获取历史数据。 这里不用get_history,因为这个函数太多bug了,主要是券商数据可能是缺的。拿历史数据我基本不敢用get_history。
因为我拿昨天的收盘价,所以我就不指定日期,只用count=1,获取1条数据,因为数据是从最新开始的,那么这一条数据肯定是上一个交易日的。
正常情况返回的数据是一个Pannel,三维的。不过因为filed=‘close',单个字段,特殊情况,这里返回的是一个dataframe
输出:
zz_df_price.iloc[0].to_json()
index 113578.SS 123014.SZ
2023-07-14 93.036 118.36
所以接下来要做的是,获取dataframe的第一行数据,直接转为json
得到:
'{"113578.SS":93.036,"123014.SZ":118.36}'
更多技术支持与解答,欢迎加入星球。
投资海外市场,有哪些标的可以考虑?| 多个QDII基金数据分析
股票 • 李魔佛 发表了文章 • 0 个评论 • 1090 次浏览 • 2023-07-10 23:21
这是过去十几年纳斯达克指数的月K线走势。
去年2022年回调了一年,下跌了33%,而今年截至到今天,已经涨了31%。
以前老司机曾经说过,对于纳指的每次回调都是买入的机会。老司机果诚不欺我也!
2016年的时候不少大V就在喊美股冲顶风险很大泡沫要破云云之类。再来看看我们那低估的沪深300。
最近十五年来的月K线。上涨的时光总是短暂的。如果十多年前山顶位置买的投资者,熬到现在也可能未解套。
怪不得网友们的吐槽
所以放眼全球,可选标的更为丰富,那投资标的就可以更为分散,篮子里的品种相关性就会越低,那么遭遇系统性风险的概率就越低。好比买了一揽子基于A股的基金,然后A股大盘崩了,覆巢之下无完卵,那一篮子的鸡蛋也碎了。而投资全球基金,就是把鸡蛋装到不同的篮子,甚至不同的车子里。
本期雪球老司基评测选出了8只全球市场主题基金,我们来对其进行评测,来看看各自的风格,哪一只的风格适合你。
本次评测的8个全球基金如下:
其中,易方达标普消费品,广发全球医疗保健,华安标普全球石油,诺安全球黄金这4个基金为跟踪指数型基金,主要考察基金经理对指数跟踪误差的控制能力。
工银全球精选股票,国富全球科技互联,富国全球科技互联,银华抗通胀主题主要考验基金经理的选股,择时能力。
同为投资标的为科技互联网的国富全球科技互联和富国全球科技互联,名字很像,只不过是两个基金公司发行的基金。不过它俩最近三年的收益率差距很大,国富全球科技互联(006373)最近三年的收益率为32%,而富国全球科技互联(100055)的最近三年的收益率却为-7%, 同为全球科技型股票基金,为何二者差距会有这么大呢?
根据最新的季报信息,二者的规模与持仓比较如下:
二者都属于小规模基金,规模小于3个亿,而国富全球科技互联(006373)其基金规模更加低于一个亿。国富全球科技互联(006373)的持仓股票占比比富国全球科技互联(100055)要高近20%(79% vs 61%)
而对比一下二者的十大持仓股,黄色标注的为中概股(港股),富国全球科技(100055)十大持仓里有8个中概股。
这种情况下,很难躲过中概股的这一轮下跌的。
而最近2年的中概股走势你们也是有目共睹的。
就这样跌跌跌的走势,还想着赚钱? 能保本不亏已经算是人上人了。
因此富国全球科技(100055)在评测的这8个海外基金里面,最近3年的收益率是最低的。见最上面的近三年收益率图
而这两只海外QDII基金的规模有点小,尤其是国富全球科技互联(006373),当前规模只有8千万,遇到暴跌行情时会有赎回的流动性问题,且有触发低于规定规模(一般3千万)而清盘的风险。
在这8只全球海外基金里,还有一只重仓科技互联网的基金,工银全球精选股票,目前该基金经理为林念。而且它的基金规模接近4个亿,比富国全球科技和国富全球科技互联的规模要大。
其十大持仓股:
工银全球精选股票
从上图可以看到该基金的十大持仓里基本囊括了微软谷歌META这种美国优秀互联网企业,也有国内腾讯,台积电这样的互联网,芯片龙头企业。
而该基金从成立到现在,该基金的累计收益率为200%,最大回撤为-28%, 回撤控制得相当不错。对于厌恶风险的朋友,又想投资互联网科技股的朋友可以考虑考虑此基金。
工银全球精选最大回撤
如果你想像买国内贵州茅台股票那样的消费品,来对标买入全球范围内类似茅台此类优秀的股票,那么买入跟踪全球的消费指数的基金----易方达标普消费品,是一个很不错的选择。
从它的跟踪标的来看,它的确如茅台一样,在国内看来,持有的都是些奢华的消费品。
易方达标普消费品十大持仓
国内百姓日常能买的,这里面也只有耐克了。。。。。
这些公司的奢侈品如茅台一样具有很高的溢价,为了维持品牌形象,它们的定价策略是不轻易走降价路线的,况且也不愁卖不出。
正如雪球上的主流投资理念,买股票就是买公司;买入易方达标普消费品QDII基金,等于一篮子买入了这些奢侈品公司,何不美哉?
如何选择适合我的QDII基金?
先看最近5年每年度的收益率以及近5年的收益率:
最近5年的年度收益率
5年累计收益
石油,黄金,抗通胀类的基金,属于周期性的品种,个人觉得是不能长持的,一旦在上涨周期的冲顶阶段迈入了,很可能就是要被套个几年了。如果一直持有会一直坐过山车;这类基金适合在周期底部开始买入;一般而言,底部要比顶部要好判断的多。有反弹了,可以继续持有,等待上涨周期的到来;而且不能买入过早,不然前期会比较煎熬,比较考验耐心。
而医疗和消费是可以长期持有并穿越牛熊的。从最近5年的广发全球医疗和易方达标普消费的每年收益率和近5年总收益率来看,绝大部分年份都不是涨幅最大的,但跌幅也不是最大的,波动不如其他几个科技,石油来的大,但累计收益却是最大的2个。这其实和股票交易的很像,每天上蹿下跳的,实际几年下来可能还是原地踏步甚至倒退。
广发全球医疗成立以来的业绩曲线
广发全球医疗
波动率和最大回撤都要比沪深300低,截止当前的累计收益率为141%,高于沪深300的56%,典型的长牛走势。
虽然石油类QDII具有强周期属性,但作为基金市场上场内外购买渠道里,直接对标全球原油的基金只有华安标普全球石油和广发石油指数,人气更高的华宝油气挂钩的则是上游油气开采的企业,和石油价格相关性比华安石油和广发石油要低不少。原来的银行渠道的可以直接购买的原油宝等高风险产品,因负油价事件已经被暂停了。
华安标普全球石油跟踪的石油指数为标普全球石油指数,其指数走势如下:
标普全球石油指数
从这近10年的走势图,2014-2015的高点在2022年中才被收复。
该指数的成分股为全球内石油巨头。
标普全球石油指数成分股
由于跟踪的是石油公司,而非石油本身,且分散买入这些石油公司,所以指数波动要比石油价格要小得多,但也是和油价呈现出强相关关系。
2020年5月的负油价事件,把该指数和跟踪它的华安标普全球石油砸了个大坑。但不会像石油期货交割那样亏完本金还要倒亏。毕竟基金持有的石油公司的资产,品牌等各类资源还在。
下图为华安标普全球石油160416场内的月K线图。
华安标普全球石油
所以华安标普全球石油这种QDII基金是普通投资者参与国际大宗商品最便捷,最简单的方式,没有换汇的繁琐和每年5W美刀的限制,不需要开通复杂的商品期货账户,只要有个雪球账户或支付宝账户就可以直接参与国际原油的交易当中了。
## 总结
在这8个全球QDII基金里,如果想参与到当下的chatGPT等AI科技浪潮中,看好AI继续引领全球经济,可以选择科技型QDII基金工银全球精选股票;
如果要长持稳妥能有够硬的抵御风险能力的QDII基金,那么可以选择易方达标普消费品和广发全球医疗保健;
如果对俄乌战事继续悲观,平时对国际时事战争比较关心,那么可以根据事件预测,适时埋伏华安标普全球石油和诺安全球黄金,做一波事件驱动的短线操作。 查看全部
这是过去十几年纳斯达克指数的月K线走势。
去年2022年回调了一年,下跌了33%,而今年截至到今天,已经涨了31%。
以前老司机曾经说过,对于纳指的每次回调都是买入的机会。老司机果诚不欺我也!
2016年的时候不少大V就在喊美股冲顶风险很大泡沫要破云云之类。再来看看我们那低估的沪深300。
最近十五年来的月K线。上涨的时光总是短暂的。如果十多年前山顶位置买的投资者,熬到现在也可能未解套。
怪不得网友们的吐槽
所以放眼全球,可选标的更为丰富,那投资标的就可以更为分散,篮子里的品种相关性就会越低,那么遭遇系统性风险的概率就越低。好比买了一揽子基于A股的基金,然后A股大盘崩了,覆巢之下无完卵,那一篮子的鸡蛋也碎了。而投资全球基金,就是把鸡蛋装到不同的篮子,甚至不同的车子里。
本期雪球老司基评测选出了8只全球市场主题基金,我们来对其进行评测,来看看各自的风格,哪一只的风格适合你。
本次评测的8个全球基金如下:
其中,易方达标普消费品,广发全球医疗保健,华安标普全球石油,诺安全球黄金这4个基金为跟踪指数型基金,主要考察基金经理对指数跟踪误差的控制能力。
工银全球精选股票,国富全球科技互联,富国全球科技互联,银华抗通胀主题主要考验基金经理的选股,择时能力。
同为投资标的为科技互联网的国富全球科技互联和富国全球科技互联,名字很像,只不过是两个基金公司发行的基金。不过它俩最近三年的收益率差距很大,国富全球科技互联(006373)最近三年的收益率为32%,而富国全球科技互联(100055)的最近三年的收益率却为-7%, 同为全球科技型股票基金,为何二者差距会有这么大呢?
根据最新的季报信息,二者的规模与持仓比较如下:
二者都属于小规模基金,规模小于3个亿,而国富全球科技互联(006373)其基金规模更加低于一个亿。国富全球科技互联(006373)的持仓股票占比比富国全球科技互联(100055)要高近20%(79% vs 61%)
而对比一下二者的十大持仓股,黄色标注的为中概股(港股),富国全球科技(100055)十大持仓里有8个中概股。
这种情况下,很难躲过中概股的这一轮下跌的。
而最近2年的中概股走势你们也是有目共睹的。
就这样跌跌跌的走势,还想着赚钱? 能保本不亏已经算是人上人了。
因此富国全球科技(100055)在评测的这8个海外基金里面,最近3年的收益率是最低的。见最上面的近三年收益率图
而这两只海外QDII基金的规模有点小,尤其是国富全球科技互联(006373),当前规模只有8千万,遇到暴跌行情时会有赎回的流动性问题,且有触发低于规定规模(一般3千万)而清盘的风险。
在这8只全球海外基金里,还有一只重仓科技互联网的基金,工银全球精选股票,目前该基金经理为林念。而且它的基金规模接近4个亿,比富国全球科技和国富全球科技互联的规模要大。
其十大持仓股:
工银全球精选股票
从上图可以看到该基金的十大持仓里基本囊括了微软谷歌META这种美国优秀互联网企业,也有国内腾讯,台积电这样的互联网,芯片龙头企业。
而该基金从成立到现在,该基金的累计收益率为200%,最大回撤为-28%, 回撤控制得相当不错。对于厌恶风险的朋友,又想投资互联网科技股的朋友可以考虑考虑此基金。
工银全球精选最大回撤
如果你想像买国内贵州茅台股票那样的消费品,来对标买入全球范围内类似茅台此类优秀的股票,那么买入跟踪全球的消费指数的基金----易方达标普消费品,是一个很不错的选择。
从它的跟踪标的来看,它的确如茅台一样,在国内看来,持有的都是些奢华的消费品。
易方达标普消费品十大持仓
国内百姓日常能买的,这里面也只有耐克了。。。。。
这些公司的奢侈品如茅台一样具有很高的溢价,为了维持品牌形象,它们的定价策略是不轻易走降价路线的,况且也不愁卖不出。
正如雪球上的主流投资理念,买股票就是买公司;买入易方达标普消费品QDII基金,等于一篮子买入了这些奢侈品公司,何不美哉?
如何选择适合我的QDII基金?
先看最近5年每年度的收益率以及近5年的收益率:
最近5年的年度收益率
5年累计收益
石油,黄金,抗通胀类的基金,属于周期性的品种,个人觉得是不能长持的,一旦在上涨周期的冲顶阶段迈入了,很可能就是要被套个几年了。如果一直持有会一直坐过山车;这类基金适合在周期底部开始买入;一般而言,底部要比顶部要好判断的多。有反弹了,可以继续持有,等待上涨周期的到来;而且不能买入过早,不然前期会比较煎熬,比较考验耐心。
而医疗和消费是可以长期持有并穿越牛熊的。从最近5年的广发全球医疗和易方达标普消费的每年收益率和近5年总收益率来看,绝大部分年份都不是涨幅最大的,但跌幅也不是最大的,波动不如其他几个科技,石油来的大,但累计收益却是最大的2个。这其实和股票交易的很像,每天上蹿下跳的,实际几年下来可能还是原地踏步甚至倒退。
广发全球医疗成立以来的业绩曲线
广发全球医疗
波动率和最大回撤都要比沪深300低,截止当前的累计收益率为141%,高于沪深300的56%,典型的长牛走势。
虽然石油类QDII具有强周期属性,但作为基金市场上场内外购买渠道里,直接对标全球原油的基金只有华安标普全球石油和广发石油指数,人气更高的华宝油气挂钩的则是上游油气开采的企业,和石油价格相关性比华安石油和广发石油要低不少。原来的银行渠道的可以直接购买的原油宝等高风险产品,因负油价事件已经被暂停了。
华安标普全球石油跟踪的石油指数为标普全球石油指数,其指数走势如下:
标普全球石油指数
从这近10年的走势图,2014-2015的高点在2022年中才被收复。
该指数的成分股为全球内石油巨头。
标普全球石油指数成分股
由于跟踪的是石油公司,而非石油本身,且分散买入这些石油公司,所以指数波动要比石油价格要小得多,但也是和油价呈现出强相关关系。
2020年5月的负油价事件,把该指数和跟踪它的华安标普全球石油砸了个大坑。但不会像石油期货交割那样亏完本金还要倒亏。毕竟基金持有的石油公司的资产,品牌等各类资源还在。
下图为华安标普全球石油160416场内的月K线图。
华安标普全球石油
所以华安标普全球石油这种QDII基金是普通投资者参与国际大宗商品最便捷,最简单的方式,没有换汇的繁琐和每年5W美刀的限制,不需要开通复杂的商品期货账户,只要有个雪球账户或支付宝账户就可以直接参与国际原油的交易当中了。
## 总结
在这8个全球QDII基金里,如果想参与到当下的chatGPT等AI科技浪潮中,看好AI继续引领全球经济,可以选择科技型QDII基金工银全球精选股票;
如果要长持稳妥能有够硬的抵御风险能力的QDII基金,那么可以选择易方达标普消费品和广发全球医疗保健;
如果对俄乌战事继续悲观,平时对国际时事战争比较关心,那么可以根据事件预测,适时埋伏华安标普全球石油和诺安全球黄金,做一波事件驱动的短线操作。
Ptrade几个order下单接口 order_target order_value order_target_value order_market的不同
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1347 次浏览 • 2023-07-10 02:23
https://ptradeapi.com
注意:大部分函数自适用于交易模块,回测模式不支持部分order函数。
order_target :
接口通过持仓数量比较将入参的目标数量转换成需要交易的成交,传入 order
接口
order_value:
接口通过 金额/限价 或者 金额/默认最新价 两种方式转换成需要交易的数量,
传入 order 接口
order_target_value:
接口通过持仓金额比较得到需要交易的金额, 金额/限价 或者 金额/默
认最新价 两种方式转换成需要交易的数量,传入 order 接口
order 接口:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则最新价代替,都是
限价方式报单。
二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就放到未处理订单
队列
三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。
order_market 接口:
一、
按照传入的 market_type 参数,市价委托方式报单。
二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就翻到未处理订单
队列
三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
之后买单和卖单处理有所不同,买单直接报柜台,卖单会校验持仓最大可卖然后调整数
量再报柜台。
tick_order:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则取档位价格(默
认第一档)
,都是限价方式报单。
二、
直接放到未处理订单队列
三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。
低门槛入金(2W)开通Ptrade量化API,扫码联系: 查看全部
https://ptradeapi.com
注意:大部分函数自适用于交易模块,回测模式不支持部分order函数。
order_target :
接口通过持仓数量比较将入参的目标数量转换成需要交易的成交,传入 order
接口
order_value:
接口通过 金额/限价 或者 金额/默认最新价 两种方式转换成需要交易的数量,
传入 order 接口
order_target_value:
接口通过持仓金额比较得到需要交易的金额, 金额/限价 或者 金额/默
认最新价 两种方式转换成需要交易的数量,传入 order 接口
order 接口:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则最新价代替,都是
限价方式报单。
二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就放到未处理订单
队列
三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。
order_market 接口:
一、
按照传入的 market_type 参数,市价委托方式报单。
二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就翻到未处理订单
队列
三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
之后买单和卖单处理有所不同,买单直接报柜台,卖单会校验持仓最大可卖然后调整数
量再报柜台。
tick_order:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则取档位价格(默
认第一档)
,都是限价方式报单。
二、
直接放到未处理订单队列
三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。
低门槛入金(2W)开通Ptrade量化API,扫码联系:
QMT vs PTrade资金更新速度|高频中如何处理
Ptrade • 李魔佛 发表了文章 • 0 个评论 • 1556 次浏览 • 2023-07-06 17:35
平时在手动交易中,下单委托后,再切换回去持仓页面,可以看到你的可用资金变少了。而在QMT和PTrade里面,却可能会表现得不一样。本文用代码和实盘来作对比。希望本文对量化新手有所帮助,记得收藏哦! 公众号首页链接了视频号,里面也有不少的新手入门教程和进阶教程,欢迎观看。
了解量化交易程序里面的资金更新速度,无论对量化T+0日内交易(可转债,T+0 ETF),还是轮动策略调仓,都是必须的。
Ptrade
以交易逆回购为例,这也便于量化新手也可以实践,可以放心跑,不会亏钱。
代码很简单,每个tick_data行情更新时间(3秒)里打印当前的可用资金。中途买入(借出)逆回购后,看看当面打印的可用资金什么时候发生变化。
import datetime
def initialize(context):
# 初始化策略
g.already_run = False
def handle_data(context, data):
pass
def get_available_cash(context):
# 读取变量protfolio里的可用资金的值
return context.portfolio.cash
def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')
def tick_data(context, data):
log.info('可用资金{}'.format(get_available_cash(context)))
if not g.already_run:
g.already_run = True
# 卖出100手 R-001
ret = order_tick('131810.SZ', -10, priceGear='1', limit_price=None)
def on_order_response(context, trade_list):
# 委托回调函数,有委托出现就调用此函数
log.info('已委托下单 {}'.format(current_time()))
放到Ptrade的实盘里执行,得到下面日志
下单前可用资金为17902,程序启动后下单时间在10:41:08,卖出10张R-001,市值1000元;间隔3s后打印可用资金,在10:41:13的时候,可用资金依然是17902,此时时间已经过去了5秒;
在10:41:18打印的时候资产才发生了变化,此时可用资金为16902,此时距离下单时的10:41:08,已经过去了10秒。所以如果在高频下单时,使用读取内置的context.portfolio.cash 来获取可用资金,那就寄了。那是不是意味着Ptrade无法进行高频率的交易了呢?当然不是的,此时可以使用内置的成交主推函数来更新可用资金,后面下面再介绍。
QMT
而qmt的代码如下,把打印的可用资金的操作放到handlebar里面,它和上面的Ptrade作用一样,每隔3s执行一次。
# encoding:gbk
import datetime
ACCOUNT = '你的账户ID'
start = True
def init(ContextInfo):
ContextInfo.set_account(ACCOUNT)
def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')
def get_available_cash(ContextInfo):
acct_info = get_trade_detail_data(ACCOUNT, 'stock', 'account')
return acct_info[0].m_dAvailable
def deal_callback(ContextInfo, dealInfo):
print('before')
print(dealInfo.m_strProductID)
print(dealInfo.m_nDirection)
print(dealInfo.m_dTradeAmount)
print(dealInfo.m_nVolume)
print(dealInfo.m_dPrice)
print('call back --- ')
print(current_time())
def buy_action(ContextInfo):
opType = 24
orderType = 1101
accountID = ACCOUNT
orderCode = '131810.SZ'
prType = 11
price = 1.8
volume = 10
quickTrade = 2
passorder(opType, orderType, accountID, orderCode, prType, price, volume, quickTrade, ContextInfo)
def handlebar(ContextInfo):
global start
if ContextInfo.is_last_bar():
cash = get_available_cash(ContextInfo)
print('{} 可用资金{}'.format(current_time(),cash))
if start:
print('下单逆回购 131810 ')
buy_action(ContextInfo)
start = False
部署到QMT实盘后,执行。
得到下面的运行日志:
从上面的日志看出,程序在14:35:11启动,马上使用passorder下单,卖出1000元的R-001,此时时间14:35:12,马上成交了。而可用资金在下单后的0.47秒后,14:35:12,显示少了1000元。此时的资金状态已经被更新了。
所以QMT的资金持仓更新速度要比Ptrade快出不少的,如果不是追求毫秒级别的话,这个速度足够满足大部分的轮动和T+0操作了。
虽然QMT的资金持仓更新很快,但如果你的策略是高频或偏高频运行,比如你这一个时刻刚刚买入,下一个tick来到时就要卖出,或者采用驱动成交型的网格交易,你无法知道挂单是在哪一个时刻成交的,此时也亦不能一直循环读取你的可以资金或者持仓来判断是否成交,因为这样会阻塞QMT无法进行下一步的操作(除非你本身就是一直在等待成交,成交后才进行下程序一步)。
委托、成交回调函数
Ptrade和QMT都有对应的委托成交回调函数,用于应对需要即时获取成交状态的情景下。
接口文档介绍如下
Ptrade http://ptradeapi.com/#on_trade_response
QMT:http://qmt.ptradeapi.com/QMT_Python_API_Doc.html#deal-callback
里面就说明了,“该函数会在成交主推回调时响应,比引擎和get_trades()函数更新Order状态的速度更快,适合对速度要求比较高的策略。”
Ptrade的部分代码片段如下:
# 交易回调
def on_trade_response(context, trade_list):
# 成交主推
now = context.blotter.current_dt.strftime("%H:%M:%S")
for trade_info in trade_list:
if trade_info['order_id'] == '':
# 不是本策略跳过
log.info('非本策略订单')
continue
code = trade_info['stock_code']
code = post_fix_convert(code)
business_time = trade_info['business_time']
business_amount = trade_info['business_amount'] # 这个是负数,如果卖出
business_price = trade_info['business_price']
g.total_cash -= business_amount # 马上更新资金状态
g.total_cash -= business_amount # 马上更新资金状态g.total_cash是一个全局的可用资金, 可以提前设定好,亦可以是开盘前读取一次你的账户可用资金。
每次成交的那一刻,on_trade_response这个函数就会被动触发,在这里就可以简单的更新你的资金状态了。上面的例子是最基础的更新资金。
实际可以使用其他的诸如dict或类对象来更新仓位。
上面代码是把仓位更新放到一个全局dict里面,key是股票代码,value也是一个dict,里面包含交易时间,持仓数目,价格等等。
好了,时间有限,今天的教程就到这里了,码字不易,欢迎点赞+收藏哦~
查看全部
平时在手动交易中,下单委托后,再切换回去持仓页面,可以看到你的可用资金变少了。而在QMT和PTrade里面,却可能会表现得不一样。本文用代码和实盘来作对比。希望本文对量化新手有所帮助,记得收藏哦! 公众号首页链接了视频号,里面也有不少的新手入门教程和进阶教程,欢迎观看。
了解量化交易程序里面的资金更新速度,无论对量化T+0日内交易(可转债,T+0 ETF),还是轮动策略调仓,都是必须的。
Ptrade
以交易逆回购为例,这也便于量化新手也可以实践,可以放心跑,不会亏钱。
代码很简单,每个tick_data行情更新时间(3秒)里打印当前的可用资金。中途买入(借出)逆回购后,看看当面打印的可用资金什么时候发生变化。
import datetime
def initialize(context):
# 初始化策略
g.already_run = False
def handle_data(context, data):
pass
def get_available_cash(context):
# 读取变量protfolio里的可用资金的值
return context.portfolio.cash
def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')
def tick_data(context, data):
log.info('可用资金{}'.format(get_available_cash(context)))
if not g.already_run:
g.already_run = True
# 卖出100手 R-001
ret = order_tick('131810.SZ', -10, priceGear='1', limit_price=None)
def on_order_response(context, trade_list):
# 委托回调函数,有委托出现就调用此函数
log.info('已委托下单 {}'.format(current_time()))
放到Ptrade的实盘里执行,得到下面日志
下单前可用资金为17902,程序启动后下单时间在10:41:08,卖出10张R-001,市值1000元;间隔3s后打印可用资金,在10:41:13的时候,可用资金依然是17902,此时时间已经过去了5秒;
在10:41:18打印的时候资产才发生了变化,此时可用资金为16902,此时距离下单时的10:41:08,已经过去了10秒。所以如果在高频下单时,使用读取内置的context.portfolio.cash 来获取可用资金,那就寄了。那是不是意味着Ptrade无法进行高频率的交易了呢?当然不是的,此时可以使用内置的成交主推函数来更新可用资金,后面下面再介绍。
QMT
而qmt的代码如下,把打印的可用资金的操作放到handlebar里面,它和上面的Ptrade作用一样,每隔3s执行一次。
# encoding:gbk
import datetime
ACCOUNT = '你的账户ID'
start = True
def init(ContextInfo):
ContextInfo.set_account(ACCOUNT)
def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')
def get_available_cash(ContextInfo):
acct_info = get_trade_detail_data(ACCOUNT, 'stock', 'account')
return acct_info[0].m_dAvailable
def deal_callback(ContextInfo, dealInfo):
print('before')
print(dealInfo.m_strProductID)
print(dealInfo.m_nDirection)
print(dealInfo.m_dTradeAmount)
print(dealInfo.m_nVolume)
print(dealInfo.m_dPrice)
print('call back --- ')
print(current_time())
def buy_action(ContextInfo):
opType = 24
orderType = 1101
accountID = ACCOUNT
orderCode = '131810.SZ'
prType = 11
price = 1.8
volume = 10
quickTrade = 2
passorder(opType, orderType, accountID, orderCode, prType, price, volume, quickTrade, ContextInfo)
def handlebar(ContextInfo):
global start
if ContextInfo.is_last_bar():
cash = get_available_cash(ContextInfo)
print('{} 可用资金{}'.format(current_time(),cash))
if start:
print('下单逆回购 131810 ')
buy_action(ContextInfo)
start = False
部署到QMT实盘后,执行。
得到下面的运行日志:
从上面的日志看出,程序在14:35:11启动,马上使用passorder下单,卖出1000元的R-001,此时时间14:35:12,马上成交了。而可用资金在下单后的0.47秒后,14:35:12,显示少了1000元。此时的资金状态已经被更新了。
所以QMT的资金持仓更新速度要比Ptrade快出不少的,如果不是追求毫秒级别的话,这个速度足够满足大部分的轮动和T+0操作了。
虽然QMT的资金持仓更新很快,但如果你的策略是高频或偏高频运行,比如你这一个时刻刚刚买入,下一个tick来到时就要卖出,或者采用驱动成交型的网格交易,你无法知道挂单是在哪一个时刻成交的,此时也亦不能一直循环读取你的可以资金或者持仓来判断是否成交,因为这样会阻塞QMT无法进行下一步的操作(除非你本身就是一直在等待成交,成交后才进行下程序一步)。
委托、成交回调函数
Ptrade和QMT都有对应的委托成交回调函数,用于应对需要即时获取成交状态的情景下。
接口文档介绍如下
Ptrade http://ptradeapi.com/#on_trade_response
QMT:http://qmt.ptradeapi.com/QMT_Python_API_Doc.html#deal-callback
里面就说明了,“该函数会在成交主推回调时响应,比引擎和get_trades()函数更新Order状态的速度更快,适合对速度要求比较高的策略。”
Ptrade的部分代码片段如下:
# 交易回调
def on_trade_response(context, trade_list):
# 成交主推
now = context.blotter.current_dt.strftime("%H:%M:%S")
for trade_info in trade_list:
if trade_info['order_id'] == '':
# 不是本策略跳过
log.info('非本策略订单')
continue
code = trade_info['stock_code']
code = post_fix_convert(code)
business_time = trade_info['business_time']
business_amount = trade_info['business_amount'] # 这个是负数,如果卖出
business_price = trade_info['business_price']
g.total_cash -= business_amount # 马上更新资金状态
g.total_cash -= business_amount # 马上更新资金状态g.total_cash是一个全局的可用资金, 可以提前设定好,亦可以是开盘前读取一次你的账户可用资金。
每次成交的那一刻,on_trade_response这个函数就会被动触发,在这里就可以简单的更新你的资金状态了。上面的例子是最基础的更新资金。
实际可以使用其他的诸如dict或类对象来更新仓位。
上面代码是把仓位更新放到一个全局dict里面,key是股票代码,value也是一个dict,里面包含交易时间,持仓数目,价格等等。
好了,时间有限,今天的教程就到这里了,码字不易,欢迎点赞+收藏哦~