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比买入主流宽基波动要小一些,但并非保本的理财工具,对于风险接受能力低的老一辈朋友,需要慎重考虑的。
 
原文数据可在公众号:
可转债量化分析
获取
 
收起阅读 »

优矿的回测引擎运行在python2.7,汗

之前看到优矿的报错提示如下:

回测引擎运行在 Python2.7 之上,请您使用 Python2.7 的写法进行策略编写。
 
居然回测引擎还在2.7,怪不得目前性能比较拉跨了呢。。。
 
不过话说,自从它的可转债数据收费之后,我就一直没有再使用优矿进行回测了。
 
 
继续阅读 »
之前看到优矿的报错提示如下:

回测引擎运行在 Python2.7 之上,请您使用 Python2.7 的写法进行策略编写。
 
居然回测引擎还在2.7,怪不得目前性能比较拉跨了呢。。。
 
不过话说,自从它的可转债数据收费之后,我就一直没有再使用优矿进行回测了。
 
  收起阅读 »

vs code 插件推荐:标注某个代码位置,快速跳转回该位置

相信大部分会有这样的体验,在一个文件中,经常回修改某一个函数,比如A文件的B function。然后不断打开其他文件C,D,来回切换修改。
 
因为在修改的时候会在当前文件跳转到其他函数里面比如跳转到D function,又跳到F function。然后继续跳转到其他函数H function。
 
但是,后面如果要回去A 文件的B function,你就要点击回去A文件,然后再通过搜索A function名字,或者用滚动条一直滚动。
 
所以整个流程会很浪费时间。
 
vs code有个插件,叫做bookmarks。

20240720094900.png

 
就是为了解决上面的痛点。
 
只需要在你代码右键,选择 Bookmark,标注了。
 
该位置就会保存在 左侧的bookmark栏里。
 

20240720095022.png

 
后续你只需要点一下这个bookmark栏的这个地方,就会直接跳转到你标注的行的位置。
 
大大提升了效率!
 
插件地址:
https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks

 
 
继续阅读 »
相信大部分会有这样的体验,在一个文件中,经常回修改某一个函数,比如A文件的B function。然后不断打开其他文件C,D,来回切换修改。
 
因为在修改的时候会在当前文件跳转到其他函数里面比如跳转到D function,又跳到F function。然后继续跳转到其他函数H function。
 
但是,后面如果要回去A 文件的B function,你就要点击回去A文件,然后再通过搜索A function名字,或者用滚动条一直滚动。
 
所以整个流程会很浪费时间。
 
vs code有个插件,叫做bookmarks。

20240720094900.png

 
就是为了解决上面的痛点。
 
只需要在你代码右键,选择 Bookmark,标注了。
 
该位置就会保存在 左侧的bookmark栏里。
 

20240720095022.png

 
后续你只需要点一下这个bookmark栏的这个地方,就会直接跳转到你标注的行的位置。
 
大大提升了效率!
 
插件地址:
https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks

 
  收起阅读 »

百度站长助手现在对于没有备案得站点不提供sitemap提交了

在百度资源站得站点里面
 
会发现它得sitemap提交地址栏是灰色得,用户无法提交sitemap了。
 
如下图所示:

20240712161609.png

 
主要因为百度最近清理了一批老旧资源得站点。
 
尤其是哪些内容农场。
 
遇到那些没有备案得站点,更加是不给你 提交 sitemap了了。
 
每天提交sitemap得得配额是0。用户无法提交sitemap。
 
只能手动或者api提交。
 
所以只好写了个脚本自动提交了。
 
需要工具得也可以联系。也支持定制化,自动化。
 

20240712161949.png

 
 
继续阅读 »
在百度资源站得站点里面
 
会发现它得sitemap提交地址栏是灰色得,用户无法提交sitemap了。
 
如下图所示:

20240712161609.png

 
主要因为百度最近清理了一批老旧资源得站点。
 
尤其是哪些内容农场。
 
遇到那些没有备案得站点,更加是不给你 提交 sitemap了了。
 
每天提交sitemap得得配额是0。用户无法提交sitemap。
 
只能手动或者api提交。
 
所以只好写了个脚本自动提交了。
 
需要工具得也可以联系。也支持定制化,自动化。
 

20240712161949.png

 
  收起阅读 »

华宝证券 华宝期权宝 钱龙 客户端 无法下载的原因

本来想下载一个期权软件下来看看T型交易图。
 
结果在华宝的官网 找到下载链接,但一直报错:

20240705114345.png

 
似乎其他软件也是报错。
 
500报错,应该是服务器的原因。
 
然后把链接复制下来:
 
https://download.cnhbstock.com/download/qlqqb/qlqqbpc/qqbfz.exe
 
把链接的https 改成 http,
 
浏览器会提示:
您的连接不是私密连接
攻击者可能会试图从 139.224.24.109 窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情
NET::ERR_CERT_COMMON_NAME_INVALID
如果您想获得 Chrome 最高级别
然后点击继续访问

 
结果就可以下载啦。
 
说实话,华宝这技术的确不咋地。
 
这个问题居然没有反馈,没有人去修复吗?
 
 
继续阅读 »
本来想下载一个期权软件下来看看T型交易图。
 
结果在华宝的官网 找到下载链接,但一直报错:

20240705114345.png

 
似乎其他软件也是报错。
 
500报错,应该是服务器的原因。
 
然后把链接复制下来:
 
https://download.cnhbstock.com/download/qlqqb/qlqqbpc/qqbfz.exe
 
把链接的https 改成 http,
 
浏览器会提示:
您的连接不是私密连接
攻击者可能会试图从 139.224.24.109 窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情
NET::ERR_CERT_COMMON_NAME_INVALID
如果您想获得 Chrome 最高级别
然后点击继续访问

 
结果就可以下载啦。
 
说实话,华宝这技术的确不咋地。
 
这个问题居然没有反馈,没有人去修复吗?
 
  收起阅读 »

ptrade获取的历史数据最长到哪一年?ptrade如何获取上证指数

Ptrade获取日线,分钟线数据最长可以到2005年。
文档里面也有说明:
 


7、该接口只能获取2005年后的数据。



20240630134315.png

ptrade官网api接口文档:
https://ptradeapi.com/#
 
实测也是符合要求的:
 
ptrade如何获取上证指数, 代码是  000001.SS
test_data = data = get_price(security='000001.SS',start_date='20050201',end_date='20050630',frequency='1d')

ptrade获取上证指数2005年的数据:
 

20240630134443.png

 
需要低佣,低门槛开通ptrade的朋友,可以扫描关注关注号:
继续阅读 »
Ptrade获取日线,分钟线数据最长可以到2005年。
文档里面也有说明:
 


7、该接口只能获取2005年后的数据。



20240630134315.png

ptrade官网api接口文档:
https://ptradeapi.com/#
 
实测也是符合要求的:
 
ptrade如何获取上证指数, 代码是  000001.SS
test_data = data = get_price(security='000001.SS',start_date='20050201',end_date='20050630',frequency='1d')

ptrade获取上证指数2005年的数据:
 

20240630134443.png

 
需要低佣,低门槛开通ptrade的朋友,可以扫描关注关注号:
收起阅读 »

python自动生成网站sitemap.xml 代码

sitemap格式为:
 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/s ... gt%3B
<url>
<loc>http://30daydo.com/article/1</loc>
<mobile:mobile type="mobile"/>
<lastmod>2024-06-30</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
</urlset>

然后我们要做的就是拿到我们页面上所有的链接地址,填充到这里:
 
<url>
<loc>http://30daydo.com/article/1</loc>
<mobile:mobile type="mobile"/>
<lastmod>2024-06-30</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>

 只需要替换上面的http://30daydo.com/article/1 地址就可以了。这个你跟你的完整url规律生成,或者从数据库读取就好了。

20240630133150.png

 
然后生成一个文件,自动复制到文章目录就可以了。
 
完整源码:
https://github.com/Rockyzsu/sitemap_generator
 
欢迎star,有问题留言。
 
继续阅读 »
sitemap格式为:
 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/s ... gt%3B
<url>
<loc>http://30daydo.com/article/1</loc>
<mobile:mobile type="mobile"/>
<lastmod>2024-06-30</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>
</urlset>

然后我们要做的就是拿到我们页面上所有的链接地址,填充到这里:
 
<url>
<loc>http://30daydo.com/article/1</loc>
<mobile:mobile type="mobile"/>
<lastmod>2024-06-30</lastmod>
<changefreq>daily</changefreq>
<priority>0.8</priority>
</url>

 只需要替换上面的http://30daydo.com/article/1 地址就可以了。这个你跟你的完整url规律生成,或者从数据库读取就好了。

20240630133150.png

 
然后生成一个文件,自动复制到文章目录就可以了。
 
完整源码:
https://github.com/Rockyzsu/sitemap_generator
 
欢迎star,有问题留言。
  收起阅读 »

QMT获取持仓信息报错:AttributeError: 'NoneType' object has no attribute 'request_id'

QMT
这个是新手经常遇到的问题。读取持仓信息的时候报错:
代码如下:
 
 
原因就是不能init之前去读取
# encoding:gbk
'''
实盘可以执行
固定数量
'''
import datetime


ACCOUNT = ''


def init(ContextInfo):
ContextInfo.set_account(ACCOUNT)


def get_position_infos():
# 信用账户可用资金
position_infos = get_trade_detail_data(ACCOUNT, 'stock', 'position')


pos_dict={}
for pos in position_infos:
code = pos.m_strInstrumentID
if pos.m_nVolume > 0:
pos_dict[code] = pos.m_nVolume
return pos_dict

datax = get_position_infos() # 这里error

def handlebar(ContextInfo):
if ContextInfo.is_last_bar():
current = datetime.datetime.now().strftime('%H:%M:%S.%f')
print(datax)


datax = get_position_infos()  #这里error
这个函数再最开始的时候就被定义了。没有经过initial初始话函数,很多数据没有获取,从而导致的报错。
 欢迎关注交流

 
继续阅读 »
这个是新手经常遇到的问题。读取持仓信息的时候报错:
代码如下:
 
 
原因就是不能init之前去读取
# encoding:gbk
'''
实盘可以执行
固定数量
'''
import datetime


ACCOUNT = ''


def init(ContextInfo):
ContextInfo.set_account(ACCOUNT)


def get_position_infos():
# 信用账户可用资金
position_infos = get_trade_detail_data(ACCOUNT, 'stock', 'position')


pos_dict={}
for pos in position_infos:
code = pos.m_strInstrumentID
if pos.m_nVolume > 0:
pos_dict[code] = pos.m_nVolume
return pos_dict

datax = get_position_infos() # 这里error

def handlebar(ContextInfo):
if ContextInfo.is_last_bar():
current = datetime.datetime.now().strftime('%H:%M:%S.%f')
print(datax)


datax = get_position_infos()  #这里error
这个函数再最开始的时候就被定义了。没有经过initial初始话函数,很多数据没有获取,从而导致的报错。
 欢迎关注交流

  收起阅读 »

QMT股票两融对冲建仓实盘

QMT
为了避免速度过快造成价格波动,提供速度,数量,延时控制。

20240529111758.png

 
成交了多少量,就融券多少量。达到指标即可停止。
 
代写量化程序,可以关注公众号,后台联系。 价格比QMT官网低的多了。实战性选手,选过N多QMT,ptrade实盘代码。
 
继续阅读 »
为了避免速度过快造成价格波动,提供速度,数量,延时控制。

20240529111758.png

 
成交了多少量,就融券多少量。达到指标即可停止。
 
代写量化程序,可以关注公众号,后台联系。 价格比QMT官网低的多了。实战性选手,选过N多QMT,ptrade实盘代码。
 
收起阅读 »