本地部署deepseek的api,用于vs code cline,但无法项目自动创建文件

虽然会有内容提示:

20250213120820.png

 
但无法生成文件,
其实是无法理解命令输出
 具体错误提示如下:
Cline is having trouble...
Cline uses complex prompts and iterative task execution that may be challenging for less capable models. For best results, it's recommended to use Claude 3.5 Sonnet for its advanced agentic coding capabilities.

其实是模型不支持,需要用tool use类的模型。
比如:deepseek-r1-coder-tools:32b
 
地址:https://ollama.com/ishumilin/deepseek-r1-coder-tools:32b
 
然后就正常了。
 
 
 
 
继续阅读 »
虽然会有内容提示:

20250213120820.png

 
但无法生成文件,
其实是无法理解命令输出
 具体错误提示如下:
Cline is having trouble...
Cline uses complex prompts and iterative task execution that may be challenging for less capable models. For best results, it's recommended to use Claude 3.5 Sonnet for its advanced agentic coding capabilities.

其实是模型不支持,需要用tool use类的模型。
比如:deepseek-r1-coder-tools:32b
 
地址:https://ollama.com/ishumilin/deepseek-r1-coder-tools:32b
 
然后就正常了。
 
 
 
  收起阅读 »

江海证券支持QMT,miniQMT,且低门槛开通

最近新推出的支持QMT,miniQMT的券商,江海证券。


江海证券有限公司于2003年12月15日在哈尔滨市市场监督管理局登记成立。法定代表人孙名扬,公司经营范围包括证券经纪,证券承销与保荐,证券投资咨询,证券自营等。



20250212004427.jpg

 
这logo看起来有点像银河呢。
 
江海证券现有分支机构75家,其中17家分公司,58家营业部,遍布北京、上海、广州、深圳、厦门、青岛、大连、成都、武汉、长沙、合肥及黑龙江省内等主要城市,形成了“覆盖龙江、辐射沿海、布局全国”的业务发展格局。
 
不过上面的是2018年的数据,最新的可能会少一些。因为现在很多营业部都更加注重线上业务。也就是通过线上就可以开通账号。
 

 
目前江海证券能够开通量化QMT,和miniQMT的自动化交易权限。

20250212004842.png

 
 
下载地址:

江海证券QMT实盘_实盘_1.0.0.36190.exe
 
或者直接到官网:
https://www.jhzq.com.cn/main/home/software/index.shtml
选择QMT下载即可
 
江海证券也支持无限易量化平台。

需要的可以咨询公众号:
继续阅读 »
最近新推出的支持QMT,miniQMT的券商,江海证券。


江海证券有限公司于2003年12月15日在哈尔滨市市场监督管理局登记成立。法定代表人孙名扬,公司经营范围包括证券经纪,证券承销与保荐,证券投资咨询,证券自营等。



20250212004427.jpg

 
这logo看起来有点像银河呢。
 
江海证券现有分支机构75家,其中17家分公司,58家营业部,遍布北京、上海、广州、深圳、厦门、青岛、大连、成都、武汉、长沙、合肥及黑龙江省内等主要城市,形成了“覆盖龙江、辐射沿海、布局全国”的业务发展格局。
 
不过上面的是2018年的数据,最新的可能会少一些。因为现在很多营业部都更加注重线上业务。也就是通过线上就可以开通账号。
 

 
目前江海证券能够开通量化QMT,和miniQMT的自动化交易权限。

20250212004842.png

 
 
下载地址:

江海证券QMT实盘_实盘_1.0.0.36190.exe
 
或者直接到官网:
https://www.jhzq.com.cn/main/home/software/index.shtml
选择QMT下载即可
 
江海证券也支持无限易量化平台。

需要的可以咨询公众号:
收起阅读 »

deepseek等一众AI预测港股古茗翻车

港股--古茗,申购之前用deepseek,kimi,chatgpt,元宝等AI平台问了一圈,结论都不建议申购。

今天暗盘交易,结果就打脸了,古茗在几个平台都是10%涨幅收盘的。

Screenshot_20250211-183413.png



投资里面涉及到各种的因子,包括情绪,有的因子是我们事后才感知的,
 
而AI事前并不能完全感知所以因素,如当前打新行情火热,AI并没有考虑此因子,只是考虑了基石投资者,保荐机构,横向对比同行业的奈雪,茶百道等同行,推断出此次不值得申购。


投资是一群人的博弈游戏,如果根据AI平台得出的意见想法都趋同一致,
 
对于同一标的都看好,或者都不看好,大家都去追捧,可能会被顶到涨停;大家都抛弃,可能没有买量躺在跌停板。

显然,AI时代,需要投资者更异于常人的逆向思维能力。
继续阅读 »
港股--古茗,申购之前用deepseek,kimi,chatgpt,元宝等AI平台问了一圈,结论都不建议申购。

今天暗盘交易,结果就打脸了,古茗在几个平台都是10%涨幅收盘的。

Screenshot_20250211-183413.png



投资里面涉及到各种的因子,包括情绪,有的因子是我们事后才感知的,
 
而AI事前并不能完全感知所以因素,如当前打新行情火热,AI并没有考虑此因子,只是考虑了基石投资者,保荐机构,横向对比同行业的奈雪,茶百道等同行,推断出此次不值得申购。


投资是一群人的博弈游戏,如果根据AI平台得出的意见想法都趋同一致,
 
对于同一标的都看好,或者都不看好,大家都去追捧,可能会被顶到涨停;大家都抛弃,可能没有买量躺在跌停板。

显然,AI时代,需要投资者更异于常人的逆向思维能力。 收起阅读 »

港股新股 古茗 是否申购,问一问deepseek, chatGPT-4o, kimi, 元宝AI,谁最厉害

Screenshot_20250206-003047_副本.png



古茗新股申购港股新股古茗4号开始申购。

古茗是行业领先、快速增长的中国现制饮品企业。按 2023 年的 GMV 及门店数量计,是中国最大的大众现制茶饮店品牌,也是全价格带下中国第二大现制茶饮品牌,市场份额约为 18%。

目前市场申购倍数为12倍,热度一般。

假设我们都是港股打新小白,零经验。那么我们来问问,目前市场几个主流的AI平台,对于这个新股,能否申购给出一个结论。

参赛选手有Deepseek-R1,chatGPT-4o,kimi,腾讯元宝AI

Deepseek-R1

首先是当下风头最热的Deepseek-R1

我们问的问题是:古茗IPO港股打新,要不要申购?

下面是它的分析结果:

20250206004029.png


Deepseek回答结果

20250206004056.png



20250206013632.png


Deepseek回答结论


最后它给出的结论是:

基本面稳健但估值偏高,短期上涨空间有限,需权衡市场情绪与风险。对于打新套利者,性价比不高;

chatGPT 4o

同样勾上搜索功能,使其可以分析当下的互联网实时内容。

20250206004134.png


chatgpt 4ochatGPT-4o的回复有点打太极的意思,“
 
是否申购古茗新股因根据您的风险承受能力与投资目标进行评估”,分析资料不如Deepseek丰富,最后的结论属于正确的废话,有点在应付敷衍我的意思。

kimi

刚开始出来的时候,kimi以其联网搜索分析功能著称,所以这里也试问一下,看看kimi的效果。

20250206005224.png


kimikimi分析过程也是很有条理,分别列出了有利因素和不利因素。

最后的结论是是偏向于谨慎对待,也就是不太建议大额资金去申购。

腾讯AI 元宝

在前面几个AI平台里面腾讯AI元宝的知名度最低。

不过考虑到腾讯系的AI平台,使用各大公众号自媒体的数据进行建模,语料会更为丰富一下,所以也纳入测试范围。

20250206005127.png


腾讯元宝

20250206005141.png


腾讯元宝它的分析过程没有Deepseek和kimi面面俱到,只分析了Deepseek和kimi里的某一部分因素。

最后它给出的结论也是:考虑到当前市场环境和古茗的具体情况,建议投资者谨慎申购。偏向于谨慎申购。



于是,笔者我看完上面的这些AI分析文章,觉得还是不申购这个古茗港股新股了。因为看完它们的描述,会发现奈雪,茶百道,这几家已经在港股上市的,无论上市首日还是后续的交易日,也都跌跌不休,更别说这个我没听过的古茗奶茶了….

比较出乎意外的是,chatGPT-4o的结果反而是这4个AI平台里最简陋,且信息量最低的,感慨..

仅从这次提问体验进行排序,deepseek > kimi > 元宝AI > chatGPT-4o
 
继续阅读 »
Screenshot_20250206-003047_副本.png



古茗新股申购港股新股古茗4号开始申购。

古茗是行业领先、快速增长的中国现制饮品企业。按 2023 年的 GMV 及门店数量计,是中国最大的大众现制茶饮店品牌,也是全价格带下中国第二大现制茶饮品牌,市场份额约为 18%。

目前市场申购倍数为12倍,热度一般。

假设我们都是港股打新小白,零经验。那么我们来问问,目前市场几个主流的AI平台,对于这个新股,能否申购给出一个结论。

参赛选手有Deepseek-R1,chatGPT-4o,kimi,腾讯元宝AI

Deepseek-R1

首先是当下风头最热的Deepseek-R1

我们问的问题是:古茗IPO港股打新,要不要申购?

下面是它的分析结果:

20250206004029.png


Deepseek回答结果

20250206004056.png



20250206013632.png


Deepseek回答结论


最后它给出的结论是:

基本面稳健但估值偏高,短期上涨空间有限,需权衡市场情绪与风险。对于打新套利者,性价比不高;

chatGPT 4o

同样勾上搜索功能,使其可以分析当下的互联网实时内容。

20250206004134.png


chatgpt 4ochatGPT-4o的回复有点打太极的意思,“
 
是否申购古茗新股因根据您的风险承受能力与投资目标进行评估”,分析资料不如Deepseek丰富,最后的结论属于正确的废话,有点在应付敷衍我的意思。

kimi

刚开始出来的时候,kimi以其联网搜索分析功能著称,所以这里也试问一下,看看kimi的效果。

20250206005224.png


kimikimi分析过程也是很有条理,分别列出了有利因素和不利因素。

最后的结论是是偏向于谨慎对待,也就是不太建议大额资金去申购。

腾讯AI 元宝

在前面几个AI平台里面腾讯AI元宝的知名度最低。

不过考虑到腾讯系的AI平台,使用各大公众号自媒体的数据进行建模,语料会更为丰富一下,所以也纳入测试范围。

20250206005127.png


腾讯元宝

20250206005141.png


腾讯元宝它的分析过程没有Deepseek和kimi面面俱到,只分析了Deepseek和kimi里的某一部分因素。

最后它给出的结论也是:考虑到当前市场环境和古茗的具体情况,建议投资者谨慎申购。偏向于谨慎申购。



于是,笔者我看完上面的这些AI分析文章,觉得还是不申购这个古茗港股新股了。因为看完它们的描述,会发现奈雪,茶百道,这几家已经在港股上市的,无论上市首日还是后续的交易日,也都跌跌不休,更别说这个我没听过的古茗奶茶了….

比较出乎意外的是,chatGPT-4o的结果反而是这4个AI平台里最简陋,且信息量最低的,感慨..

仅从这次提问体验进行排序,deepseek > kimi > 元宝AI > chatGPT-4o
 
收起阅读 »

聚宽打板策略代码转为ptrade代码

策略简述:
根据昨日涨停  或最近N天的股票出现连板的数量,然后选股。
高开X之后进入股票池。
然后加入均线,热度,板块等因子,盘中买入。

20250202174033.png

 
PS: 现在的ptrade回测速度是越来越慢的了。 估计是用户越来越多的缘故了。。。
比我刚开始用的那个时候,简直慢了有100倍.....
 

 
继续阅读 »
策略简述:
根据昨日涨停  或最近N天的股票出现连板的数量,然后选股。
高开X之后进入股票池。
然后加入均线,热度,板块等因子,盘中买入。

20250202174033.png

 
PS: 现在的ptrade回测速度是越来越慢的了。 估计是用户越来越多的缘故了。。。
比我刚开始用的那个时候,简直慢了有100倍.....
 

  收起阅读 »

ptrade一个策略里可以同时执行多少个run_daily?

ptrade里的run_daily 是一个定时函数,可以在交易日里指定时间运行你的函数和任务。
 
run_daily 可以在0-24小时都能够执行,并没有限制要求交易时间09:30到15:00.
 
因此如果需要执行集合竞价的部分,那么就需要用run_daily 去操作了。
 
比如开盘打新,尾盘逆回购,

20250117103204.png


 
而ptrade里面也对run_daily做了限制,就是一个策略里面同时只能设置5个run_daily
 
对于一般人而已,应该够用的了。如果不够,那么就用handle_data处理,也是可以。handle_data,里面可以加一个时间判断的语句,那么你可以一天在指定时间执行多少个任务都没有问题,随意突破5个。
 
 
更多技术问题,可以关注公众号:可转债量化分析
继续阅读 »
ptrade里的run_daily 是一个定时函数,可以在交易日里指定时间运行你的函数和任务。
 
run_daily 可以在0-24小时都能够执行,并没有限制要求交易时间09:30到15:00.
 
因此如果需要执行集合竞价的部分,那么就需要用run_daily 去操作了。
 
比如开盘打新,尾盘逆回购,

20250117103204.png


 
而ptrade里面也对run_daily做了限制,就是一个策略里面同时只能设置5个run_daily
 
对于一般人而已,应该够用的了。如果不够,那么就用handle_data处理,也是可以。handle_data,里面可以加一个时间判断的语句,那么你可以一天在指定时间执行多少个任务都没有问题,随意突破5个。
 
 
更多技术问题,可以关注公众号:可转债量化分析
收起阅读 »

不同券商的ptrade实盘客户端的回测时间

券商的模拟客户端在任何时间都可以回测。
 
而券商的实盘客户端的回测时间会有做限制。
 
1. 国金:实盘客户端不允许回测。
 
2. 国盛:实盘客户端回测时间为收盘后15:30之后
 
3. 湘财:实盘客户端回测时间为收盘后15:30之后
 
需要开通量化账号的读者朋友,可以关注公众号:
 

 
继续阅读 »
券商的模拟客户端在任何时间都可以回测。
 
而券商的实盘客户端的回测时间会有做限制。
 
1. 国金:实盘客户端不允许回测。
 
2. 国盛:实盘客户端回测时间为收盘后15:30之后
 
3. 湘财:实盘客户端回测时间为收盘后15:30之后
 
需要开通量化账号的读者朋友,可以关注公众号:
 

  收起阅读 »

python django3 跨域问题解决

一个旧的项目,本来用的MVC的模式,后面需要拆分,前端换成React,所以django部分就换成只有api,不负责渲染了。
 
然后react范围django api,会有跨域问题,所以需要额外配置一下。
 
网上很多教程都是基于最新的django4或者更新。
 
本文只针对django3 解决。
 
如果用的django3.10

需要对应的版本的cors库:

pip install django-cors-headers==3.10.0
不然大概率是装不上的。
 
然后在setting里面配置这个

CORS_ORIGIN_ALLOW_ALL = True

INSTALLED_APPS = [

'corsheaders',
]

MIDDLEWARE = [

'corsheaders.middleware.CorsMiddleware',
]

然后就OK了。
 
如果需要更加细致的配置,比如只要求某个IP的机子才能访问,或者只能某个GET方法运行跨域。
 
# 允许跨域源
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'*'
)

# 允许的请求方式
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)

# 允许的请求头
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
# 额外允许的请求头
'token',
)

就可以了
继续阅读 »
一个旧的项目,本来用的MVC的模式,后面需要拆分,前端换成React,所以django部分就换成只有api,不负责渲染了。
 
然后react范围django api,会有跨域问题,所以需要额外配置一下。
 
网上很多教程都是基于最新的django4或者更新。
 
本文只针对django3 解决。
 
如果用的django3.10

需要对应的版本的cors库:

pip install django-cors-headers==3.10.0
不然大概率是装不上的。
 
然后在setting里面配置这个

CORS_ORIGIN_ALLOW_ALL = True

INSTALLED_APPS = [

'corsheaders',
]

MIDDLEWARE = [

'corsheaders.middleware.CorsMiddleware',
]

然后就OK了。
 
如果需要更加细致的配置,比如只要求某个IP的机子才能访问,或者只能某个GET方法运行跨域。
 
# 允许跨域源
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'*'
)

# 允许的请求方式
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)

# 允许的请求头
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
# 额外允许的请求头
'token',
)

就可以了 收起阅读 »

ptrade上的get_cb_info函数无法使用

比如示例代码:
def initialize(context):
pass

def handle_data(context, data):
df = get_cb_info()
log.info(df)

最后跑出来的结果如下:
2024-11-20 10:22:00 - ERROR - 用户策略执行异常
2024-11-20 10:22:00 - ERROR - Exception: Traceback (most recent call last):
File /home/fly/sim_backtest/result/29fa7074-a6e6-11ef-b05b-c40778d9af27/user_strategy.py, line 6 in handle_data
df = get_cb_info()
--> data = BarDict(600570.SS)
--> context = <StrategyContext {'recorded_vars': {}, 'commission': <Commission {'cost': 0.0003, 'min_trade_cost': 5.0, 'tax': 0.001}>, 'blotter': <Blotter {'current_dt': date ...
NameError: name 'get_cb_info' is not defined

说明这个函数就根本没有做进去了。
 
目前我试的券商,国盛ptrade是无法使用的。
 
所以如果需要获取可转债的数据,需要自己写一个接口获取。我之前的很多文章里面也有写过类似的api接口。可以参考参考。
 

 
继续阅读 »
比如示例代码:
def initialize(context):
pass

def handle_data(context, data):
df = get_cb_info()
log.info(df)

最后跑出来的结果如下:
2024-11-20 10:22:00 - ERROR - 用户策略执行异常
2024-11-20 10:22:00 - ERROR - Exception: Traceback (most recent call last):
File /home/fly/sim_backtest/result/29fa7074-a6e6-11ef-b05b-c40778d9af27/user_strategy.py, line 6 in handle_data
df = get_cb_info()
--> data = BarDict(600570.SS)
--> context = <StrategyContext {'recorded_vars': {}, 'commission': <Commission {'cost': 0.0003, 'min_trade_cost': 5.0, 'tax': 0.001}>, 'blotter': <Blotter {'current_dt': date ...
NameError: name 'get_cb_info' is not defined

说明这个函数就根本没有做进去了。
 
目前我试的券商,国盛ptrade是无法使用的。
 
所以如果需要获取可转债的数据,需要自己写一个接口获取。我之前的很多文章里面也有写过类似的api接口。可以参考参考。
 

  收起阅读 »

QMT获取市场可转债代码

QMT
QMT本身内置的数据包含了可转债的代码,不需要额外通过外部网络获取。
 
#encoding:gbk

def init(ContextInfo):
pass

def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
print(ContextInfo.get_stock_list_in_sector('沪深转债', realtime))


20241114111109.png


欢迎关注公众号:可转债量化分析
继续阅读 »
QMT本身内置的数据包含了可转债的代码,不需要额外通过外部网络获取。
 
#encoding:gbk

def init(ContextInfo):
pass

def handlebar(ContextInfo):
index = ContextInfo.barpos
realtime = ContextInfo.get_bar_timetag(index)
print(ContextInfo.get_stock_list_in_sector('沪深转债', realtime))


20241114111109.png


欢迎关注公众号:可转债量化分析
收起阅读 »

ptrade:登录请求失败,服务器状态400

登录之后打开交易菜单,显示:
ptrade:登录请求失败,服务器状态400

20241111095840.png

用户数多,占用了资源多了,服务器没有扩容,导致资源不够用了。
 
周一一大早就崩了。
 
券商ptrade的运营工作人员只能重启。 但不增加资源,不优化隔离资源分配,一旦内存不够,cpu负载占满,全部人一起陪葬,这样好么?
 
 
继续阅读 »
登录之后打开交易菜单,显示:
ptrade:登录请求失败,服务器状态400

20241111095840.png

用户数多,占用了资源多了,服务器没有扩容,导致资源不够用了。
 
周一一大早就崩了。
 
券商ptrade的运营工作人员只能重启。 但不增加资源,不优化隔离资源分配,一旦内存不够,cpu负载占满,全部人一起陪葬,这样好么?
 
  收起阅读 »

特朗普和拜登在任期间,上证指数的涨幅是多少?

微信图片_20241106122226.jpg

 特朗普上一次在任期间,上证指数的点位:

2017-1-20 - 3123

2021-1-20 - 3583

涨幅为14.7%


而拜登在任期间,截至到今天为止:

2021-1-20 - 3583

2024-11-06 - 3392

涨幅为 -5.3%

#美国大选#
 
欢迎关注公众号:
继续阅读 »
微信图片_20241106122226.jpg

 特朗普上一次在任期间,上证指数的点位:

2017-1-20 - 3123

2021-1-20 - 3583

涨幅为14.7%


而拜登在任期间,截至到今天为止:

2021-1-20 - 3583

2024-11-06 - 3392

涨幅为 -5.3%

#美国大选#
 
欢迎关注公众号:
收起阅读 »

oracle免费主机 忘记用户账户和密码,没有ssh private key 怎么恢复登录?

笔者很久前申请了oracle的免费云主机,以前很好申请,一下子就过了。
现在已经很难申请到的了,且行且珍惜。
 
因为太久没有登录oracle的网站,导致账户邮箱都忘记了。不知道是不是被账户被清理了,还是什么原因了。
 
但云主机的实例还在的。
 
因为很早之前在本地的电脑上,我一直都是用本地的私钥自动登录的,也不需要用密码。
 
但,目前也只能在这个电脑上做到自动登录。
 
以前申请的private key也不知道放到哪里去了。
 
按照教程因为是 
 
ssh -i /path/to/your/private_key.key ubuntu@your_instance_public_ip
 
这样导进来的。
 
关键现在的private_key.key 文件不见了。。。
悲催
 
于是在本地可以登录oracle的主机上,先登录进去oracle主机上,进入 .ssh 目录,查看 里面的authorized_keys 文件,
里面有一条记录, 就是 但是记录的免密码登录的sha256的记录。
 
记住这个sha256的值,然后到本地的电脑上的.ssh 里面,找到对应 idXXXX 和 idXXXX.pub 里面的内容要和oracle主机上的sha256
 
如果找到了,那就恭喜你,你直接复制idXXXX 和 idXXXX.pub 到其他主机 的 .ssh/ 目录 上,然后直接ssh opc@IP,就可以不用任何密码登录oracle的主机了。实现多个本地主机连接到oracle的免费主机上了。
 
 
 
 
继续阅读 »
笔者很久前申请了oracle的免费云主机,以前很好申请,一下子就过了。
现在已经很难申请到的了,且行且珍惜。
 
因为太久没有登录oracle的网站,导致账户邮箱都忘记了。不知道是不是被账户被清理了,还是什么原因了。
 
但云主机的实例还在的。
 
因为很早之前在本地的电脑上,我一直都是用本地的私钥自动登录的,也不需要用密码。
 
但,目前也只能在这个电脑上做到自动登录。
 
以前申请的private key也不知道放到哪里去了。
 
按照教程因为是 
 
ssh -i /path/to/your/private_key.key ubuntu@your_instance_public_ip
 
这样导进来的。
 
关键现在的private_key.key 文件不见了。。。
悲催
 
于是在本地可以登录oracle的主机上,先登录进去oracle主机上,进入 .ssh 目录,查看 里面的authorized_keys 文件,
里面有一条记录, 就是 但是记录的免密码登录的sha256的记录。
 
记住这个sha256的值,然后到本地的电脑上的.ssh 里面,找到对应 idXXXX 和 idXXXX.pub 里面的内容要和oracle主机上的sha256
 
如果找到了,那就恭喜你,你直接复制idXXXX 和 idXXXX.pub 到其他主机 的 .ssh/ 目录 上,然后直接ssh opc@IP,就可以不用任何密码登录oracle的主机了。实现多个本地主机连接到oracle的免费主机上了。
 
 
 
  收起阅读 »

Ptrade获取历史涨停的股票|python代码

用当天的收盘价对比最高价,如果是相等的就是涨停。
下面的程序用于监控可转债的正股,在过去10天里是否出现涨停。
 
下面的ptrade的代码片段。需要完整代码,可关注公众号私信获取。
 
def hit_limit_recent():
# 选出最近N天正股有涨停的可转债
N =10
scale = 5
latest_price = 160
bond_name_dict, bond_zg_dict = get_all_bond_info(scale=scale,latest_price=latest_price)
zg_list = list(bond_zg_dict.values())
panel_info = get_history(N, frequency='1d', field=['close','high_limit'], security_list=zg_list, fq='pre', include=False, fill='nan')
df = panel_info.swapaxes("minor_axis", "items")
target_list = []
for code in zg_list:
stock_df = df[code]

hit_high = stock_df[stock_df['close']==stock_df['high_limit']]
if len(hit_high) > 0:
# print(hit_high.index)
target_list.append(code)

zz_target_list = []
for code,zg_code in bond_zg_dict.items():
if zg_code in target_list:
print(code, bond_name_dict[code])
zz_target_list.append(code)

return zz_target_list
当然,会有一个情形,就是实际最后是开板状态,但是收盘价格和涨停价格一样。
这种属于涨停开板状态,需要利用tick的委卖买来判断。
 
继续阅读 »
用当天的收盘价对比最高价,如果是相等的就是涨停。
下面的程序用于监控可转债的正股,在过去10天里是否出现涨停。
 
下面的ptrade的代码片段。需要完整代码,可关注公众号私信获取。
 
def hit_limit_recent():
# 选出最近N天正股有涨停的可转债
N =10
scale = 5
latest_price = 160
bond_name_dict, bond_zg_dict = get_all_bond_info(scale=scale,latest_price=latest_price)
zg_list = list(bond_zg_dict.values())
panel_info = get_history(N, frequency='1d', field=['close','high_limit'], security_list=zg_list, fq='pre', include=False, fill='nan')
df = panel_info.swapaxes("minor_axis", "items")
target_list = []
for code in zg_list:
stock_df = df[code]

hit_high = stock_df[stock_df['close']==stock_df['high_limit']]
if len(hit_high) > 0:
# print(hit_high.index)
target_list.append(code)

zz_target_list = []
for code,zg_code in bond_zg_dict.items():
if zg_code in target_list:
print(code, bond_name_dict[code])
zz_target_list.append(code)

return zz_target_list
当然,会有一个情形,就是实际最后是开板状态,但是收盘价格和涨停价格一样。
这种属于涨停开板状态,需要利用tick的委卖买来判断。
  收起阅读 »

可转债不下修名单 - 铁公鸡一览表

如果可转债公布了某个时间段内的不下修转股价,在溢价率很高的情况下,那么在该时间段内,其溢价率回归的办法只剩拉正股了,而在这上涨阶段中,站在概率面,持有转债的涨幅是会大幅低于正股的。

对于笔者而言,建仓标的会选择排除这些公告了不下修的转债,且对应的转股价值低于70-80的转债。

上市公司为何不下修转股价?

摘录网上比较官方的原因:

第一,下修转股价会稀释现有股东的股权,公司不希望现有股东权益被稀释,选择不下修转股价;

第二,公司可能有长期的战略规划,不希望因为短期的财务压力下修转股价而改变资本结构;

第三,下修转股价可能会被市场解读为公司财务状况不佳或未来盈利前景不明朗,公司为了避免这种负面反应而选择不下修转股价。

“上市公司选择不下修转股价,实际上也是在向市场传递公司对股价的信心。” 业内人士表示,公司不下修转股价,一方面说明公司现金流状况良好,有到期偿还负债的意愿;另一方面,公司可能认为当前的转股价已经反映了公司的合理价值,不需要通过下修来吸引投资者。

不下修转债数据更新至2024-10-30日晚。

文末附原始数据获取方法。

20241031152023.png


20241031152056.png


20241031152113.png


20241031152132.png



省略若干....

后台回复关键字:不下修列表202410 获取原始excel表格数据

因为文章更新并不频繁,微信并不会把最新的公众号文章及时推送在读者最新的列表中,可以将***公众号设为*****星标,这样就能第一时间收到笔者的最新文章啦。**

获取数据不易,喜欢本文的记得点“**赞”和“在看”哦,欢迎转载本文。**
 
继续阅读 »
如果可转债公布了某个时间段内的不下修转股价,在溢价率很高的情况下,那么在该时间段内,其溢价率回归的办法只剩拉正股了,而在这上涨阶段中,站在概率面,持有转债的涨幅是会大幅低于正股的。

对于笔者而言,建仓标的会选择排除这些公告了不下修的转债,且对应的转股价值低于70-80的转债。

上市公司为何不下修转股价?

摘录网上比较官方的原因:

第一,下修转股价会稀释现有股东的股权,公司不希望现有股东权益被稀释,选择不下修转股价;

第二,公司可能有长期的战略规划,不希望因为短期的财务压力下修转股价而改变资本结构;

第三,下修转股价可能会被市场解读为公司财务状况不佳或未来盈利前景不明朗,公司为了避免这种负面反应而选择不下修转股价。

“上市公司选择不下修转股价,实际上也是在向市场传递公司对股价的信心。” 业内人士表示,公司不下修转股价,一方面说明公司现金流状况良好,有到期偿还负债的意愿;另一方面,公司可能认为当前的转股价已经反映了公司的合理价值,不需要通过下修来吸引投资者。

不下修转债数据更新至2024-10-30日晚。

文末附原始数据获取方法。

20241031152023.png


20241031152056.png


20241031152113.png


20241031152132.png



省略若干....

后台回复关键字:不下修列表202410 获取原始excel表格数据

因为文章更新并不频繁,微信并不会把最新的公众号文章及时推送在读者最新的列表中,可以将***公众号设为*****星标,这样就能第一时间收到笔者的最新文章啦。**

获取数据不易,喜欢本文的记得点“**赞”和“在看”哦,欢迎转载本文。**
 
收起阅读 »

哪些股票突破了10月8日的最高点?

昨天的文章贴了可转债从10月8日高点到现在的涨跌情况。
 
本文继续贴一下股票从10月8日的最高,到目前的涨跌分布。

数据包含北交所数据。

20241024000500.png


当前价格相对10月8日高点,涨幅前面的基本是北交所,创业板的股票。天马新材涨幅高达284%,一路涨停板30%,45度角冲上来。

20241024002212.png


创业板的光智科技8连板,20%一个板,最终今天开板后又封住,录得相对8号高点到目前的涨幅为258%

20241024002326.png


这些不知名的股票,要么处于亏损状态,要么四五百的市盈率,日后大概率会遵循怎么上去就怎么下来的规律。

比如像下面跌幅榜排名前面的,从高点跌去80%的股票。

20241024001333.png


长联科技节前最后一天上市,上市当天就吸引了足够的关注,涨了足足17倍。打新中签者,一签浮盈17万。而节后第一天该股冲高回落,依然大涨收盘。

而该股后面就开启了暴跌模式。

跌到今天之后,相对高点跌幅达到81%。

20241024004105.png


10月8日高点下来的A股个股数据统计

20241024004435.png


平均跌幅为-8.73%,中位数跌幅为-11%。当天开盘前,散户幻觉认为牛市来了,股票高开后,肯定不能轻易被买到,纷纷挂高价,甚至涨停价。(当时氛围太火爆,当时我也有这种牛市冲冲冲的幻觉)

而截至昨日收盘价,依然有652只股票,突破了10月8日的最高点,相对10日8日的最高点获得了正涨幅,比例为12%,比例比转债的稍微大一些。

A股的股票看起来暴富机会比转债要大的多,但同样会伴随更大的概率,让你一贫如洗,盈亏同源。
 
继续阅读 »
昨天的文章贴了可转债从10月8日高点到现在的涨跌情况。
 
本文继续贴一下股票从10月8日的最高,到目前的涨跌分布。

数据包含北交所数据。

20241024000500.png


当前价格相对10月8日高点,涨幅前面的基本是北交所,创业板的股票。天马新材涨幅高达284%,一路涨停板30%,45度角冲上来。

20241024002212.png


创业板的光智科技8连板,20%一个板,最终今天开板后又封住,录得相对8号高点到目前的涨幅为258%

20241024002326.png


这些不知名的股票,要么处于亏损状态,要么四五百的市盈率,日后大概率会遵循怎么上去就怎么下来的规律。

比如像下面跌幅榜排名前面的,从高点跌去80%的股票。

20241024001333.png


长联科技节前最后一天上市,上市当天就吸引了足够的关注,涨了足足17倍。打新中签者,一签浮盈17万。而节后第一天该股冲高回落,依然大涨收盘。

而该股后面就开启了暴跌模式。

跌到今天之后,相对高点跌幅达到81%。

20241024004105.png


10月8日高点下来的A股个股数据统计

20241024004435.png


平均跌幅为-8.73%,中位数跌幅为-11%。当天开盘前,散户幻觉认为牛市来了,股票高开后,肯定不能轻易被买到,纷纷挂高价,甚至涨停价。(当时氛围太火爆,当时我也有这种牛市冲冲冲的幻觉)

而截至昨日收盘价,依然有652只股票,突破了10月8日的最高点,相对10日8日的最高点获得了正涨幅,比例为12%,比例比转债的稍微大一些。

A股的股票看起来暴富机会比转债要大的多,但同样会伴随更大的概率,让你一贫如洗,盈亏同源。
 
收起阅读 »

突破10月8日最高点的转债名单 | 高点回落幅度排行榜

倒后镜看10月8日之后的走势,开盘即高点的转债比比皆是,不少还是涨停价开盘。

20241023020919.png



开盘冲进去的散户被挂在光秃秃的大阴线的顶部。

但也有一些转债已经突破了10月8日高点。

本文简单罗列一下数据。需要原始数据的读者朋友可以公众号后台获取。

20241023003904.png


价格突破10月8日的可转债红相转债和城地转债相对8日的高点涨幅达到了50%以上,属于一波流涨停冲上去的。

不过整体只有22只突破了8日的高点,占比只有4%,大部分是低于8日的最高价。

涨幅倒序排序


20241023005404.png



跌幅榜跌幅榜排名下,比较惨的是证券类转债。

由于很多人因为国庆假期港股的券商板块暴涨,8日A股券商开盘出现涨停潮,正股,ETF涨停买不进,于是转向买入没有达到涨停的券商转债(因为转债人比较怂?)。结果截至22日的收盘价格,浙22转债高点下来跌了24%,财通转债高点跌了18%。

相对10月8日高点的涨跌分布统计如下:
 

20241023005452.png

 

统计分布最新转债价格相对8日的高点跌幅的中位数和平均值为 -6.x%,转债持有人的当前市值跟8日高点相比,平均少了6%+。

一天的冲高回落,并不影响整体趋势。9月30日的转债价格中位数为113.798, 而当前(10月22日收盘)转债价格中位数为115, 比节前还略有提升。

所以节前一直持有的转债人,而不是8日冲高进场的,相对于节前的市值,也是稳定提升的。


需要原始excel数据,可后台回复:10月8日回落
 
继续阅读 »
倒后镜看10月8日之后的走势,开盘即高点的转债比比皆是,不少还是涨停价开盘。

20241023020919.png



开盘冲进去的散户被挂在光秃秃的大阴线的顶部。

但也有一些转债已经突破了10月8日高点。

本文简单罗列一下数据。需要原始数据的读者朋友可以公众号后台获取。

20241023003904.png


价格突破10月8日的可转债红相转债和城地转债相对8日的高点涨幅达到了50%以上,属于一波流涨停冲上去的。

不过整体只有22只突破了8日的高点,占比只有4%,大部分是低于8日的最高价。

涨幅倒序排序


20241023005404.png



跌幅榜跌幅榜排名下,比较惨的是证券类转债。

由于很多人因为国庆假期港股的券商板块暴涨,8日A股券商开盘出现涨停潮,正股,ETF涨停买不进,于是转向买入没有达到涨停的券商转债(因为转债人比较怂?)。结果截至22日的收盘价格,浙22转债高点下来跌了24%,财通转债高点跌了18%。

相对10月8日高点的涨跌分布统计如下:
 

20241023005452.png

 

统计分布最新转债价格相对8日的高点跌幅的中位数和平均值为 -6.x%,转债持有人的当前市值跟8日高点相比,平均少了6%+。

一天的冲高回落,并不影响整体趋势。9月30日的转债价格中位数为113.798, 而当前(10月22日收盘)转债价格中位数为115, 比节前还略有提升。

所以节前一直持有的转债人,而不是8日冲高进场的,相对于节前的市值,也是稳定提升的。


需要原始excel数据,可后台回复:10月8日回落
 
收起阅读 »

可转债现金替代策略 | QMT | Ptrade

策略需求:
适合大资金,求稳。
 
挑选低价格的AAA可转债,比如 正股是 银行,高分红的国企股,比如 大秦铁路的转债,大秦转债等,且到期收益为正。作为标的池。
 
然后 先 在标的池里挑选出一个价格最低的转债,1/3 仓位 买入,其余仓位买入银华日利。
 
程序每分钟监控。或者不用那么频繁,可以设置每小时,每天都可以。
 
如果转债价格下跌了X,就卖出银华日利(1/10仓位),买入转债; (这里仓位随意举例)
 
如果转债价格上涨了Y,就卖出转债(1/5仓位),买入银华日利;(这里仓位随意举例)
 
一般AAA的大规模转债,其波动比较小,很少会遇到趋势上涨。 所以大部分的时间是做有波动的高抛低吸。
 
但,一旦遇到趋势上涨,或者突破,那么按照策略 会不断卖出转债;
 
一旦转债仓位为0,就可以在标的池买入另外一只标的(1/3仓位),从而继续下一轮的高抛低吸。
 
如果转债价格一直跌,但由于AAA的转债有保底,且有回售,转股,下修等各种手段,来兜底,
 
所以一般遇到跌幅行情,下跌不会超过10%,所以策略可以一直在卖出银华日利,买入转债;
 
如果中途,出现了其他好的标的,你需要手动交易,那么可以手动卖出银华日利或者可转债,腾出仓位,来操作。
 
也就是这个策略的可转债,纯粹当做现金来替代来使用。
 
接着就是使用QMT和Ptrade实现。
 
待续............
 

 
 
继续阅读 »
策略需求:
适合大资金,求稳。
 
挑选低价格的AAA可转债,比如 正股是 银行,高分红的国企股,比如 大秦铁路的转债,大秦转债等,且到期收益为正。作为标的池。
 
然后 先 在标的池里挑选出一个价格最低的转债,1/3 仓位 买入,其余仓位买入银华日利。
 
程序每分钟监控。或者不用那么频繁,可以设置每小时,每天都可以。
 
如果转债价格下跌了X,就卖出银华日利(1/10仓位),买入转债; (这里仓位随意举例)
 
如果转债价格上涨了Y,就卖出转债(1/5仓位),买入银华日利;(这里仓位随意举例)
 
一般AAA的大规模转债,其波动比较小,很少会遇到趋势上涨。 所以大部分的时间是做有波动的高抛低吸。
 
但,一旦遇到趋势上涨,或者突破,那么按照策略 会不断卖出转债;
 
一旦转债仓位为0,就可以在标的池买入另外一只标的(1/3仓位),从而继续下一轮的高抛低吸。
 
如果转债价格一直跌,但由于AAA的转债有保底,且有回售,转股,下修等各种手段,来兜底,
 
所以一般遇到跌幅行情,下跌不会超过10%,所以策略可以一直在卖出银华日利,买入转债;
 
如果中途,出现了其他好的标的,你需要手动交易,那么可以手动卖出银华日利或者可转债,腾出仓位,来操作。
 
也就是这个策略的可转债,纯粹当做现金来替代来使用。
 
接着就是使用QMT和Ptrade实现。
 
待续............
 

 
  收起阅读 »

LOF基金出现大量套利机会,微信发送套利提示机会

节前A股行情火爆,节中港股继续开市,港股行情火爆。

对于踏空的投资来说,简直比满仓套牢还难受。

虽然行情火爆,但头脑依然要保持清醒,不要看到什么热门就一股脑冲进去。

错误的方式,让你赚到了大钱,实际会后患无穷。

“有勇敢的飞行员,有年老的飞行员,但鲜有勇敢的年老飞行员"

行情爆发,大部分人连指数都追不上,所以索性直接打板指数。以至于各种指数10CM,甚至20CM。

Screenshot_2024_1005_171022.png

 
实际指数的成分股并没有出现全部涨停那么夸张。

所以这时出现不少溢价的LOF基金,基金价格高于其净值。于是就出现了套利的机会。


溢价率越高,其安全垫也就越高。对于当前空仓或者轻仓的投资者而言,是一个不错的介入机会。(具体套利操作就是,场内净值申购,T+2或者T+3到账后,场内现价卖出)


这里笔者根据之前的LOF监控程序,程序自动获取限购-溢价LOF基金套利,并推送到微信消息,获取了目前溢价率大于5%的LOF基金,然后按照其成交量从大到小排序,得到下表:
 
20241005170056.png

 
成交量越大的,说明该LOF越活跃,这样就不至于在套利大军进场的时候,承接不住,被砸到跌停出不去。

目前成交量最大的是中概互联LOF164906,成交量1.9亿。成交量最少的是鼎弘LOF167003,成交量只有4万块不到,即使有14%的溢价率的肉垫,但容量太少,随便一个大户砸下来就跌停了。

所以这里也建议要介入额投资者,不仅仅只看溢价率,同时也要关注成交量。


同时也要注意申购状态那一列,积极配置FOF和原油LOF易方达 目前处于暂停申购状态,也就是当前是无法进行套利的。

而恒生LOF 是限购状态,限购5000元,因为港股假期猛涨了一波,所以大概率这个基金周二开盘会直接顶住涨停的。该基金是深市基金,可以6+1拖拉机拉满。申购7户,35000元。




结合之前的程序,LOF溢价率监控+微信推送,可以做到收盘前推送数据:


Screenshot_2024_1005_173638.jpg



当然你用飞书,钉钉也行。如果要用微信,早期开通的api还能继续用,新开的就需要备案的服务器了,手续就麻烦一点。
 
广告时间:需要低佣免5开户的可以公众号菜单联系,支持Ptrade,QMT,miniQMT,套利拖拉机。
 
继续阅读 »
节前A股行情火爆,节中港股继续开市,港股行情火爆。

对于踏空的投资来说,简直比满仓套牢还难受。

虽然行情火爆,但头脑依然要保持清醒,不要看到什么热门就一股脑冲进去。

错误的方式,让你赚到了大钱,实际会后患无穷。

“有勇敢的飞行员,有年老的飞行员,但鲜有勇敢的年老飞行员"

行情爆发,大部分人连指数都追不上,所以索性直接打板指数。以至于各种指数10CM,甚至20CM。

Screenshot_2024_1005_171022.png

 
实际指数的成分股并没有出现全部涨停那么夸张。

所以这时出现不少溢价的LOF基金,基金价格高于其净值。于是就出现了套利的机会。


溢价率越高,其安全垫也就越高。对于当前空仓或者轻仓的投资者而言,是一个不错的介入机会。(具体套利操作就是,场内净值申购,T+2或者T+3到账后,场内现价卖出)


这里笔者根据之前的LOF监控程序,程序自动获取限购-溢价LOF基金套利,并推送到微信消息,获取了目前溢价率大于5%的LOF基金,然后按照其成交量从大到小排序,得到下表:
 
20241005170056.png

 
成交量越大的,说明该LOF越活跃,这样就不至于在套利大军进场的时候,承接不住,被砸到跌停出不去。

目前成交量最大的是中概互联LOF164906,成交量1.9亿。成交量最少的是鼎弘LOF167003,成交量只有4万块不到,即使有14%的溢价率的肉垫,但容量太少,随便一个大户砸下来就跌停了。

所以这里也建议要介入额投资者,不仅仅只看溢价率,同时也要关注成交量。


同时也要注意申购状态那一列,积极配置FOF和原油LOF易方达 目前处于暂停申购状态,也就是当前是无法进行套利的。

而恒生LOF 是限购状态,限购5000元,因为港股假期猛涨了一波,所以大概率这个基金周二开盘会直接顶住涨停的。该基金是深市基金,可以6+1拖拉机拉满。申购7户,35000元。




结合之前的程序,LOF溢价率监控+微信推送,可以做到收盘前推送数据:


Screenshot_2024_1005_173638.jpg



当然你用飞书,钉钉也行。如果要用微信,早期开通的api还能继续用,新开的就需要备案的服务器了,手续就麻烦一点。
 
广告时间:需要低佣免5开户的可以公众号菜单联系,支持Ptrade,QMT,miniQMT,套利拖拉机。
 
收起阅读 »

QMT获取不到行情,一般是什么原因?或者获取行情有中断的情况

8-9成原因是 因为你选择的行情服务器掉线了

20231120204016.png

 
或者你获取的5档tick行情,但是你的行情菜单那里,选择的是 最新价,这样你也是无法获取到 5档tick数据的。

20240929102328.png

 
然后还有一个问题,如果你用get_market_data 或者get_market_data_ex 这个函数,获取的股票数量很多(比如全市场的股票),那么第一次的启动数据会非常的慢,并且你的内存消耗非常大,整个QMT像死机了一样。
 
如何解决? 下回分解
 
继续阅读 »
8-9成原因是 因为你选择的行情服务器掉线了

20231120204016.png

 
或者你获取的5档tick行情,但是你的行情菜单那里,选择的是 最新价,这样你也是无法获取到 5档tick数据的。

20240929102328.png

 
然后还有一个问题,如果你用get_market_data 或者get_market_data_ex 这个函数,获取的股票数量很多(比如全市场的股票),那么第一次的启动数据会非常的慢,并且你的内存消耗非常大,整个QMT像死机了一样。
 
如何解决? 下回分解
 
收起阅读 »

Ptrade回测模式下获取实时的分钟数据:只能使用handle_data,数据不能用get_snapshot

好久没有使用Ptrade做分钟级别的回测了。
发现有点蛋疼,记录一下。
 
因为回测模式下,不能使用run_interval 函数;
 
而run_daily模式,只能在固定时间运行,无法分钟级别。
 
所以只能使用 handle_data
而在handle_data 里面获取当前的分钟价格数据,也无法使用 get_snapshot ,get_gear_price,函数。
 
所以只能使用handle_data(Context,data) 里面的data里。
 
而handle_data 里面的data数据,使用方法如下:

 


import datetime

target_list = [
'600000.SS',
'000333.SZ'
]

def execution(context, data):
now = context.current_dt.strftime('%H:%M')
for code in target_list:
tick_info = data[code]
price = tick_info['price']
print('now: {} code : {} price:{}'.format(now,code ,price))




# 标准
def initialize(context):
log.info("公众号:可转债量化分析 ---- start ----")


def handle_data(context, data):
execution(context, data)

 

获取数据结果:
2024-09-20 14:42:00 - INFO - now: 14:42 code : 000333.SZ price:66.22
2024-09-20 14:43:00 - INFO - now: 14:43 code : 000333.SZ price:66.26
2024-09-20 14:44:00 - INFO - now: 14:44 code : 000333.SZ price:66.19
2024-09-20 14:45:00 - INFO - now: 14:45 code : 000333.SZ price:66.2
2024-09-20 14:46:00 - INFO - now: 14:46 code : 000333.SZ price:66.19
2024-09-20 14:47:00 - INFO - now: 14:47 code : 000333.SZ price:66.18
2024-09-20 14:48:00 - INFO - now: 14:48 code : 000333.SZ price:66.14
2024-09-20 14:49:00 - INFO - now: 14:49 code : 000333.SZ price:66.25
2024-09-20 14:50:00 - INFO - now: 14:50 code : 000333.SZ price:66.19
2024-09-20 14:51:00 - INFO - now: 14:51 code : 000333.SZ price:66.18
2024-09-20 14:52:00 - INFO - now: 14:52 code : 000333.SZ price:66.19
2024-09-20 14:53:00 - INFO - now: 14:53 code : 000333.SZ price:66.2
2024-09-20 14:54:00 - INFO - now: 14:54 code : 000333.SZ price:66.19
2024-09-20 14:55:00 - INFO - now: 14:55 code : 000333.SZ price:66.25
2024-09-20 14:56:00 - INFO - now: 14:56 code : 000333.SZ price:66.27
2024-09-20 14:57:00 - INFO - now: 14:57 code : 000333.SZ price:66.28
2024-09-20 14:58:00 - INFO - now: 14:58 code : 000333.SZ price:66.28
2024-09-20 14:59:00 - INFO - now: 14:59 code : 000333.SZ price:66.28
2024-09-20 15:00:00 - INFO - now: 15:00 code : 000333.SZ price:66.06

 用同花顺,对了一下结果,是满足的了。
 

 
继续阅读 »
好久没有使用Ptrade做分钟级别的回测了。
发现有点蛋疼,记录一下。
 
因为回测模式下,不能使用run_interval 函数;
 
而run_daily模式,只能在固定时间运行,无法分钟级别。
 
所以只能使用 handle_data
而在handle_data 里面获取当前的分钟价格数据,也无法使用 get_snapshot ,get_gear_price,函数。
 
所以只能使用handle_data(Context,data) 里面的data里。
 
而handle_data 里面的data数据,使用方法如下:

 


import datetime

target_list = [
'600000.SS',
'000333.SZ'
]

def execution(context, data):
now = context.current_dt.strftime('%H:%M')
for code in target_list:
tick_info = data[code]
price = tick_info['price']
print('now: {} code : {} price:{}'.format(now,code ,price))




# 标准
def initialize(context):
log.info("公众号:可转债量化分析 ---- start ----")


def handle_data(context, data):
execution(context, data)

 

获取数据结果:
2024-09-20 14:42:00 - INFO - now: 14:42 code : 000333.SZ price:66.22
2024-09-20 14:43:00 - INFO - now: 14:43 code : 000333.SZ price:66.26
2024-09-20 14:44:00 - INFO - now: 14:44 code : 000333.SZ price:66.19
2024-09-20 14:45:00 - INFO - now: 14:45 code : 000333.SZ price:66.2
2024-09-20 14:46:00 - INFO - now: 14:46 code : 000333.SZ price:66.19
2024-09-20 14:47:00 - INFO - now: 14:47 code : 000333.SZ price:66.18
2024-09-20 14:48:00 - INFO - now: 14:48 code : 000333.SZ price:66.14
2024-09-20 14:49:00 - INFO - now: 14:49 code : 000333.SZ price:66.25
2024-09-20 14:50:00 - INFO - now: 14:50 code : 000333.SZ price:66.19
2024-09-20 14:51:00 - INFO - now: 14:51 code : 000333.SZ price:66.18
2024-09-20 14:52:00 - INFO - now: 14:52 code : 000333.SZ price:66.19
2024-09-20 14:53:00 - INFO - now: 14:53 code : 000333.SZ price:66.2
2024-09-20 14:54:00 - INFO - now: 14:54 code : 000333.SZ price:66.19
2024-09-20 14:55:00 - INFO - now: 14:55 code : 000333.SZ price:66.25
2024-09-20 14:56:00 - INFO - now: 14:56 code : 000333.SZ price:66.27
2024-09-20 14:57:00 - INFO - now: 14:57 code : 000333.SZ price:66.28
2024-09-20 14:58:00 - INFO - now: 14:58 code : 000333.SZ price:66.28
2024-09-20 14:59:00 - INFO - now: 14:59 code : 000333.SZ price:66.28
2024-09-20 15:00:00 - INFO - now: 15:00 code : 000333.SZ price:66.06

 用同花顺,对了一下结果,是满足的了。
 

  收起阅读 »

QMT的handlebar设置成一分钟周期的时候,运行是3秒一次的

QMT
平时很少用handlebar驱动。
 
刚好有个策略是一分钟周期运行的,所以就用了handle驱动。

20240913113955.png

 
 
结果发现,经常查询重复买入。
 
调试后发现,原来这个handlebar是3m触发一次的。
 
如果要一分钟运行一次,还是用
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)
 
INTERVAL_STRING 用1分钟表示。
 
示例代码:
一分钟打印当前时间:
 
# -*-coding:gbk-*-
# 作者公众号:可转债量化分析
import datetime
import json
import redis

####### 以下为固定配置,请勿随意修改 ##########
# 注意:程序需要在9:30前启动

START_TIME = '09:30' # 启动时间,可以修改为开盘任意时间9:30-14:57
STOCK_ACCOUNT = '' # 股票账户


INTERVAL_SECOND = 60 # 交易间隔
INTERVAL_STRING = "{}nSecond".format(INTERVAL_SECOND)

def today_date():
return datetime.datetime.now().strftime('%Y%m%d')


def init(ContextInfo):
now = datetime.datetime.now()
print('策略初始化 {}'.format(now))
now = datetime.datetime.now()
running_time = '{} {}'.format(today_date(), START_TIME)
print('策略初始化 {} , 程序启动时间 {}'.format(now, START_TIME))
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)



def handlebar(ContextInfo):
pass

def execution(ContextInfo):
if not ContextInfo.is_last_bar():
return
now = datetime.datetime.now()
print(now)


公众号:
继续阅读 »
平时很少用handlebar驱动。
 
刚好有个策略是一分钟周期运行的,所以就用了handle驱动。

20240913113955.png

 
 
结果发现,经常查询重复买入。
 
调试后发现,原来这个handlebar是3m触发一次的。
 
如果要一分钟运行一次,还是用
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)
 
INTERVAL_STRING 用1分钟表示。
 
示例代码:
一分钟打印当前时间:
 
# -*-coding:gbk-*-
# 作者公众号:可转债量化分析
import datetime
import json
import redis

####### 以下为固定配置,请勿随意修改 ##########
# 注意:程序需要在9:30前启动

START_TIME = '09:30' # 启动时间,可以修改为开盘任意时间9:30-14:57
STOCK_ACCOUNT = '' # 股票账户


INTERVAL_SECOND = 60 # 交易间隔
INTERVAL_STRING = "{}nSecond".format(INTERVAL_SECOND)

def today_date():
return datetime.datetime.now().strftime('%Y%m%d')


def init(ContextInfo):
now = datetime.datetime.now()
print('策略初始化 {}'.format(now))
now = datetime.datetime.now()
running_time = '{} {}'.format(today_date(), START_TIME)
print('策略初始化 {} , 程序启动时间 {}'.format(now, START_TIME))
ContextInfo.run_time("execution", INTERVAL_STRING, running_time)



def handlebar(ContextInfo):
pass

def execution(ContextInfo):
if not ContextInfo.is_last_bar():
return
now = datetime.datetime.now()
print(now)


公众号:
收起阅读 »

QMT/iQuant居然禁止redis获取股票行情数据,如何破解

QMT禁止redis获取股票行情数据,如何破解

因为QMT没有转债的规模,而国信iquant本身又把requests 库给封禁了,它无法通过requests 获取任何外部数据,比如访问东财,tushare都会提示访问超时。(后面发现它修改了requests的源码)

于是发现iquant的redis是内置库,不需要pip安装,所以第一时间就想到使用redis获取转债数据。

简单测试了一下,redis是可以获取数据的。比如随便丢一个字符到redis,然后QMT可以获取到这个字符数据

于是就把原来的策略里,使用requests 调用API的部分,改成redis。

可是运行后发现报错:


微信图片_20240910103921.jpg


2024-09-10 10:05:19,851 [INFO] [0x00000e24] [msg service] msg: 0C:\iquant\python\新建策略文件.py_SH00030021

DataError:Sensitive Data Detected, Forbidden!

报错信息说的很明显,敏感信息检测到,禁止!

居然对redis的数据进行检验,很明显这部分是QMT对redis的源码进行了修改。

于是根据报错的提示,找到 目录:

D:\tool\gjzq_qmt_simulation\bin.x64\Lib\site-packages\redis,下面的client.py

找到对应的行:


微信图片_20240910103929.png



的确有一个check_response 的函数用于检测 redis的内容,看正则表达式和变量命名(search_stock),类似股票代码的数据传输被阻止了,检测到之后直接raise Error,程序会停止的。

解决办法,也很简单,直接把这一段 代码删除就好了。

然后需要重启你的QMT,不然修改的代码不会生效。

然后重新运行的你的策略,发现一起正常了。
 
需要开通QMT和代写量化策略,可以关注公众号:
继续阅读 »
QMT禁止redis获取股票行情数据,如何破解

因为QMT没有转债的规模,而国信iquant本身又把requests 库给封禁了,它无法通过requests 获取任何外部数据,比如访问东财,tushare都会提示访问超时。(后面发现它修改了requests的源码)

于是发现iquant的redis是内置库,不需要pip安装,所以第一时间就想到使用redis获取转债数据。

简单测试了一下,redis是可以获取数据的。比如随便丢一个字符到redis,然后QMT可以获取到这个字符数据

于是就把原来的策略里,使用requests 调用API的部分,改成redis。

可是运行后发现报错:


微信图片_20240910103921.jpg


2024-09-10 10:05:19,851 [INFO] [0x00000e24] [msg service] msg: 0C:\iquant\python\新建策略文件.py_SH00030021

DataError:Sensitive Data Detected, Forbidden!

报错信息说的很明显,敏感信息检测到,禁止!

居然对redis的数据进行检验,很明显这部分是QMT对redis的源码进行了修改。

于是根据报错的提示,找到 目录:

D:\tool\gjzq_qmt_simulation\bin.x64\Lib\site-packages\redis,下面的client.py

找到对应的行:


微信图片_20240910103929.png



的确有一个check_response 的函数用于检测 redis的内容,看正则表达式和变量命名(search_stock),类似股票代码的数据传输被阻止了,检测到之后直接raise Error,程序会停止的。

解决办法,也很简单,直接把这一段 代码删除就好了。

然后需要重启你的QMT,不然修改的代码不会生效。

然后重新运行的你的策略,发现一起正常了。
 
需要开通QMT和代写量化策略,可以关注公众号:
收起阅读 »

低门槛入金2W开通QMT miniQMT,股票费率免5,0.1元起

QMT
实打实的低门槛,低佣券商,入金2W,开通QMT,miniQMT;
而且费率是直接可以调到 万0.754,免五,0.1元起。 简直比万一免五还要低!
 
目前属于活动期间才有的低费率。

大同证券.png


 
需要开户的,可以联系公众号,开户后有QMT技术支持交流群
 
######### 最新更新, 此券商活动已停止 #############
 
继续阅读 »
实打实的低门槛,低佣券商,入金2W,开通QMT,miniQMT;
而且费率是直接可以调到 万0.754,免五,0.1元起。 简直比万一免五还要低!
 
目前属于活动期间才有的低费率。

大同证券.png


 
需要开户的,可以联系公众号,开户后有QMT技术支持交流群
 
######### 最新更新, 此券商活动已停止 #############
 
收起阅读 »

国信iquant requests 爬虫 获取数据 还有使用 tushare,akshare 无法连接,提示超时

经过验证,比如把下面的代码放入到国信的iquant里运行
#encoding:gbk


import requests

def get_baidu():

url = 'https://www.baidu.com'
req = requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
print(req.text)

def init(ContextInfo):
get_baidu()

def handlebar(ContextInfo):
pass

会报错,同时访问baidu.com 超时:

微信图片_20240828141957.png

 
明显是国信的iquant内部设置了proxy,导致request出去的时候走了proxy。
 
所以连baidu都访问不了。
 
而tushare,akshare底层是周的爬虫 (requests), 所以对于iquant,底层走http requests的库,或者获取数据的手段是失效了的。
 
不过也有其他的手段可以实现获取外部数据。
 
笔者亲测了redis可以访问外部的redis数据库,为啥用redis,因为iquant没有内置pymysql,需要自己安装,客户也不懂怎么安装,(到iquant的安装文件路径下的python 包路径下,运行 pip install pymysq)
 
而iquant内置了redis 的库,所以可以直接import redis
 
redis测试代码:
def base_usage():
print('start')
r = RedisCls()
data = {'name': 'zhangsan', 'age': 18}
key = 'test_key'
r.push(key, json.dumps(data))
print('push')
print(r.delete('key')) # reutrn 1 if delete success, else return 0
start_time = time.time()
ret_data = r.pop(key)
end_time = time.time()
print('cost time: ', end_time - start_time)
print(ret_data)



base_usage()

上面的代码是正常运行,不报错,就说明正常的了。
PS: 
r = RedisCls() 只是封装了
r = redis.Redis 连接的ip和端口,密码 而已。
 
按照网上的redis连接教程使用就好了。
 

 
继续阅读 »
经过验证,比如把下面的代码放入到国信的iquant里运行
#encoding:gbk


import requests

def get_baidu():

url = 'https://www.baidu.com'
req = requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
print(req.text)

def init(ContextInfo):
get_baidu()

def handlebar(ContextInfo):
pass

会报错,同时访问baidu.com 超时:

微信图片_20240828141957.png

 
明显是国信的iquant内部设置了proxy,导致request出去的时候走了proxy。
 
所以连baidu都访问不了。
 
而tushare,akshare底层是周的爬虫 (requests), 所以对于iquant,底层走http requests的库,或者获取数据的手段是失效了的。
 
不过也有其他的手段可以实现获取外部数据。
 
笔者亲测了redis可以访问外部的redis数据库,为啥用redis,因为iquant没有内置pymysql,需要自己安装,客户也不懂怎么安装,(到iquant的安装文件路径下的python 包路径下,运行 pip install pymysq)
 
而iquant内置了redis 的库,所以可以直接import redis
 
redis测试代码:
def base_usage():
print('start')
r = RedisCls()
data = {'name': 'zhangsan', 'age': 18}
key = 'test_key'
r.push(key, json.dumps(data))
print('push')
print(r.delete('key')) # reutrn 1 if delete success, else return 0
start_time = time.time()
ret_data = r.pop(key)
end_time = time.time()
print('cost time: ', end_time - start_time)
print(ret_data)



base_usage()

上面的代码是正常运行,不报错,就说明正常的了。
PS: 
r = RedisCls() 只是封装了
r = redis.Redis 连接的ip和端口,密码 而已。
 
按照网上的redis连接教程使用就好了。
 

  收起阅读 »

QMT如何获取持仓成本 盈亏比例

QMT
比如多次买入一个股票,每次买入不同的数量,如果中间又有分红除权,虽然可以通过自己写一个计算函数记录,但是会非常复杂。
 
那么QMT有没有内置的可以获取持仓成本的函数呢?
 
 position 持仓对象 里面有一个字段:
 
m_dOpenPrice: 持仓成本
 
可以用来获取当前的持仓成本:
 
具体代码如下:
 
# encoding:gbk

ACCOUNT = 'xxxxxxx' # 填入你的QMT账户ID, 如果没有,可以联系我开通 QMT权限


def init(ContextInfo):
# hs300成分股中sh和sz市场各自流通市值最大的前3只股票
pass


def handlebar(ContextInfo):
# 计算当前主图的cci
position_info = get_trade_detail_data(ACCOUNT, 'stock', 'position')
for i in position_info:
print('股票', i.m_strInstrumentID, '持仓数',
i.m_nVolume, '持有成本', round(i.m_dOpenPrice, 2),
'持仓盈亏', round(i.m_dPositionProfit, 2),
'持仓盈亏比例', round(i.m_dProfitRate*100, 2)
)


 得到的输出结果:
 

20240825081954.png

 
扫码免费开通QMT:

 
继续阅读 »
比如多次买入一个股票,每次买入不同的数量,如果中间又有分红除权,虽然可以通过自己写一个计算函数记录,但是会非常复杂。
 
那么QMT有没有内置的可以获取持仓成本的函数呢?
 
 position 持仓对象 里面有一个字段:
 
m_dOpenPrice: 持仓成本
 
可以用来获取当前的持仓成本:
 
具体代码如下:
 
# encoding:gbk

ACCOUNT = 'xxxxxxx' # 填入你的QMT账户ID, 如果没有,可以联系我开通 QMT权限


def init(ContextInfo):
# hs300成分股中sh和sz市场各自流通市值最大的前3只股票
pass


def handlebar(ContextInfo):
# 计算当前主图的cci
position_info = get_trade_detail_data(ACCOUNT, 'stock', 'position')
for i in position_info:
print('股票', i.m_strInstrumentID, '持仓数',
i.m_nVolume, '持有成本', round(i.m_dOpenPrice, 2),
'持仓盈亏', round(i.m_dPositionProfit, 2),
'持仓盈亏比例', round(i.m_dProfitRate*100, 2)
)


 得到的输出结果:
 

20240825081954.png

 
扫码免费开通QMT:

  收起阅读 »

python Ptrade获取热门板块,连板股票 python代码

之前有人咨询,ptrade如何获取不同的概念板块个股。其实很容易,本身有获取板块信息的API函数:

Ptrade API文档:https://ptradeapi.com/#get_sort_msg


get_sort_msg – 获取板块、行业的涨幅排名
get_sort_msg(sort_type_grp=None, sort_field_name=None, sort_type=1, data_count=100)

 接口说明
 该接口用于获取板块、行业的涨幅排名。 ​
 参数 sort_type_grp: 板块或行业的代码(list[str]/str);
(暂时只支持XBHS.DY地域、XBHS.GN概念、XBHS.ZJHHY证监会行业、XBHS.ZS指数、XBHS.HY行业等)
 
示例代码:按概念板块涨幅倒序排名
import datetime
START_TIME = (datetime.datetime.now() + datetime.timedelta(minutes=1)).strftime('%H:%M')


def execution(context):
#获取XBHS.GN的概念排名信息
sort_data = get_sort_msg(sort_type_grp='XBHS.GN', sort_field_name='px_change_rate', sort_type=1, data_count=100)

for data in sort_data:
log.info('板块: {} '.format(data['prod_name']))
for sub_stock in data['rise_first_grp']:
log.info('{} 涨幅 :{}'.format(sub_stock['prod_name'],sub_stock['px_change_rate']))

log.info('\n')


def initialize(context):
# 初始化策略
run_daily(context, execution, time=START_TIME) # 扫描
log.info("公众号:可转债量化分析\n")

def handle_data(context, data):
pass

 
上面代码在ptrade启动后一分钟拿到结果。不限制要求开盘时间的。其实Ptrade可以在24小时任意时刻启动。


20240823123757.png



get_sort_msg 返回的数据结构体如下:


20240823123253.png



具体字段的含义:
prod_code: 行业代码(str:str);
prod_name: 行业名称(str:str);
hq_type_code: 行业板块代码(str:str);
time_stamp: 时间戳毫秒级(str:int);
trade_mins: 交易分钟数(str:int);
trade_status: 交易状态(str:str);
preclose_px: 昨日收盘价(str:float);
open_px: 今日开盘价(str:float);
last_px: 最新价(str:float);
high_px: 最高价(str:float);
low_px: 最低价(str:float);
wavg_px: 加权平均价(str:float);
business_amount: 总成交量(str:int);
business_balance: 总成交额(str:int);
px_change: 涨跌额(str:float);
amplitude: 振幅(str:int);
px_change_rate: 涨跌幅(str:float);
circulation_amount: 流通股本(str:int);
total_shares: 总股本(str:int);
market_value: 市值(str:int);
circulation_value: 流通市值(str:int);
vol_ratio: 量比(str:float);
shares_per_hand: 每手股数(str:int);
rise_count: 上涨家数(str:int);
fall_count: 下跌家数(str:int);
member_count: 成员个数(str:int);
rise_first_grp: 领涨股票(其包含以下五个字段)(str:list[dict{str:int,str:str,str:str,str:float,str:float},...]);
prod_code: 股票代码(str:str);
prod_name: 证券名称(str:str);
hq_type_code: 类型代码(str:str);
last_px: 最新价(str:float);
px_change_rate: 涨跌幅(str:float);
fall_first_grp: 领跌股票(其包含以下五个字段)(str:list[dict{str:int,str:str,str:str,str:float,str:float},...]);
prod_code: 股票代码(str:str);
prod_name: 证券名称(str:str);
hq_type_code: 类型代码(str:str);
last_px: 最新价(str:float);
px_change_rate: 涨跌幅(str:float);

 
这个返回数据是实时的,可以用来选股,选择热门股,热门板块,涨停板块,昨日涨停,昨日连板板块。

比如上面运行结果里就有 昨日连板的板块个股,有9个,在rise_first_grp 字段里面:


20240823124205.png



需要开通Ptrade的读者朋友可以后天联系哦,提供不同券商ptrade,低门槛,低费率,还有技术支持群!
 
继续阅读 »
之前有人咨询,ptrade如何获取不同的概念板块个股。其实很容易,本身有获取板块信息的API函数:

Ptrade API文档:https://ptradeapi.com/#get_sort_msg


get_sort_msg – 获取板块、行业的涨幅排名
get_sort_msg(sort_type_grp=None, sort_field_name=None, sort_type=1, data_count=100)

 接口说明
 该接口用于获取板块、行业的涨幅排名。 ​
 参数 sort_type_grp: 板块或行业的代码(list[str]/str);
(暂时只支持XBHS.DY地域、XBHS.GN概念、XBHS.ZJHHY证监会行业、XBHS.ZS指数、XBHS.HY行业等)
 
示例代码:按概念板块涨幅倒序排名
import datetime
START_TIME = (datetime.datetime.now() + datetime.timedelta(minutes=1)).strftime('%H:%M')


def execution(context):
#获取XBHS.GN的概念排名信息
sort_data = get_sort_msg(sort_type_grp='XBHS.GN', sort_field_name='px_change_rate', sort_type=1, data_count=100)

for data in sort_data:
log.info('板块: {} '.format(data['prod_name']))
for sub_stock in data['rise_first_grp']:
log.info('{} 涨幅 :{}'.format(sub_stock['prod_name'],sub_stock['px_change_rate']))

log.info('\n')


def initialize(context):
# 初始化策略
run_daily(context, execution, time=START_TIME) # 扫描
log.info("公众号:可转债量化分析\n")

def handle_data(context, data):
pass

 
上面代码在ptrade启动后一分钟拿到结果。不限制要求开盘时间的。其实Ptrade可以在24小时任意时刻启动。


20240823123757.png



get_sort_msg 返回的数据结构体如下:


20240823123253.png



具体字段的含义:
prod_code: 行业代码(str:str);
prod_name: 行业名称(str:str);
hq_type_code: 行业板块代码(str:str);
time_stamp: 时间戳毫秒级(str:int);
trade_mins: 交易分钟数(str:int);
trade_status: 交易状态(str:str);
preclose_px: 昨日收盘价(str:float);
open_px: 今日开盘价(str:float);
last_px: 最新价(str:float);
high_px: 最高价(str:float);
low_px: 最低价(str:float);
wavg_px: 加权平均价(str:float);
business_amount: 总成交量(str:int);
business_balance: 总成交额(str:int);
px_change: 涨跌额(str:float);
amplitude: 振幅(str:int);
px_change_rate: 涨跌幅(str:float);
circulation_amount: 流通股本(str:int);
total_shares: 总股本(str:int);
market_value: 市值(str:int);
circulation_value: 流通市值(str:int);
vol_ratio: 量比(str:float);
shares_per_hand: 每手股数(str:int);
rise_count: 上涨家数(str:int);
fall_count: 下跌家数(str:int);
member_count: 成员个数(str:int);
rise_first_grp: 领涨股票(其包含以下五个字段)(str:list[dict{str:int,str:str,str:str,str:float,str:float},...]);
prod_code: 股票代码(str:str);
prod_name: 证券名称(str:str);
hq_type_code: 类型代码(str:str);
last_px: 最新价(str:float);
px_change_rate: 涨跌幅(str:float);
fall_first_grp: 领跌股票(其包含以下五个字段)(str:list[dict{str:int,str:str,str:str,str:float,str:float},...]);
prod_code: 股票代码(str:str);
prod_name: 证券名称(str:str);
hq_type_code: 类型代码(str:str);
last_px: 最新价(str:float);
px_change_rate: 涨跌幅(str:float);

 
这个返回数据是实时的,可以用来选股,选择热门股,热门板块,涨停板块,昨日涨停,昨日连板板块。

比如上面运行结果里就有 昨日连板的板块个股,有9个,在rise_first_grp 字段里面:


20240823124205.png



需要开通Ptrade的读者朋友可以后天联系哦,提供不同券商ptrade,低门槛,低费率,还有技术支持群!
 
收起阅读 »

【保姆教程】使用ptrade做一个持仓监控提醒软件 (二)

接下来完成代码实现部分:
 
主要框架如下:
 
盘前我们先去读取数据库的数据:
 
格式很简单,就记录了代码和名字:

20240808135700.png

 

df = pd.read_sql('select * from tb_holding_stock_list', con=engine)
 
 
def initialize(context):
# 初始化策略
engine = DBSelector().get_engine()
df = pd.read_sql('select * from tb_holding_stock_list', con=engine)
df['code']=df['code'].astype(str)
result = {}
for index, row in df.iterrows():
code = add_code_postfix(row['code'])
result[code] = {'name': row['name'], 'source': row['source']}
g.holding_stock_dict = result
g.holding_stock_list = list(result.keys())
g.__cache = Cache()

run_interval(context, execution, seconds=INTERVAL) # 扫描


def handle_data(context, data):
pass


def tick_data(context, data):
pass

def before_trading_start(context, data):
'''
盘前
'''
if DEBUG:
log.info('盘前运行开始', str(context.blotter.current_dt))


def after_trading_end(context, data):
'''
盘后
'''
if DEBUG:
log.info('盘后时间 ', str(context.blotter.current_dt))

然后主要部分在 execution 这个监控函数这里。
 
def execution(context):
tick_info = get_snapshot(g.holding_stock_list)
for code, tick in tick_info.items():
px_change_rate = tick['px_change_rate']
if px_change_rate > abs(HIT_TARGET):
if g.__cache.check(code):
# 通知
name = g.holding_stock_dict.get(code)['name']
source = g.holding_stock_dict.get(code)['source']
msg = '{}-{} 涨幅-{},{}'.format(code,
name, px_change_rate, source)
send_message_via_wechat(msg)


send_message_via_wechat 这个函数是发送微信消息的。
 
然后基本完成了整体的代码编写,里面一些自定义的函数为了判断 下一次通知要等待多久。
 
因为不能因为同一个股票满足条件了,然后每隔3秒发一次微信消息。你手机会一直滴滴滴地响的。
 
而且很容易把其他刚出现的提示给覆盖了。
 

Screenshot_2024_0808_132624.jpg

 
【保姆教程】使用ptrade做一个持仓监控提醒软件 (一)
 
 
 
继续阅读 »
接下来完成代码实现部分:
 
主要框架如下:
 
盘前我们先去读取数据库的数据:
 
格式很简单,就记录了代码和名字:

20240808135700.png

 

df = pd.read_sql('select * from tb_holding_stock_list', con=engine)
 
 
def initialize(context):
# 初始化策略
engine = DBSelector().get_engine()
df = pd.read_sql('select * from tb_holding_stock_list', con=engine)
df['code']=df['code'].astype(str)
result = {}
for index, row in df.iterrows():
code = add_code_postfix(row['code'])
result[code] = {'name': row['name'], 'source': row['source']}
g.holding_stock_dict = result
g.holding_stock_list = list(result.keys())
g.__cache = Cache()

run_interval(context, execution, seconds=INTERVAL) # 扫描


def handle_data(context, data):
pass


def tick_data(context, data):
pass

def before_trading_start(context, data):
'''
盘前
'''
if DEBUG:
log.info('盘前运行开始', str(context.blotter.current_dt))


def after_trading_end(context, data):
'''
盘后
'''
if DEBUG:
log.info('盘后时间 ', str(context.blotter.current_dt))

然后主要部分在 execution 这个监控函数这里。
 
def execution(context):
tick_info = get_snapshot(g.holding_stock_list)
for code, tick in tick_info.items():
px_change_rate = tick['px_change_rate']
if px_change_rate > abs(HIT_TARGET):
if g.__cache.check(code):
# 通知
name = g.holding_stock_dict.get(code)['name']
source = g.holding_stock_dict.get(code)['source']
msg = '{}-{} 涨幅-{},{}'.format(code,
name, px_change_rate, source)
send_message_via_wechat(msg)


send_message_via_wechat 这个函数是发送微信消息的。
 
然后基本完成了整体的代码编写,里面一些自定义的函数为了判断 下一次通知要等待多久。
 
因为不能因为同一个股票满足条件了,然后每隔3秒发一次微信消息。你手机会一直滴滴滴地响的。
 
而且很容易把其他刚出现的提示给覆盖了。
 

Screenshot_2024_0808_132624.jpg

 
【保姆教程】使用ptrade做一个持仓监控提醒软件 (一)
 
 
  收起阅读 »

【保姆教程】使用ptrade做一个持仓监控提醒软件 (一)

背景:
因为有多个券商,比如银河,华宝,国金,国盛等。 而且也有家人的账户,可能一个银河就有5-6个账户。
所以如果持仓比较多的话,没有时间管得过来。 设置条件单比较繁琐,也不一定能管得过来。
 
要求:
把所有的持仓股Excel导出,输入的数据库(这里选择mysql),然后Ptrade读取了股票池,每隔3s扫描一次行情,如果遇到大涨或者大跌的个股,转债,ETF,就发送微信消息提醒(涨幅/跌幅大于7%)
 
这个是某个客户的简单需求。
 
后面就按照上面的需求做一个客户端,除了可以录入上述资料,还能提供web服务,输入,删除持仓股,做到实时更新。
 
最后提醒效果如下:

Screenshot_2024_0808_132624.jpg

国金QMT的字样,用来区分我这个标的是哪一个券商的持仓。比如 有可能是 家人1-银河,家人2-国盛,这样的哈
 
下一篇:
【保姆教程】使用ptrade做一个持仓监控提醒软件 (二)

欢迎关注公众号:可转债量化分析
继续阅读 »
背景:
因为有多个券商,比如银河,华宝,国金,国盛等。 而且也有家人的账户,可能一个银河就有5-6个账户。
所以如果持仓比较多的话,没有时间管得过来。 设置条件单比较繁琐,也不一定能管得过来。
 
要求:
把所有的持仓股Excel导出,输入的数据库(这里选择mysql),然后Ptrade读取了股票池,每隔3s扫描一次行情,如果遇到大涨或者大跌的个股,转债,ETF,就发送微信消息提醒(涨幅/跌幅大于7%)
 
这个是某个客户的简单需求。
 
后面就按照上面的需求做一个客户端,除了可以录入上述资料,还能提供web服务,输入,删除持仓股,做到实时更新。
 
最后提醒效果如下:

Screenshot_2024_0808_132624.jpg

国金QMT的字样,用来区分我这个标的是哪一个券商的持仓。比如 有可能是 家人1-银河,家人2-国盛,这样的哈
 
下一篇:
【保姆教程】使用ptrade做一个持仓监控提醒软件 (二)

欢迎关注公众号:可转债量化分析
收起阅读 »

python量化分析教程 | 最近几年A股养老基金整体盈亏情况分析

这几年A股股市走势有目共睹。跌的让人头晕目眩。

不仅是散户被深套,很多基金也都大幅亏损。甚至前阵子看到证券时报报道,养老目标基金都出现不是清盘的现象。

20240724203835.png



于是笔者好奇心驱使,想看看这些养老基金最近几年的盈利情况,会不会把长辈老人们的下半辈子养老金都亏空了。

作为一名授人以渔的公众号博主,不仅仅贴个收益率图出来这么简单的啦。如果只是想看数据,直接跳过前面的操作即可。

笔者手把手教大家做数据分析,学会后不仅仅只对养老基金这一类别的基金做分析,还可以对不同类型的基金做分析。

前提:电脑按照了python已经相关库(jupyter notebook,pandas,akshare)

数据源:天天基金网

打开东财的天天基金网(https://fund.eastmoney.com/),在基金搜索页面输入:养老

20240724201831.png


总共有515个与养老相关的公募基金。如果没显示全,点击下图里面的“点击展开更多”按钮


20240724205640.png



抓包就找到对应的URL地址了,如下:https://fundsuggest.eastmoney.com/FundSearch/api/FundSearchPageAPI.ashx?callback=jQuery18306906210160165065_1721823304653&m=1&key=养老&pageindex=0&pagesize=515&_=1721823360126 
 
如果你想分析其他类型的主题基金,只需要把上面的url里面的key=养老,换成其他的就可以了,比如 key=芯片

浏览器输入上面的URL就可以拿到数据了。

20240724201909.png



简单起见,我就不写爬取数据的代码,直接复制粘贴浏览器返回的内容就好了。

然后把前面起始的jQuery18306906210160165065_1721823304653( 和最后的括号去掉,就得到一个json数据了。
 
js_data = {
"ErrCode": 0,
"ErrMsg": "0",
"Datas": [
{
"_id": "001171",
"CODE": "001171",
"NAME": "工银养老产业股票A",
"STOCKMARKET": "",
"NEWTEXCH": ""
},
......... # 省略若干
]
}

 
(文末提供这个数据文件的获取方式)

接着写一个函数获取某个基金的当前收益率:目前就获取最近3年的收益率。
import akshare as ak

def get_fund_info(code,name):
fund_open_fund_info_em_df = ak.fund_open_fund_info_em(symbol=code, indicator="累计收益率走势",period="3年")
latest_perf = fund_open_fund_info_em_df.iloc[-1]['累计收益率']
return {'code':code,'profit':latest_perf,'name':name}

 
可以改动period='5年', ’10年‘,’成立以来',从而获取不同区间的收益率

接着把500多个基金遍历一遍就OK了。
fund_perf_list = []
for item in js_data['Datas']:
print('processing code {}'.format(item['CODE']))
try:
fund_perf_list.append(get_fund_info(item['CODE'],item['NAME']))
time.sleep(0.5)
except Exception as e:
print('error in processing code {}'.format(item['CODE']))
print(e)


20240725000417.png

 
 
然后去倒杯茶,慢慢等它跑完。

20240725000859.png



数据分析

把数据转为dataframe,按照收益率排名
import pandas as pd
df = pd.DataFrame(fund_perf_list)

rank_df = df.sort_values(by='profit')


20240725001101.png

 
 
也可以导出到excel
 
rank_df.to_excel('亏麻的养老基金.xlsx')


20240725001443.png

 
 
亏损最多的鹏华养老产业股票,最近3年亏损了-53%,不过它应该也不属于养老基金范畴,只是买的养老产业的股票。

而华夏养老2055五年持有混合(FOF)A 011745,这种才是标准的养老基金,这些养老基金大部分是FOF(它们持有标的是基金,而不是股票)


20240725002300.png


2021年成立,买入后还要锁定5年,期间不可卖出,老人们被套牢了也无法割肉了。成立以来亏损了-34%,近3年亏损了-41%。

于是笔者继续过滤一下,找出里面的全部FOF基金
 
fof_fund_df = rank_df[rank_df['name'].str.contains('FOF')]

 
 
得到下面的养老基金FOF全部数据


20240725003008.png




20240725003419.png



然后使用describe函数看看大体的涨跌幅情况:

20240725003134.png



总共有484个数据,平均涨幅为-8.38%

中位数是-6.13%。

涨幅最大的是4.85%,中欧预见平衡养老三年持有混合发起(FOF)Y

打开详情一看,原来是得益于成立得晚的缘故,而该基金是今年2月成立的。


20240725003530.png



最近3年沪深300指数跌了32%,而这个跌幅可以在485只养老基金里面排到了477名。聊以慰藉的是,绝大部分的养老基金在下跌行情下是跑赢了沪深300的。

绘制直方图

直方图可以一览数据得养老基金涨跌幅分布情况:
 
fof_fund_df.plot(kind='hist',bins=20,y='profit',width=2,grid=True)


output.png

 
从图可以看到,大部分养老基金的涨跌幅落在-20到0之间。
亏损达到-30%以上的其实也不是很多。
 
整体来说,养老基金FOF比买入主流宽基波动要小一些,但并非保本的理财工具,对于风险接受能力低的老一辈朋友,需要慎重考虑的。
 
原文数据可在公众号:
可转债量化分析
获取
 
继续阅读 »
这几年A股股市走势有目共睹。跌的让人头晕目眩。

不仅是散户被深套,很多基金也都大幅亏损。甚至前阵子看到证券时报报道,养老目标基金都出现不是清盘的现象。

20240724203835.png



于是笔者好奇心驱使,想看看这些养老基金最近几年的盈利情况,会不会把长辈老人们的下半辈子养老金都亏空了。

作为一名授人以渔的公众号博主,不仅仅贴个收益率图出来这么简单的啦。如果只是想看数据,直接跳过前面的操作即可。

笔者手把手教大家做数据分析,学会后不仅仅只对养老基金这一类别的基金做分析,还可以对不同类型的基金做分析。

前提:电脑按照了python已经相关库(jupyter notebook,pandas,akshare)

数据源:天天基金网

打开东财的天天基金网(https://fund.eastmoney.com/),在基金搜索页面输入:养老

20240724201831.png


总共有515个与养老相关的公募基金。如果没显示全,点击下图里面的“点击展开更多”按钮


20240724205640.png



抓包就找到对应的URL地址了,如下:https://fundsuggest.eastmoney.com/FundSearch/api/FundSearchPageAPI.ashx?callback=jQuery18306906210160165065_1721823304653&m=1&key=养老&pageindex=0&pagesize=515&_=1721823360126 
 
如果你想分析其他类型的主题基金,只需要把上面的url里面的key=养老,换成其他的就可以了,比如 key=芯片

浏览器输入上面的URL就可以拿到数据了。

20240724201909.png



简单起见,我就不写爬取数据的代码,直接复制粘贴浏览器返回的内容就好了。

然后把前面起始的jQuery18306906210160165065_1721823304653( 和最后的括号去掉,就得到一个json数据了。
 
js_data = {
"ErrCode": 0,
"ErrMsg": "0",
"Datas": [
{
"_id": "001171",
"CODE": "001171",
"NAME": "工银养老产业股票A",
"STOCKMARKET": "",
"NEWTEXCH": ""
},
......... # 省略若干
]
}

 
(文末提供这个数据文件的获取方式)

接着写一个函数获取某个基金的当前收益率:目前就获取最近3年的收益率。
import akshare as ak

def get_fund_info(code,name):
fund_open_fund_info_em_df = ak.fund_open_fund_info_em(symbol=code, indicator="累计收益率走势",period="3年")
latest_perf = fund_open_fund_info_em_df.iloc[-1]['累计收益率']
return {'code':code,'profit':latest_perf,'name':name}

 
可以改动period='5年', ’10年‘,’成立以来',从而获取不同区间的收益率

接着把500多个基金遍历一遍就OK了。
fund_perf_list = []
for item in js_data['Datas']:
print('processing code {}'.format(item['CODE']))
try:
fund_perf_list.append(get_fund_info(item['CODE'],item['NAME']))
time.sleep(0.5)
except Exception as e:
print('error in processing code {}'.format(item['CODE']))
print(e)


20240725000417.png

 
 
然后去倒杯茶,慢慢等它跑完。

20240725000859.png



数据分析

把数据转为dataframe,按照收益率排名
import pandas as pd
df = pd.DataFrame(fund_perf_list)

rank_df = df.sort_values(by='profit')


20240725001101.png

 
 
也可以导出到excel
 
rank_df.to_excel('亏麻的养老基金.xlsx')


20240725001443.png

 
 
亏损最多的鹏华养老产业股票,最近3年亏损了-53%,不过它应该也不属于养老基金范畴,只是买的养老产业的股票。

而华夏养老2055五年持有混合(FOF)A 011745,这种才是标准的养老基金,这些养老基金大部分是FOF(它们持有标的是基金,而不是股票)


20240725002300.png


2021年成立,买入后还要锁定5年,期间不可卖出,老人们被套牢了也无法割肉了。成立以来亏损了-34%,近3年亏损了-41%。

于是笔者继续过滤一下,找出里面的全部FOF基金
 
fof_fund_df = rank_df[rank_df['name'].str.contains('FOF')]

 
 
得到下面的养老基金FOF全部数据


20240725003008.png




20240725003419.png



然后使用describe函数看看大体的涨跌幅情况:

20240725003134.png



总共有484个数据,平均涨幅为-8.38%

中位数是-6.13%。

涨幅最大的是4.85%,中欧预见平衡养老三年持有混合发起(FOF)Y

打开详情一看,原来是得益于成立得晚的缘故,而该基金是今年2月成立的。


20240725003530.png



最近3年沪深300指数跌了32%,而这个跌幅可以在485只养老基金里面排到了477名。聊以慰藉的是,绝大部分的养老基金在下跌行情下是跑赢了沪深300的。

绘制直方图

直方图可以一览数据得养老基金涨跌幅分布情况:
 
fof_fund_df.plot(kind='hist',bins=20,y='profit',width=2,grid=True)


output.png

 
从图可以看到,大部分养老基金的涨跌幅落在-20到0之间。
亏损达到-30%以上的其实也不是很多。
 
整体来说,养老基金FOF比买入主流宽基波动要小一些,但并非保本的理财工具,对于风险接受能力低的老一辈朋友,需要慎重考虑的。
 
原文数据可在公众号:
可转债量化分析
获取
 
收起阅读 »