百度英语中文语音识别为文字服务 python demo【使用requests重写官方demo】

 
官方使用的稍微底层的urllib写的,用过了requests库的人看着不习惯。故重写之,并做了封装。
官方demo:
https://github.com/Baidu-AIP/speech-demo
# -*- coding: utf-8 -*-
# @Time : 2021/4/24 20:50
# @File : baidu_voice_service.py
# @Author : Rocky C@www.30daydo.com

import os
import requests
import sys
import pickle
sys.path.append('..')
from config import API_KEY,SECRET_KEY
from base64 import b64encode
from pathlib import PurePath


BASE = PurePath(__file__).parent

# 需要识别的文件
AUDIO_FILE = r'C:\OtherGit\speech-demo\rest-api-asr\python\audio\2.m4a' # 只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式
# 文件格式
FORMAT = AUDIO_FILE[-3:] # 文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式

CUID = '24057753'
# 采样率
RATE = 16000 # 固定值


ASR_URL = 'http://vop.baidu.com/server_api'

#测试自训练平台需要打开以下信息, 自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234
'''
http://vop.baidu.com/server_api
1537 普通话(纯中文识别) 输入法模型 有标点 支持自定义词库
1737 英语 英语模型 无标点 不支持自定义词库
1637 粤语 粤语模型 有标点 不支持自定义词库
1837 四川话 四川话模型 有标点 不支持自定义词库
1936 普通话远场
'''
DEV_PID = 1737

SCOPE = 'brain_enhanced_asr' # 有此scope表示有asr能力,没有请在网页里开通极速版


class DemoError(Exception):
pass


TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'

def fetch_token():

params = {'grant_type': 'client_credentials',
'client_id': API_KEY,
'client_secret': SECRET_KEY}
r = requests.post(
url=TOKEN_URL,
data=params
)

result = r.json()
if ('access_token' in result.keys() and 'scope' in result.keys()):
if SCOPE and (not SCOPE in result['scope'].split(' ')): # SCOPE = False 忽略检查
raise DemoError('scope is not correct')

return result['access_token']

else:
raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')


""" TOKEN end """

def dump_token(token):
with open(os.path.join(BASE,'token.pkl'),'wb') as fp:
pickle.dump({'token':token},fp)

def load_token(filename):

if not os.path.exists(filename):
token=fetch_token()
dump_token(token)
return token
else:
with open(filename,'rb') as fp:
token = pickle.load(fp)
return token['token']

def recognize_service(token,filename):

with open(filename, 'rb') as speech_file:
speech_data = speech_file.read()

length = len(speech_data)
if length == 0:
raise DemoError('file %s length read 0 bytes' % AUDIO_FILE)

b64_data = b64encode(speech_data)
params = {'cuid': CUID, 'token': token, 'dev_pid': DEV_PID,'speech':b64_data,'len':length,'format':FORMAT,'rate':RATE,'channel':1}

headers = {
'Content-Type':'application/json',
}
r = requests.post(url=ASR_URL,json=params,headers=headers)
return r.json()


def main():
filename = 'token.pkl'
token = load_token(filename)
result = recognize_service(token,AUDIO_FILE)
print(result['result'])

if __name__ == '__main__':
main()



只需要替换自己的key就可以使用。
自己录了几段英文测试了下,还是蛮准的。
继续阅读 »
 
官方使用的稍微底层的urllib写的,用过了requests库的人看着不习惯。故重写之,并做了封装。
官方demo:
https://github.com/Baidu-AIP/speech-demo
# -*- coding: utf-8 -*-
# @Time : 2021/4/24 20:50
# @File : baidu_voice_service.py
# @Author : Rocky C@www.30daydo.com

import os
import requests
import sys
import pickle
sys.path.append('..')
from config import API_KEY,SECRET_KEY
from base64 import b64encode
from pathlib import PurePath


BASE = PurePath(__file__).parent

# 需要识别的文件
AUDIO_FILE = r'C:\OtherGit\speech-demo\rest-api-asr\python\audio\2.m4a' # 只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式
# 文件格式
FORMAT = AUDIO_FILE[-3:] # 文件后缀只支持 pcm/wav/amr 格式,极速版额外支持m4a 格式

CUID = '24057753'
# 采样率
RATE = 16000 # 固定值


ASR_URL = 'http://vop.baidu.com/server_api'

#测试自训练平台需要打开以下信息, 自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234
'''
http://vop.baidu.com/server_api
1537 普通话(纯中文识别) 输入法模型 有标点 支持自定义词库
1737 英语 英语模型 无标点 不支持自定义词库
1637 粤语 粤语模型 有标点 不支持自定义词库
1837 四川话 四川话模型 有标点 不支持自定义词库
1936 普通话远场
'''
DEV_PID = 1737

SCOPE = 'brain_enhanced_asr' # 有此scope表示有asr能力,没有请在网页里开通极速版


class DemoError(Exception):
pass


TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'

def fetch_token():

params = {'grant_type': 'client_credentials',
'client_id': API_KEY,
'client_secret': SECRET_KEY}
r = requests.post(
url=TOKEN_URL,
data=params
)

result = r.json()
if ('access_token' in result.keys() and 'scope' in result.keys()):
if SCOPE and (not SCOPE in result['scope'].split(' ')): # SCOPE = False 忽略检查
raise DemoError('scope is not correct')

return result['access_token']

else:
raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')


""" TOKEN end """

def dump_token(token):
with open(os.path.join(BASE,'token.pkl'),'wb') as fp:
pickle.dump({'token':token},fp)

def load_token(filename):

if not os.path.exists(filename):
token=fetch_token()
dump_token(token)
return token
else:
with open(filename,'rb') as fp:
token = pickle.load(fp)
return token['token']

def recognize_service(token,filename):

with open(filename, 'rb') as speech_file:
speech_data = speech_file.read()

length = len(speech_data)
if length == 0:
raise DemoError('file %s length read 0 bytes' % AUDIO_FILE)

b64_data = b64encode(speech_data)
params = {'cuid': CUID, 'token': token, 'dev_pid': DEV_PID,'speech':b64_data,'len':length,'format':FORMAT,'rate':RATE,'channel':1}

headers = {
'Content-Type':'application/json',
}
r = requests.post(url=ASR_URL,json=params,headers=headers)
return r.json()


def main():
filename = 'token.pkl'
token = load_token(filename)
result = recognize_service(token,AUDIO_FILE)
print(result['result'])

if __name__ == '__main__':
main()



只需要替换自己的key就可以使用。
自己录了几段英文测试了下,还是蛮准的。 收起阅读 »

银河证券拖拉机如何开通 一拖六 一拖七

首先你得先开通一个银河证券的账户,笔者这里目前开通的费率是股票万一免5,转债沪市百万分之五,深市十万分之五,基金申购打一折,基金买卖费率万0.5,没有最低5元限制。需要可以文末扫描开通。
 

IMG_20220530_174413.jpg


 
有了银河证券账户就就可以开通拖拉机了。
 
效果图如下:

mmexport9638d8867a13634bbc8d9979de1bc45e_1653706320148.png

选择场内基金

mmexport5675253283e5a950f062e8d9407812e8_1653706315625.png

选择基金申购! 不要选认购,不要选认购,不要选认购!

选择你要申购的标的代码,比如华宝油气,原油基金 折价品种。

拖拉机1.jpg


笔者公众号内有银河证券的autojs 拖拉机+多账户 自动申购脚本,自动卖出脚本
 
拖拉机开通很简单。
 
在首页点击开户:
Screenshot_2021_0425_110542.jpg

 
底下有个加挂户的,点击之

Screenshot_2021_0425_110611.jpg

然后填入相关的信息。
 
如果没有开过深基金户的,添加新加,如果已经开过的,那么只要把旧的深基金账户贴上去就可以。
新开的话,一天只能开一个,如果开多次,会提示已经有一个在办理中,继续加挂会有提示错误信息。
 
收益率,绝对值不高,但是单个标的的收益率绝对高的爆棚

mmexportc171ab7bad4935b43d603bcb1bc44719_1653706282257.jpeg


所以只是套一户的话,就没多大意思了。 不过银河就是可以一个账户开6个股东号,也就是以你一个人在限购的情况。所以如果限购500,那么如果一次循环套利收益率50%,250元,6个股东号,收益1500元。 然后把家人的身份证拿过来开了户,一个家庭6户,1500*6=9000元,所以理论套利下来,一个家庭收益率就有9000元,如果成员数更多,收益更多。 
 
所以这个套利的核心是一个支持 多开股东户的券商,且券商支持申购打折,(不打折的话一次套利会损失1%)多张身份证账户,笔者这里适合的银河券商,股票费率可以做到万一免五,申购一折。
 

扫描联系开户,备注:开户
非诚勿扰,墨迹勿扰。

继续阅读 »
首先你得先开通一个银河证券的账户,笔者这里目前开通的费率是股票万一免5,转债沪市百万分之五,深市十万分之五,基金申购打一折,基金买卖费率万0.5,没有最低5元限制。需要可以文末扫描开通。
 

IMG_20220530_174413.jpg


 
有了银河证券账户就就可以开通拖拉机了。
 
效果图如下:

mmexport9638d8867a13634bbc8d9979de1bc45e_1653706320148.png

选择场内基金

mmexport5675253283e5a950f062e8d9407812e8_1653706315625.png

选择基金申购! 不要选认购,不要选认购,不要选认购!

选择你要申购的标的代码,比如华宝油气,原油基金 折价品种。

拖拉机1.jpg


笔者公众号内有银河证券的autojs 拖拉机+多账户 自动申购脚本,自动卖出脚本
 
拖拉机开通很简单。
 
在首页点击开户:
Screenshot_2021_0425_110542.jpg

 
底下有个加挂户的,点击之

Screenshot_2021_0425_110611.jpg

然后填入相关的信息。
 
如果没有开过深基金户的,添加新加,如果已经开过的,那么只要把旧的深基金账户贴上去就可以。
新开的话,一天只能开一个,如果开多次,会提示已经有一个在办理中,继续加挂会有提示错误信息。
 
收益率,绝对值不高,但是单个标的的收益率绝对高的爆棚

mmexportc171ab7bad4935b43d603bcb1bc44719_1653706282257.jpeg


所以只是套一户的话,就没多大意思了。 不过银河就是可以一个账户开6个股东号,也就是以你一个人在限购的情况。所以如果限购500,那么如果一次循环套利收益率50%,250元,6个股东号,收益1500元。 然后把家人的身份证拿过来开了户,一个家庭6户,1500*6=9000元,所以理论套利下来,一个家庭收益率就有9000元,如果成员数更多,收益更多。 
 
所以这个套利的核心是一个支持 多开股东户的券商,且券商支持申购打折,(不打折的话一次套利会损失1%)多张身份证账户,笔者这里适合的银河券商,股票费率可以做到万一免五,申购一折。
 

扫描联系开户,备注:开户
非诚勿扰,墨迹勿扰。

收起阅读 »

川财证券 费率股票万一,转债百万分之二 费率最低 开户

支持同花顺,支持条件单。
 
因为是小券商,所以平时挂单速度的通道要比网红券商的营业部要快得多。
 
至于费率,也是目前市场最低。
 
费率:股票万一,转债(新规) 沪:十万分之四点四,深:十万分之八。
 
两融利率:默认5.99%,最低5.4%
 
基金ETF费率万0.5。
 

20210824171118.png




qAF2Py9qxD.png


感兴趣的读者朋友可以稍微下方二维码开户。备注:开户

继续阅读 »
支持同花顺,支持条件单。
 
因为是小券商,所以平时挂单速度的通道要比网红券商的营业部要快得多。
 
至于费率,也是目前市场最低。
 
费率:股票万一,转债(新规) 沪:十万分之四点四,深:十万分之八。
 
两融利率:默认5.99%,最低5.4%
 
基金ETF费率万0.5。
 

20210824171118.png




qAF2Py9qxD.png


感兴趣的读者朋友可以稍微下方二维码开户。备注:开户

收起阅读 »

基金常见误区

1. C类规模一定比A大吗:
错,只能说明大部分情况下是这样,不过实际上查了下相关的基金数据,C类也会比A类的规模大。
比如这两只:


 
FxeWy3R0Pf.png



MixQus0VrL.png

 
1. C类规模一定比A大吗:
错,只能说明大部分情况下是这样,不过实际上查了下相关的基金数据,C类也会比A类的规模大。
比如这两只:


 
FxeWy3R0Pf.png



MixQus0VrL.png

 

直接买入 红利增强与易基综债 【2021-04-22】

试验一下策略的灵敏度。
收盘再来更新一波。
 
### 盘后更新 ##### 
当天两个都埋伏失败。。。看看明天的情况。如果没拉升,平盘卖出,如果暴跌,则7天后选择赎回。
 
试验一下策略的灵敏度。
收盘再来更新一波。
 
### 盘后更新 ##### 
当天两个都埋伏失败。。。看看明天的情况。如果没拉升,平盘卖出,如果暴跌,则7天后选择赎回。
 

pymongo update_one/update_many 返回更新数据的数目

比如有以下的python语句
ret = self.doc.update_one({'announcementId':announcementId},{'$setOnInsert':item},upsert=True)

作用是如果某个id不存在时,则把数据插入文档,如果存在,则不进行任何操作。
 
那么ret是操作的返回结果。
我们可以对返回数据进行核对
 
ret.matched_count, ret.modified_count
前者是匹配到文档的数目,而后者是修改了文档的个数。
 
 
继续阅读 »
比如有以下的python语句
ret = self.doc.update_one({'announcementId':announcementId},{'$setOnInsert':item},upsert=True)

作用是如果某个id不存在时,则把数据插入文档,如果存在,则不进行任何操作。
 
那么ret是操作的返回结果。
我们可以对返回数据进行核对
 
ret.matched_count, ret.modified_count
前者是匹配到文档的数目,而后者是修改了文档的个数。
 
  收起阅读 »

南方聚利160131 开放申购 2021年5月14日

当前的溢价率其高,当前溢价率是150%。 
 
大概率是基金公司在做局,让你们进去套利的啦。
 
不过目前该基金的规模在5千万,看起来规模不算特别大,并且是一只债基。
 
跟520弘盈差不多的套路。
当前的溢价率其高,当前溢价率是150%。 
 
大概率是基金公司在做局,让你们进去套利的啦。
 
不过目前该基金的规模在5千万,看起来规模不算特别大,并且是一只债基。
 
跟520弘盈差不多的套路。

轻报APP --骗子请注意点

所谓的垃圾创业公司,什么业务都不想出钱,能省就剩,抠到极致,能骗的绝对不花钱。
 
第一次见这种公司。
 
事情缘由:
 
该公司在拉勾上以招聘兼职为由,加你微信,然后借口说已测试一下应聘者的的水平,要求对方写一个爬取一个他们想要爬的网站,而且是用一个第三方的网站 神箭手 的平台代码来写的。 意味着,他可以拿着你的代码直接在上面运行,爬取他们想要的数据。
 
因为他们要的网站我曾经爬过,我直接把数据接了图给他们。 他们就急着要我用神箭手重新写一次。这时我就妥妥地确定他们就是想要空手白狼的人。 然后就拉黑了哦。
 
注意,那个负责人叫王锦锋。
继续阅读 »
所谓的垃圾创业公司,什么业务都不想出钱,能省就剩,抠到极致,能骗的绝对不花钱。
 
第一次见这种公司。
 
事情缘由:
 
该公司在拉勾上以招聘兼职为由,加你微信,然后借口说已测试一下应聘者的的水平,要求对方写一个爬取一个他们想要爬的网站,而且是用一个第三方的网站 神箭手 的平台代码来写的。 意味着,他可以拿着你的代码直接在上面运行,爬取他们想要的数据。
 
因为他们要的网站我曾经爬过,我直接把数据接了图给他们。 他们就急着要我用神箭手重新写一次。这时我就妥妥地确定他们就是想要空手白狼的人。 然后就拉黑了哦。
 
注意,那个负责人叫王锦锋。 收起阅读 »

本地代码 搜索脚本 python实现

本来用find+grep可以搞定的,不过如果搜索多个路径和多个规则,写正则可能写过不来
find . -type f -name "*.py" | xargs grep "redis"

上面语句是在py文件中查找redis的字符。
 
 不过如果要在指定多个位置查找,可能要拼接几个管道,并且如果我要几个字符的关系是并集,就是多个关键字要在文本中同时出现,而且不一定在同一行,所以也不好写。
 
所以写了个python脚本,也方便在centos下运行
# -*- coding: utf-8 -*-
# @Time : 2021/4/14 1:46
# @File : search_string_in_folder.py
# @Author : Rocky C@www.30daydo.com

'''
搜索代码脚本
'''
import fire
import glob
import re

# TODO 用PYQT重写一个

PATH_LIST = [r'C:\git\\',r'C:\OtherGit\\',r'C:\OneDrive\viewed_code\\']
POST_FIX = 'py' # 后缀文件
# 关键词
WORDS=[]

EXCLUDE_PATH=[r'C:\OtherGit\cpython']

DEBUG = True

class FileSearcher:

def __init__(self,kw):
self.root_path_list = PATH_LIST
self.default_coding ='utf-8'
self.exception_handle_coding='gbk'
self.kw=[]
if not isinstance(kw,tuple):
kw=(kw,)

for k in kw:
k=k.strip()
self.kw.append(k)

def search(self,file,encoding):
match_dict = dict()

for w in self.kw:
match_dict.setdefault(w, False)

line_number = 0
line_list=list()
with open(file, 'r', encoding=encoding) as fp:

while 1:
try:
line = fp.readline()

except UnicodeDecodeError as e:

if DEBUG:
print(f'Error coding in file {file}')
print(e)

return None,None,None

except Exception as e:
if DEBUG:
print(f'Error in file {file}')
print(e)
break

if not line:
break

line = line.strip()
if not line:
continue

for w in self.kw:
m=re.search(w,line,re.IGNORECASE)
if m:
match_dict.update({w:True})
line_list.append(line_number)

line_number+=1

return True,match_dict.copy(),line_list.copy()

def print_match_result(self,file,line_list,encoding):

with open(file, 'r', encoding=encoding) as fp:
line_number = 0
while 1:
try:
line = fp.readline()
except Exception as e:
if DEBUG:
print(f'Error in file {file}')
print(e)
break

if not line:
break
line=line.strip()

if not line:
continue

if line_number in line_list:
print(f'{file} :: {line_number} ====>\n {line[:50]}\n')

line_number += 1

def run(self):
for path in self.root_path_list:

search_path=path+'**/*.'+POST_FIX

for file in glob.iglob(search_path,recursive=True):

for ex_path in EXCLUDE_PATH:
ex_path=ex_path.replace('\\','')
temp_file=file.replace('\\','')
if ex_path in temp_file:
continue

use_encoding=self.default_coding
encode_proper,match_dict,line_list=self.search(file,use_encoding)

if not encode_proper:
use_encoding = self.exception_handle_coding
encode_proper,match_dict,line_list=self.search(file, use_encoding)

if match_dict is not None and len(match_dict)>0 and all(match_dict.values()):
# print(match_dict.values())
self.print_match_result(file,line_list,use_encoding)
# print(line_list)


def test_error_file():
path=r'C:\git\CodePool\example-code\19-dyn-attr-prop\oscon\schedule2.py'
with open(path,'r',encoding='utf8') as fp:
while 1:
x=fp.readline()
if not x:
break
print(x)

def main(kw):
app = FileSearcher(kw)
app.run()

if __name__ == '__main__':
fire.Fire(main)

运行: python main.py --kw=asyncio,gather
 

mQm5aIvTh1.png

 
继续阅读 »
本来用find+grep可以搞定的,不过如果搜索多个路径和多个规则,写正则可能写过不来
find . -type f -name "*.py" | xargs grep "redis"

上面语句是在py文件中查找redis的字符。
 
 不过如果要在指定多个位置查找,可能要拼接几个管道,并且如果我要几个字符的关系是并集,就是多个关键字要在文本中同时出现,而且不一定在同一行,所以也不好写。
 
所以写了个python脚本,也方便在centos下运行
# -*- coding: utf-8 -*-
# @Time : 2021/4/14 1:46
# @File : search_string_in_folder.py
# @Author : Rocky C@www.30daydo.com

'''
搜索代码脚本
'''
import fire
import glob
import re

# TODO 用PYQT重写一个

PATH_LIST = [r'C:\git\\',r'C:\OtherGit\\',r'C:\OneDrive\viewed_code\\']
POST_FIX = 'py' # 后缀文件
# 关键词
WORDS=[]

EXCLUDE_PATH=[r'C:\OtherGit\cpython']

DEBUG = True

class FileSearcher:

def __init__(self,kw):
self.root_path_list = PATH_LIST
self.default_coding ='utf-8'
self.exception_handle_coding='gbk'
self.kw=[]
if not isinstance(kw,tuple):
kw=(kw,)

for k in kw:
k=k.strip()
self.kw.append(k)

def search(self,file,encoding):
match_dict = dict()

for w in self.kw:
match_dict.setdefault(w, False)

line_number = 0
line_list=list()
with open(file, 'r', encoding=encoding) as fp:

while 1:
try:
line = fp.readline()

except UnicodeDecodeError as e:

if DEBUG:
print(f'Error coding in file {file}')
print(e)

return None,None,None

except Exception as e:
if DEBUG:
print(f'Error in file {file}')
print(e)
break

if not line:
break

line = line.strip()
if not line:
continue

for w in self.kw:
m=re.search(w,line,re.IGNORECASE)
if m:
match_dict.update({w:True})
line_list.append(line_number)

line_number+=1

return True,match_dict.copy(),line_list.copy()

def print_match_result(self,file,line_list,encoding):

with open(file, 'r', encoding=encoding) as fp:
line_number = 0
while 1:
try:
line = fp.readline()
except Exception as e:
if DEBUG:
print(f'Error in file {file}')
print(e)
break

if not line:
break
line=line.strip()

if not line:
continue

if line_number in line_list:
print(f'{file} :: {line_number} ====>\n {line[:50]}\n')

line_number += 1

def run(self):
for path in self.root_path_list:

search_path=path+'**/*.'+POST_FIX

for file in glob.iglob(search_path,recursive=True):

for ex_path in EXCLUDE_PATH:
ex_path=ex_path.replace('\\','')
temp_file=file.replace('\\','')
if ex_path in temp_file:
continue

use_encoding=self.default_coding
encode_proper,match_dict,line_list=self.search(file,use_encoding)

if not encode_proper:
use_encoding = self.exception_handle_coding
encode_proper,match_dict,line_list=self.search(file, use_encoding)

if match_dict is not None and len(match_dict)>0 and all(match_dict.values()):
# print(match_dict.values())
self.print_match_result(file,line_list,use_encoding)
# print(line_list)


def test_error_file():
path=r'C:\git\CodePool\example-code\19-dyn-attr-prop\oscon\schedule2.py'
with open(path,'r',encoding='utf8') as fp:
while 1:
x=fp.readline()
if not x:
break
print(x)

def main(kw):
app = FileSearcher(kw)
app.run()

if __name__ == '__main__':
fire.Fire(main)

运行: python main.py --kw=asyncio,gather
 

mQm5aIvTh1.png

  收起阅读 »

*蓝 灯 * 在目录 AppData\Local\Lantern\replica 下生成的一个巨大数据文件

在清理磁盘的过程中,发现在C的 AppData下的lantern目录下有个1G多的数据库文件。
AppData\Local\Lantern\replica
storage-cache.db
具体内容不知道是什么。
然后好奇了一下,用进程监控软件监控了一下。
 
发现*蓝*灯*是用golang写的。
 
然后后台不断地跟ask.com 进行通信,估计这个是他们托管的服务器。

Procmon64_CaFy6OtMxD.png

 
后台不断地写日志,还有获取某个代理服务器的状态。
继续阅读 »
在清理磁盘的过程中,发现在C的 AppData下的lantern目录下有个1G多的数据库文件。
AppData\Local\Lantern\replica
storage-cache.db
具体内容不知道是什么。
然后好奇了一下,用进程监控软件监控了一下。
 
发现*蓝*灯*是用golang写的。
 
然后后台不断地跟ask.com 进行通信,估计这个是他们托管的服务器。

Procmon64_CaFy6OtMxD.png

 
后台不断地写日志,还有获取某个代理服务器的状态。 收起阅读 »

万一免五 银河证券 非网红营业部 转债免五低佣金 百万分之五

最新更新(2022年3月19日):
【银河万一免五又开了! 难得的机会,需要开的赶紧,过了这个时间窗口就没有啦】


 ======================= 以前的内容 ======================================

 
 目前市面上的银河默认不是免五的,需要找到特定的营业部才能开通。

本营业部非网红营业部,可以一加六拖拉机。以防为了套利时出不去哈。
 
股票费率万一免五,
可转债(新规后)也是免五,沪市费率十万分之五,深市十万分之五。
 

 
因为经常会被同行举报,所以优惠会不定期关闭,需要的朋友要抓紧时间开,开了以后即使后面银河关闭了免五的通道,后面的费率还是以你现在开的费率来计算,也是免五的。 
 
需要的朋友可以扫描关注: 备注 : 开户,非诚勿扰。
继续阅读 »
最新更新(2022年3月19日):
【银河万一免五又开了! 难得的机会,需要开的赶紧,过了这个时间窗口就没有啦】


 ======================= 以前的内容 ======================================

 
 目前市面上的银河默认不是免五的,需要找到特定的营业部才能开通。

本营业部非网红营业部,可以一加六拖拉机。以防为了套利时出不去哈。
 
股票费率万一免五,
可转债(新规后)也是免五,沪市费率十万分之五,深市十万分之五。
 

 
因为经常会被同行举报,所以优惠会不定期关闭,需要的朋友要抓紧时间开,开了以后即使后面银河关闭了免五的通道,后面的费率还是以你现在开的费率来计算,也是免五的。 
 
需要的朋友可以扫描关注: 备注 : 开户,非诚勿扰。
收起阅读 »

绿盟下载官网被黑了?

以前一个不错的绿色软件下载网站。
现在这样子了。

chrome_8aX2qxmeS9.png

 
不知道是网站换人了还是被黑了?
以前一个不错的绿色软件下载网站。
现在这样子了。

chrome_8aX2qxmeS9.png

 
不知道是网站换人了还是被黑了?

判读一个函数是不是协程

传入的是函数名,不需要加入括号:
def check_coroutine(fun):
if iscoroutinefunction(fun):
print('是协程')
else:
print('不是协程')

async def visit_web():
browser = await pyppeteer.launch(
{'headless': False,
'userDataDir': UserDataDir,
'defaultViewport': {'width': 1800, 'height': 1000},
'ignoreDefaultArgs':True,
}
)
page = await browser.newPage()

# 可以在launch下配置
# await page.setViewport({
# "width": 1900,
# "height": 1020
# })


# 先执行下面的JS 再去goto
await page.evaluate(
'''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
# await page.screenshot({'path': 'test.png', 'fullPage': True})
# await page.pdf({'path': 'test.pdf'})
# await asyncio.sleep(5)

await page.goto(url=URL)

# 这里的js是异步的写法
dimensions = await page.evaluate(
'''
()=>{
return {
width:document.documentElement.clientWidth,
height:document.documentElement.clientHeight,
deviceScaleFactor_:window.devicePixelRatio,
}
}
'''
)

result = await page.evaluate(
'''
()=>{
var title = document.title;
return {title:title};
}
'''

)


await browser.close()

调用:
check_coroutine(visit_web)
注意,上面不能用visit_web()

 
继续阅读 »
传入的是函数名,不需要加入括号:
def check_coroutine(fun):
if iscoroutinefunction(fun):
print('是协程')
else:
print('不是协程')

async def visit_web():
browser = await pyppeteer.launch(
{'headless': False,
'userDataDir': UserDataDir,
'defaultViewport': {'width': 1800, 'height': 1000},
'ignoreDefaultArgs':True,
}
)
page = await browser.newPage()

# 可以在launch下配置
# await page.setViewport({
# "width": 1900,
# "height": 1020
# })


# 先执行下面的JS 再去goto
await page.evaluate(
'''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
# await page.screenshot({'path': 'test.png', 'fullPage': True})
# await page.pdf({'path': 'test.pdf'})
# await asyncio.sleep(5)

await page.goto(url=URL)

# 这里的js是异步的写法
dimensions = await page.evaluate(
'''
()=>{
return {
width:document.documentElement.clientWidth,
height:document.documentElement.clientHeight,
deviceScaleFactor_:window.devicePixelRatio,
}
}
'''
)

result = await page.evaluate(
'''
()=>{
var title = document.title;
return {title:title};
}
'''

)


await browser.close()

调用:
check_coroutine(visit_web)
注意,上面不能用visit_web()

  收起阅读 »

可转债T+0 零手续费 零费率 免佣金

一般而言,可转债的手续费都会比股票低
 
可转债新规后,佣金沪深市十万分之五
那么如果你是很抠的人,这里并不是贬义词,在菜市场,你会比较价格,而在证券市场上,为什么不挑选便宜的佣金的券商呢?
 
看交割单
 

 
以前看到一个案例,发现低佣是多么难得:
 
券商交割单只是统计到分,也就是一分钱以下是不会收取的,那么买入转债的时候,如果你的交易金额较大,那么可以使用拆单功能,就是把一个大单拆分为多个小单,如果你每个小单小于5千元,那么券商的交割费用系统就会舍弃分钱后面的金额,也就是交易费用原来是 0.003元,但只能取到分钱位置,也就是0.00,后面的3就被舍弃了,这样手续费就是为0了。
 
所以你要做的就是找一个可转债低佣的券商,越低越好
需要可以扫描开户:


备注:开户
非诚勿扰。
 
继续阅读 »
一般而言,可转债的手续费都会比股票低
 
可转债新规后,佣金沪深市十万分之五
那么如果你是很抠的人,这里并不是贬义词,在菜市场,你会比较价格,而在证券市场上,为什么不挑选便宜的佣金的券商呢?
 
看交割单
 

 
以前看到一个案例,发现低佣是多么难得:
 
券商交割单只是统计到分,也就是一分钱以下是不会收取的,那么买入转债的时候,如果你的交易金额较大,那么可以使用拆单功能,就是把一个大单拆分为多个小单,如果你每个小单小于5千元,那么券商的交割费用系统就会舍弃分钱后面的金额,也就是交易费用原来是 0.003元,但只能取到分钱位置,也就是0.00,后面的3就被舍弃了,这样手续费就是为0了。
 
所以你要做的就是找一个可转债低佣的券商,越低越好
需要可以扫描开户:


备注:开户
非诚勿扰。
  收起阅读 »

pyppeteer-pdf not support latest version of pypeteer

只能用0.0.25版本的pypeteer。
只好下载一个低版本的chrouium放到本地。

或者使用另一个库
https://github.com/shivanshs9/pdfgen-python
 
只能用0.0.25版本的pypeteer。
只好下载一个低版本的chrouium放到本地。

或者使用另一个库
https://github.com/shivanshs9/pdfgen-python
 

pyppeteer禁用自动化提示栏 --enable-automation参数关闭

在启动的时候加入一个参数即可:
    browser = await pyppeteer.launch(
{'headless': False,
'userDataDir': UserDataDir,
'defaultViewport': {'width': 1800, 'height': 1000},
# 'enable-automation':False,
'ignoreDefaultArgs':['--enable-automation'],
}
)

忽略默认参数:
'ignoreDefaultArgs':['--enable-automation'],
即可,
如果需要去除更多的特征,在列表里面加入更多即可。
如果全部不要,那么 就把它设置为True即可。

 
继续阅读 »
在启动的时候加入一个参数即可:
    browser = await pyppeteer.launch(
{'headless': False,
'userDataDir': UserDataDir,
'defaultViewport': {'width': 1800, 'height': 1000},
# 'enable-automation':False,
'ignoreDefaultArgs':['--enable-automation'],
}
)

忽略默认参数:
'ignoreDefaultArgs':['--enable-automation'],
即可,
如果需要去除更多的特征,在列表里面加入更多即可。
如果全部不要,那么 就把它设置为True即可。

  收起阅读 »

pyppeteer设置浏览器大小

在初始化时加入 defaultViewport字典值即可:
    browser = await pyppeteer.launch(
{'headless': False,
'userDataDir': UserDataDir,
'defaultViewport': {'width': 1800, 'height': 1000}
}
)

更多参数可以查看pyppeteer的源码。
        self.handleSIGINT = options.get('handleSIGINT', True)
self.handleSIGTERM = options.get('handleSIGTERM', True)
self.handleSIGHUP = options.get('handleSIGHUP', True)
self.ignoreHTTPSErrors = options.get('ignoreHTTPSErrors', False)
self.defaultViewport = options.get('defaultViewport', {'width': 800, 'height': 600}) # noqa: E501
self.slowMo = options.get('slowMo', 0)
self.timeout = options.get('timeout', 30000)
self.autoClose = options.get('autoClose', True)

 
继续阅读 »
在初始化时加入 defaultViewport字典值即可:
    browser = await pyppeteer.launch(
{'headless': False,
'userDataDir': UserDataDir,
'defaultViewport': {'width': 1800, 'height': 1000}
}
)

更多参数可以查看pyppeteer的源码。
        self.handleSIGINT = options.get('handleSIGINT', True)
self.handleSIGTERM = options.get('handleSIGTERM', True)
self.handleSIGHUP = options.get('handleSIGHUP', True)
self.ignoreHTTPSErrors = options.get('ignoreHTTPSErrors', False)
self.defaultViewport = options.get('defaultViewport', {'width': 800, 'height': 600}) # noqa: E501
self.slowMo = options.get('slowMo', 0)
self.timeout = options.get('timeout', 30000)
self.autoClose = options.get('autoClose', True)

  收起阅读 »

python判断可转债是否强赎

占坑,后期把代码整理下放上来。
 
更新:

20230704004.jpg

 
制作好了一个接口,用户可以直接调用。
数据来源与集思录。
获取 排除满足强赎天数剩余N天的可转债,排除强赎可转债。

比如:DAY=4 ,那么假设强赎满足天数为15天,那么返回市场上强赎强赎倒数天数大于4天的可转债,即返回小于或者等于11天以下的转债。把满足条件还差4天的转债排除掉了,当然,已经公告强赎的也会被排除。



import requests

URL = 'http://11.11.11.11/api/redeem/'
# DAY 强赎倒数剩余天数小于 DAY (4)天, 已经公告强赎的也是被排除的
DAY = 4

SIGN = '私信星主获取' # sign和以前一致

data = {'day': DAY,
'sign': SIGN}
r = requests.post(URL, data=data)

print(r.json())
 
具体用户可以关注知识星球:
继续阅读 »
占坑,后期把代码整理下放上来。
 
更新:

20230704004.jpg

 
制作好了一个接口,用户可以直接调用。
数据来源与集思录。
获取 排除满足强赎天数剩余N天的可转债,排除强赎可转债。

比如:DAY=4 ,那么假设强赎满足天数为15天,那么返回市场上强赎强赎倒数天数大于4天的可转债,即返回小于或者等于11天以下的转债。把满足条件还差4天的转债排除掉了,当然,已经公告强赎的也会被排除。



import requests

URL = 'http://11.11.11.11/api/redeem/'
# DAY 强赎倒数剩余天数小于 DAY (4)天, 已经公告强赎的也是被排除的
DAY = 4

SIGN = '私信星主获取' # sign和以前一致

data = {'day': DAY,
'sign': SIGN}
r = requests.post(URL, data=data)

print(r.json())
 
具体用户可以关注知识星球:
收起阅读 »

可转债开户 免五

可转债的开户条件:
1. 和股票证券一样,需要开通一个证券账户,年满18周岁即可。

2. 开通券商账户后,需要在券商软件的业务里面,选择开通可转债交易权限,会让你做十道题,题目比较简单,做错了也可以重来的。

3. 然后就可以交易可转债了。 可转债是T+0的,也就是可以当天来回买卖。
 
可转债新规,费率如下

沪市十万分之五,深市十万分之五,而且是免5,没有最低消费,
 

 
如果有需要,可以扫描下方二维码开户吧: 
请注明 开户,不然非诚勿扰:
 
继续阅读 »
可转债的开户条件:
1. 和股票证券一样,需要开通一个证券账户,年满18周岁即可。

2. 开通券商账户后,需要在券商软件的业务里面,选择开通可转债交易权限,会让你做十道题,题目比较简单,做错了也可以重来的。

3. 然后就可以交易可转债了。 可转债是T+0的,也就是可以当天来回买卖。
 
可转债新规,费率如下

沪市十万分之五,深市十万分之五,而且是免5,没有最低消费,
 

 
如果有需要,可以扫描下方二维码开户吧: 
请注明 开户,不然非诚勿扰:
 
收起阅读 »

可转债市场最低费率是多少

最近不少过来开户的人,都是因为之前很早前开的券商户,比如像华泰这种,在4,5年前开的。
有些人也不怎么看交割单,不看不知道,一看吓一跳。

华泰费率.PNG

交易最低1元,也就是如果买1手转债(10张),共1000元,或者中签了,中了一手可转债,也就是1000元,卖出最低给1元。
而费率就是千分之一,也就是交易1万元,要给10元的交易费率。
 
本身可转债是T+0了,每天可以来回做T, 沪市转债(新规)费率是十万分之5,是深市的稍微贵一些,十万分之5

Screenshot_2021_0402_112915_small.jpg


具体费率:

gwpEkGjY8S.png


如果需要开户的可以扫描以下二维码,保证费率市场最低



备注开户。
 
PS:本人不是券商人员。如果你需要开通其他券商,也可以找我开,我这里有大部分券商的开户资源,也清楚每个品种的费率情况,也希望推荐一个适合的券商给你,免得被手续费吸走你的盈利哈。
继续阅读 »
最近不少过来开户的人,都是因为之前很早前开的券商户,比如像华泰这种,在4,5年前开的。
有些人也不怎么看交割单,不看不知道,一看吓一跳。

华泰费率.PNG

交易最低1元,也就是如果买1手转债(10张),共1000元,或者中签了,中了一手可转债,也就是1000元,卖出最低给1元。
而费率就是千分之一,也就是交易1万元,要给10元的交易费率。
 
本身可转债是T+0了,每天可以来回做T, 沪市转债(新规)费率是十万分之5,是深市的稍微贵一些,十万分之5

Screenshot_2021_0402_112915_small.jpg


具体费率:

gwpEkGjY8S.png


如果需要开户的可以扫描以下二维码,保证费率市场最低



备注开户。
 
PS:本人不是券商人员。如果你需要开通其他券商,也可以找我开,我这里有大部分券商的开户资源,也清楚每个品种的费率情况,也希望推荐一个适合的券商给你,免得被手续费吸走你的盈利哈。 收起阅读 »

pyppeteer下载chromedriver失败的解决办法

因为网址变了!
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='storage.googleapis.com', port=443): Max retries exceeded with url: /chromium-browser-snapshots/Win_
x64/588429/chrome-win32.zip (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000000037D3880>: Failed to establish a new connect
ion: [Errno 11004] getaddrinfo failed'))
用浏览器看了,发现根本打不开。
然后谷歌了一下它的镜像,实际链接为: 
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip
 
所以,哎,这个库真的有点烂。
直接下载上面的链接,然后解压到本地路径,然后在设置一个环境变量指向这个目录即可。
 
继续阅读 »
因为网址变了!
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='storage.googleapis.com', port=443): Max retries exceeded with url: /chromium-browser-snapshots/Win_
x64/588429/chrome-win32.zip (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000000037D3880>: Failed to establish a new connect
ion: [Errno 11004] getaddrinfo failed'))
用浏览器看了,发现根本打不开。
然后谷歌了一下它的镜像,实际链接为: 
https://commondatastorage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip
 
所以,哎,这个库真的有点烂。
直接下载上面的链接,然后解压到本地路径,然后在设置一个环境变量指向这个目录即可。
  收起阅读 »

转换很多逗号的,,,,,,,,, JS的数组为python列表

不知道JS的写法就是这样还是这样的,一个列表可以这么写
var arr = [,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,2,3,4,5] 前面的逗号就是没有数据,None或者0.
然后JS的代码可以不填充任何数据。python要把它转为list,要怎么做的?
 
有2个方法:
 
1. 最简单,因为,,的意思是0,0, 那么我们可以把两个逗号替换成0,0,
但是如果前面的逗号数是单数,比如是3个逗号,
arr=[,,,1,2,3]
直接替换2个逗号为0,0,的话,结果是0,0,,1,2,3
结果也不对。
多了一对逗号
然后可以直接再替换一次,, 把两个的地方替换为1个,
 
2. 使用finditer找出每个多余2个逗号的起始和结束,然后替换为0, 即可。
for m in re.finditer(',{2,}'):
    start=m.start()
    end=m.end()
    
继续阅读 »
不知道JS的写法就是这样还是这样的,一个列表可以这么写
var arr = [,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,2,3,4,5] 前面的逗号就是没有数据,None或者0.
然后JS的代码可以不填充任何数据。python要把它转为list,要怎么做的?
 
有2个方法:
 
1. 最简单,因为,,的意思是0,0, 那么我们可以把两个逗号替换成0,0,
但是如果前面的逗号数是单数,比如是3个逗号,
arr=[,,,1,2,3]
直接替换2个逗号为0,0,的话,结果是0,0,,1,2,3
结果也不对。
多了一对逗号
然后可以直接再替换一次,, 把两个的地方替换为1个,
 
2. 使用finditer找出每个多余2个逗号的起始和结束,然后替换为0, 即可。
for m in re.finditer(',{2,}'):
    start=m.start()
    end=m.end()
     收起阅读 »

imgtu的设计有毛病吧? 垃圾路过图床

这个站点是不允许别人用梯子上传图片。

然后自己官方的联系方式里面放一个电报telegram的链接。

还有那个发送后台消息给官方邮件的验证码,也是一个谷歌的验证码,没有梯子哪有能耐发消息给你呀?
 
反正就是莫名其妙的被封禁了。 导致个人存放在上面的图片变成了死链接,主要要回去硬盘里面一张张图片找回来,补回去原来的博客文章里面,够呛的了。

这个垃圾网站就是一个坑逼,谁用谁傻逼! 
 
还是老老实实用阿里云或者腾讯,七牛的空间,访问量不高的费用又不高。
主要是被人坑的感觉不爽。
 
免费图床虽然可以不花钱,但我悲观地认为,大多免费且赚不了钱的服务终究走不了长远,也许未来的某一天,你就会突然收到「XX 关停」的通知。
继续阅读 »
这个站点是不允许别人用梯子上传图片。

然后自己官方的联系方式里面放一个电报telegram的链接。

还有那个发送后台消息给官方邮件的验证码,也是一个谷歌的验证码,没有梯子哪有能耐发消息给你呀?
 
反正就是莫名其妙的被封禁了。 导致个人存放在上面的图片变成了死链接,主要要回去硬盘里面一张张图片找回来,补回去原来的博客文章里面,够呛的了。

这个垃圾网站就是一个坑逼,谁用谁傻逼! 
 
还是老老实实用阿里云或者腾讯,七牛的空间,访问量不高的费用又不高。
主要是被人坑的感觉不爽。
 
免费图床虽然可以不花钱,但我悲观地认为,大多免费且赚不了钱的服务终究走不了长远,也许未来的某一天,你就会突然收到「XX 关停」的通知。 收起阅读 »

PTrade新手入门教程 二

1. 执行顺序:
最开始是initialize,然后是before_trading_start,然后handle_data,后来到after_trading_end
 
2. log.debug 的输出是不在控制台的。难道这个是个bug??? 官方回复:是的,除了log.info 可以输出,其他都无法输出
 
3. 在中午休息时间,handle_data 是停止不运行的,其他放在run_interval函数里面调用的也是处于停滞状态。
 
需要开通Ptrade的朋友可以加微信联系: 门槛低,只需要30W,存放一周就可以了
交易费率股票万一免5,基金万0.6,转债百万分之二

继续阅读 »
1. 执行顺序:
最开始是initialize,然后是before_trading_start,然后handle_data,后来到after_trading_end
 
2. log.debug 的输出是不在控制台的。难道这个是个bug??? 官方回复:是的,除了log.info 可以输出,其他都无法输出
 
3. 在中午休息时间,handle_data 是停止不运行的,其他放在run_interval函数里面调用的也是处于停滞状态。
 
需要开通Ptrade的朋友可以加微信联系: 门槛低,只需要30W,存放一周就可以了
交易费率股票万一免5,基金万0.6,转债百万分之二

收起阅读 »

在2015年山顶5178点 开始定投所有大A股票 结果会是怎样?

对于定投,一般人印象是,如果你最终结果是亏损的,那么原因就是:耐心不够,跌的时候不够定力,不敢继续加仓。

而事实真的是这样吗?

笔者使用2015年6月12日上一轮全面牛市的高点5178点,作为定投的起始点。而定投标的股票为大A所有股票。


chrome_8oqFlYXsth.png



股票池为2015年6月12日没有停牌的股票,共 2415 只。使用的量化平台是优矿。

(没错,以前股票数就才两千多只,这几年股票数接近翻倍了)
def get_all_code(date):
'''
获取某天的股市运行的股票,排除停牌
'''
df=DataAPI.MktEqudAdjGet(secID=u"",ticker=u"",
tradeDate=date,
beginDate=u"",
endDate=u"",
isOpen="",
field=u"",
pandas="1")
df=df[df['turnoverValue']>0] # 停牌
return df['ticker'].tolist()


chrome_gvrulmavY7.png







ITIQ1MinNt.png



部分股票样本数据


接着从2015年6月12日开始定投,这里笔者按照一个月定投一次,也就是22个交易日定投一次。

每次定投金额10000元。定投到2021年3月28日。

如果定投当天遇到股票停牌,则顺势延续到复牌后继续定投。

这里定投采用净值法定投,为的是让数据更加准确。因为如果按照实际定投股票,10000元的金额可能连1手的茅台也买不进去,这里计算买入的份额为=10000元/股票股价, 比如茅台的股价是2000元,那么这里买入的份额就是5股,并没按照实际股票的1手来算。这样计算得到结果更加精准。

python计算代码如下:
 1import time
2import datetime
3
4stock_profit_list=
5start=time.time()
6
7today=datetime.datetime.now().strftime('%Y-%m-%d')
8
9def get_trade_date():
10 df=DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
11 beginDate=high_date,
12 endDate=today,isOpen=u"1",
13 field=u"",pandas="1")
14 return df['calendarDate'].tolist()
15
16def fixed_investment(code):
17 stock_profit_dict={}
18 stock_profit_dict['code']=code
19 df=DataAPI.MktEqudAdjGet(secID=u"",ticker=code,tradeDate=u'',beginDate=high_date,endDate=today,isOpen="1",field=u"",pandas="1")
20 total_amount=0
21 invest_count=0
22 every_invest_cash=10000
23 total_money_list=list()
24 last_date=None
25 for trade_date in trade_date_list_interval:
26 trade_df = df[df['tradeDate']==trade_date]
27 if len(trade_df)>0:
28 invest_count+=1
29 price=trade_df['closePrice'].iloc[0]
30 amount=every_invest_cash/price
31 cost=invest_count*every_invest_cash
32 profit=total_amount*price/cost
33 total_money_list.append(profit)
34 total_amount=total_amount+amount
35 total_money=price*total_amount
36 last_date=trade_date
37
38
39 stock_profit_dict['profit_rate']=profit
40 stock_profit_dict['last_date']=last_date
41 stock_profit_dict['invest_count']=invest_count
42 stock_profit_dict['total_amount']=total_amount
43 stock_profit_dict['total_money']=total_money
44 stock_profit_dict['profit_list']=total_money_list
45 stock_profit_dict['cost']=cost
46 return stock_profit_dict
47
48for code in target_codes:
49 profit_dict = fixed_investment(code)
50 stock_profit_list.append(profit_dict)
51
52print(time.time()-start)

 
最终得到的数据保存在stock_profit_list变量里面。在计算过程也记录里每一个股票当前一期定投阶段的阶段收益率,组合成一个列表。

为的是倒后镜看看,曾经的历史定投收益率,也可以看看曾经的历史定投收益率的最大值。便于和现在最后一期收益率的对比。

得到数据按照profit_rate收益率排个序:
profi_df_sorted = profit_df.sort_values(by='profit_rate',ascending=False)

得到下面的数据:


chrome_2ssHwV7kIF.png


上面的股票熟悉不?基本都是年初那一批基金ikun们的抱团股。

定投收益率最高的是山西汾酒,收益率达到8.56,即856%,从股灾高点定投下来,到现在2021年3月28日,收益率是8倍!

其月K线如下:


chrome_5YfTfpQeGO.png


牛气冲天的5年十倍股,股灾时山西汾酒的股价徘徊在21-26之间左右。如果股灾的时候采用一把梭,收益率是336/26=12.9 倍。

而采用定投方式的收益率也不差,8.56倍。

再继续看看定投收益排在倒数的


chrome_70AmS82Klu.png


真是好家伙,亏得底裤都不见了。清一色的退市股,定投收益率基本在0.1以下,意味着投资了100元,最后就剩10元以下。

在前面计算的时候,特意加了一个数据列,定投期数和定投停止日期,也就是股票退市或者停牌导致无法交易的日子。

invest_count为定投期数,定投一次此值加1. last_date 为最后一个交易日期。倒数第一个国恒退,只交易1期,7月10日退市,等不来第2期的定投,不过也好,这样子只也不至于越陷越深。



chrome_ctuYAng8BL.png


国恒退日K
total_money 列是投资得到总金额,cost是投入的成本。投资期数越多,随着股价上涨,该金额会越高,而股价不断下跌,则该金额会越来越少。所以遇到国恒退这种股票,当期只投了10000元就无法继续投下去,还是运气比较好的。类似于止损操作了。

toal_money减去cost得到的是绝对收益。之前因为没有加这一列,可以通过以下公式计算得到:
profit_df['absolute_profit']=profit_df['total_money']-profit_df['cost']

按绝对收益计算,最多的还是前面那20位个股,赚最多的山西汾酒,129W的定投金额,盈利金额达到900W。


chrome_UQ2xMZ75cl.png


同样倒序排一下,绝对亏损最多的,肯定也是定投期数较多的。

[图片]
亏损最多的天夏退,目前还没有完全退市,定投了114期,总亏损金额达到100W,定投总金额是110W。额,只剩10W。


chrome_FVZp47vc3S.png


它的月K线是这样的。其跌到4元多的时候还放量了,可能一堆人冲进去抄底了,然后按亏损幅度,4元跌到0.22元,亏损幅度也是94.5%,这个亏损幅度其实和在山顶29元站岗的亏损率其实没什么区别了。高手死于抄底,呵呵。

接着看看上面所有股票的定投的平均收益率:
profi_df_sorted['profit_rate'].mean()

得到的收益率的平均值为:1.043,减去本金1,收益为1.043-1=0.043,也就是4.3%个点。

换句话说,如果在股票高点5178点定投全市场股票,5年多来的最后收益率为4.3%.


chrome_U2mijtKyIe.png


中位数是0.87-1=-0.13,= -13%,中位数是亏损13%,定投金额约126W,亏损金额为14W。

看到这里,笔者想要表述的是,即使是定投也需要挑选一个好标的股票或者基金,也就是择股择时能力。

如果在一个垃圾股或者基金上定投,只会让你越陷越深,亏损越来越多。假如你在定投康得新或者乐视,定投了100期,投入了不少的金额和时间,突然暴雷,然后ST,那么你会继续定投下去吗?

另外,定投也需要一定的择时能力,比如在前春节前,基金抱团股热度不减,对于大部分没有择股能力的人来说,当时是应该止盈离场的。当然,如果倒后镜看,如果有能力抓取上面的大牛股,也不一定能够把上面的8倍收益落袋而安。

上面数据有一列max_profit,total_money/cost, 也就是定投期间,获得的最大收益率。按此列排序:


chrome_vMYDUIaC00.png


在定投期间,最大收益率的是ST中安,最大收益率是14.6-1=13.6倍。最后到这个月最终定投收益率是0.67,亏损状态,0.67-1=-0.37,亏损为-37%,绝对收益absolute_profit为-29W.

排在第4是是乐视退,定投期间最大收益max_profit达到10倍,最后如果坚持定投,是亏损93%的。

如果把定投时间放在2018年1月12日,那么得到的定投收益率排名前20名是这样的:


chrome_6UAh6Vp6vE.png


得到不一样的前20排名,定投收益率最高的是英科医疗,疫情手套涨了10倍的大牛股。而山西汾酒跌到第10,并且收益率也只有4倍左右。而茅台也没出现在前20的榜单上。


不同的定投时间,得到的是不一样的结果。当然择股能力强的大神,就不屑定投而采用一把梭了,大神向往的是英科医疗的一年十倍,而不是十年十倍(大V组合抱团,抱团基金的组合)。


其改变定投时间的定投收益率的平均值以及中位数数据如下:


chrome_W3tYI5Sj74.png


平均收益率达到了1.14-1=0.14=14%,也就是如果你在18年开始定投全市场股票,当前平均收益率是14%,不过中位数的收益率是1-1=0%,因为这两年股票大小票分化得太严重(24%的个股跌破2440的低点,指数涨41%),四分一分位的定投收益率为27%,到了中位数就为0%了。其定投收益率较2015年山顶定投也有了很大的区别。

今天就到这里吧,感觉文章太长了,本来还想把全市场的基金加进来比较的(不同时间点定投全市场所有基金),碍于篇幅原因,留在下一篇再写吧,敬请留意!
 
微信公众号:
可转债量化分析

公众号二维码.jpg

 
继续阅读 »
对于定投,一般人印象是,如果你最终结果是亏损的,那么原因就是:耐心不够,跌的时候不够定力,不敢继续加仓。

而事实真的是这样吗?

笔者使用2015年6月12日上一轮全面牛市的高点5178点,作为定投的起始点。而定投标的股票为大A所有股票。


chrome_8oqFlYXsth.png



股票池为2015年6月12日没有停牌的股票,共 2415 只。使用的量化平台是优矿。

(没错,以前股票数就才两千多只,这几年股票数接近翻倍了)
def get_all_code(date):
'''
获取某天的股市运行的股票,排除停牌
'''
df=DataAPI.MktEqudAdjGet(secID=u"",ticker=u"",
tradeDate=date,
beginDate=u"",
endDate=u"",
isOpen="",
field=u"",
pandas="1")
df=df[df['turnoverValue']>0] # 停牌
return df['ticker'].tolist()


chrome_gvrulmavY7.png







ITIQ1MinNt.png



部分股票样本数据


接着从2015年6月12日开始定投,这里笔者按照一个月定投一次,也就是22个交易日定投一次。

每次定投金额10000元。定投到2021年3月28日。

如果定投当天遇到股票停牌,则顺势延续到复牌后继续定投。

这里定投采用净值法定投,为的是让数据更加准确。因为如果按照实际定投股票,10000元的金额可能连1手的茅台也买不进去,这里计算买入的份额为=10000元/股票股价, 比如茅台的股价是2000元,那么这里买入的份额就是5股,并没按照实际股票的1手来算。这样计算得到结果更加精准。

python计算代码如下:
 1import time
2import datetime
3
4stock_profit_list=
5start=time.time()
6
7today=datetime.datetime.now().strftime('%Y-%m-%d')
8
9def get_trade_date():
10 df=DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
11 beginDate=high_date,
12 endDate=today,isOpen=u"1",
13 field=u"",pandas="1")
14 return df['calendarDate'].tolist()
15
16def fixed_investment(code):
17 stock_profit_dict={}
18 stock_profit_dict['code']=code
19 df=DataAPI.MktEqudAdjGet(secID=u"",ticker=code,tradeDate=u'',beginDate=high_date,endDate=today,isOpen="1",field=u"",pandas="1")
20 total_amount=0
21 invest_count=0
22 every_invest_cash=10000
23 total_money_list=list()
24 last_date=None
25 for trade_date in trade_date_list_interval:
26 trade_df = df[df['tradeDate']==trade_date]
27 if len(trade_df)>0:
28 invest_count+=1
29 price=trade_df['closePrice'].iloc[0]
30 amount=every_invest_cash/price
31 cost=invest_count*every_invest_cash
32 profit=total_amount*price/cost
33 total_money_list.append(profit)
34 total_amount=total_amount+amount
35 total_money=price*total_amount
36 last_date=trade_date
37
38
39 stock_profit_dict['profit_rate']=profit
40 stock_profit_dict['last_date']=last_date
41 stock_profit_dict['invest_count']=invest_count
42 stock_profit_dict['total_amount']=total_amount
43 stock_profit_dict['total_money']=total_money
44 stock_profit_dict['profit_list']=total_money_list
45 stock_profit_dict['cost']=cost
46 return stock_profit_dict
47
48for code in target_codes:
49 profit_dict = fixed_investment(code)
50 stock_profit_list.append(profit_dict)
51
52print(time.time()-start)

 
最终得到的数据保存在stock_profit_list变量里面。在计算过程也记录里每一个股票当前一期定投阶段的阶段收益率,组合成一个列表。

为的是倒后镜看看,曾经的历史定投收益率,也可以看看曾经的历史定投收益率的最大值。便于和现在最后一期收益率的对比。

得到数据按照profit_rate收益率排个序:
profi_df_sorted = profit_df.sort_values(by='profit_rate',ascending=False)

得到下面的数据:


chrome_2ssHwV7kIF.png


上面的股票熟悉不?基本都是年初那一批基金ikun们的抱团股。

定投收益率最高的是山西汾酒,收益率达到8.56,即856%,从股灾高点定投下来,到现在2021年3月28日,收益率是8倍!

其月K线如下:


chrome_5YfTfpQeGO.png


牛气冲天的5年十倍股,股灾时山西汾酒的股价徘徊在21-26之间左右。如果股灾的时候采用一把梭,收益率是336/26=12.9 倍。

而采用定投方式的收益率也不差,8.56倍。

再继续看看定投收益排在倒数的


chrome_70AmS82Klu.png


真是好家伙,亏得底裤都不见了。清一色的退市股,定投收益率基本在0.1以下,意味着投资了100元,最后就剩10元以下。

在前面计算的时候,特意加了一个数据列,定投期数和定投停止日期,也就是股票退市或者停牌导致无法交易的日子。

invest_count为定投期数,定投一次此值加1. last_date 为最后一个交易日期。倒数第一个国恒退,只交易1期,7月10日退市,等不来第2期的定投,不过也好,这样子只也不至于越陷越深。



chrome_ctuYAng8BL.png


国恒退日K
total_money 列是投资得到总金额,cost是投入的成本。投资期数越多,随着股价上涨,该金额会越高,而股价不断下跌,则该金额会越来越少。所以遇到国恒退这种股票,当期只投了10000元就无法继续投下去,还是运气比较好的。类似于止损操作了。

toal_money减去cost得到的是绝对收益。之前因为没有加这一列,可以通过以下公式计算得到:
profit_df['absolute_profit']=profit_df['total_money']-profit_df['cost']

按绝对收益计算,最多的还是前面那20位个股,赚最多的山西汾酒,129W的定投金额,盈利金额达到900W。


chrome_UQ2xMZ75cl.png


同样倒序排一下,绝对亏损最多的,肯定也是定投期数较多的。

[图片]
亏损最多的天夏退,目前还没有完全退市,定投了114期,总亏损金额达到100W,定投总金额是110W。额,只剩10W。


chrome_FVZp47vc3S.png


它的月K线是这样的。其跌到4元多的时候还放量了,可能一堆人冲进去抄底了,然后按亏损幅度,4元跌到0.22元,亏损幅度也是94.5%,这个亏损幅度其实和在山顶29元站岗的亏损率其实没什么区别了。高手死于抄底,呵呵。

接着看看上面所有股票的定投的平均收益率:
profi_df_sorted['profit_rate'].mean()

得到的收益率的平均值为:1.043,减去本金1,收益为1.043-1=0.043,也就是4.3%个点。

换句话说,如果在股票高点5178点定投全市场股票,5年多来的最后收益率为4.3%.


chrome_U2mijtKyIe.png


中位数是0.87-1=-0.13,= -13%,中位数是亏损13%,定投金额约126W,亏损金额为14W。

看到这里,笔者想要表述的是,即使是定投也需要挑选一个好标的股票或者基金,也就是择股择时能力。

如果在一个垃圾股或者基金上定投,只会让你越陷越深,亏损越来越多。假如你在定投康得新或者乐视,定投了100期,投入了不少的金额和时间,突然暴雷,然后ST,那么你会继续定投下去吗?

另外,定投也需要一定的择时能力,比如在前春节前,基金抱团股热度不减,对于大部分没有择股能力的人来说,当时是应该止盈离场的。当然,如果倒后镜看,如果有能力抓取上面的大牛股,也不一定能够把上面的8倍收益落袋而安。

上面数据有一列max_profit,total_money/cost, 也就是定投期间,获得的最大收益率。按此列排序:


chrome_vMYDUIaC00.png


在定投期间,最大收益率的是ST中安,最大收益率是14.6-1=13.6倍。最后到这个月最终定投收益率是0.67,亏损状态,0.67-1=-0.37,亏损为-37%,绝对收益absolute_profit为-29W.

排在第4是是乐视退,定投期间最大收益max_profit达到10倍,最后如果坚持定投,是亏损93%的。

如果把定投时间放在2018年1月12日,那么得到的定投收益率排名前20名是这样的:


chrome_6UAh6Vp6vE.png


得到不一样的前20排名,定投收益率最高的是英科医疗,疫情手套涨了10倍的大牛股。而山西汾酒跌到第10,并且收益率也只有4倍左右。而茅台也没出现在前20的榜单上。


不同的定投时间,得到的是不一样的结果。当然择股能力强的大神,就不屑定投而采用一把梭了,大神向往的是英科医疗的一年十倍,而不是十年十倍(大V组合抱团,抱团基金的组合)。


其改变定投时间的定投收益率的平均值以及中位数数据如下:


chrome_W3tYI5Sj74.png


平均收益率达到了1.14-1=0.14=14%,也就是如果你在18年开始定投全市场股票,当前平均收益率是14%,不过中位数的收益率是1-1=0%,因为这两年股票大小票分化得太严重(24%的个股跌破2440的低点,指数涨41%),四分一分位的定投收益率为27%,到了中位数就为0%了。其定投收益率较2015年山顶定投也有了很大的区别。

今天就到这里吧,感觉文章太长了,本来还想把全市场的基金加进来比较的(不同时间点定投全市场所有基金),碍于篇幅原因,留在下一篇再写吧,敬请留意!
 
微信公众号:
可转债量化分析

公众号二维码.jpg

  收起阅读 »

cronsun 执行计划任务是报错 exec format error

把执行的python命令写到shell里面,也给了+x权限,还是报这个错误
fork/exec /root/crontab_script/hello.sh: exec format error

单独执行shell的脚本是没有问题的。
 
经过试验测试,是因为shell脚本的开头没有没有添加:
#!/bin/bash
的标记。
 
在shell脚本的第一行添加上后就没有问题了。
 
附一个脚本批量处理: 自动在首行添加 #!/bin/bash
In [1]: folder='/root/crontab_script'

In [2]: import os

In [3]: filelist=os.listdir(folder)

In [6]: def change_file(filename):
...: with open(filename,'r') as fp:
...: content=fp.read()
...: content=content.strip()
...: concat='#!/bin/bash\n'
...: content=concat+content
...: with open(filename,'w') as fp:
...: fp.write(content)
...:

In [7]: for file in filelist:
...: if file.endswith('.sh'):
...: full_path = os.path.join(folder,file)
...: change_file(full_path)
继续阅读 »
把执行的python命令写到shell里面,也给了+x权限,还是报这个错误
fork/exec /root/crontab_script/hello.sh: exec format error

单独执行shell的脚本是没有问题的。
 
经过试验测试,是因为shell脚本的开头没有没有添加:
#!/bin/bash
的标记。
 
在shell脚本的第一行添加上后就没有问题了。
 
附一个脚本批量处理: 自动在首行添加 #!/bin/bash
In [1]: folder='/root/crontab_script'

In [2]: import os

In [3]: filelist=os.listdir(folder)

In [6]: def change_file(filename):
...: with open(filename,'r') as fp:
...: content=fp.read()
...: content=content.strip()
...: concat='#!/bin/bash\n'
...: content=concat+content
...: with open(filename,'w') as fp:
...: fp.write(content)
...:

In [7]: for file in filelist:
...: if file.endswith('.sh'):
...: full_path = os.path.join(folder,file)
...: change_file(full_path)
收起阅读 »

cronsun 计划任务运行python脚本

在执行脚本那里,不能执行
 cd xxxxx && python xxx.py
这样的操作,这样貌似不会实际去执行
 
只能把上面的命令放到一个shell文件里面,比如worker.sh
然后把worker.sh 放到指定的位置,然后把这个shell的完整路径放入到 cronsun的计划任务的脚本里面。
 

PD19MdOZOi.png


chrome_IyOEpNaSm1.png

 
 
 
继续阅读 »
在执行脚本那里,不能执行
 cd xxxxx && python xxx.py
这样的操作,这样貌似不会实际去执行
 
只能把上面的命令放到一个shell文件里面,比如worker.sh
然后把worker.sh 放到指定的位置,然后把这个shell的完整路径放入到 cronsun的计划任务的脚本里面。
 

PD19MdOZOi.png


chrome_IyOEpNaSm1.png

 
 
  收起阅读 »

可转债费率最低5元 坑爹券商 -附市面上大部分主流券商的销户流程

最近看了家人的账户的交割单,没想到以前开的账户是这么坑的。 可转债的交易费率万2.5就算了,居然还没有免5。也就是买10张转债(1000元市值左右),就给了5元。。。。
 
新规后,现在转债费率沪深十万分5,而且没有最低5元这个坑。

 
所以果断销户,也不打算联系客服了。现在网上销户很简单。
附一个22个券商的网上销户流程表。里面涵盖了每个券商的销户截图流程


EXCEL_sZksIk4rEi.png



EXCEL_Un10aq59gQ.png


EXCEL_jDobyxgBcH.png


涵盖的销户券商列表:


 国泰君安
中信建投
兴业证券
光大证券
方正证券
中信证券
海通证券
中泰证券
申万宏源
东方证券
安信证券
东兴证券
东北证券
中投证券
银河证券
长江证券
国信证券
招商证券
平安证券
国金证券
华泰证券
东方财富



有具体每个券商的销户截图
可以到百度网盘下载这个excel表。
 
各大券商销户流程表
链接:https://pan.baidu.com/s/1VJMY5grLkghXZGktjpWupA 
提取码:40ov 

复制这段内容后打开百度网盘手机App,操作更方便哦
更多券商开户,请扫码联系:
可以在这里获取到更多券商的费率信息。
继续阅读 »
最近看了家人的账户的交割单,没想到以前开的账户是这么坑的。 可转债的交易费率万2.5就算了,居然还没有免5。也就是买10张转债(1000元市值左右),就给了5元。。。。
 
新规后,现在转债费率沪深十万分5,而且没有最低5元这个坑。

 
所以果断销户,也不打算联系客服了。现在网上销户很简单。
附一个22个券商的网上销户流程表。里面涵盖了每个券商的销户截图流程


EXCEL_sZksIk4rEi.png



EXCEL_Un10aq59gQ.png


EXCEL_jDobyxgBcH.png


涵盖的销户券商列表:


 国泰君安
中信建投
兴业证券
光大证券
方正证券
中信证券
海通证券
中泰证券
申万宏源
东方证券
安信证券
东兴证券
东北证券
中投证券
银河证券
长江证券
国信证券
招商证券
平安证券
国金证券
华泰证券
东方财富



有具体每个券商的销户截图
可以到百度网盘下载这个excel表。
 
各大券商销户流程表
链接:https://pan.baidu.com/s/1VJMY5grLkghXZGktjpWupA 
提取码:40ov 

复制这段内容后打开百度网盘手机App,操作更方便哦
更多券商开户,请扫码联系:
可以在这里获取到更多券商的费率信息。
收起阅读 »

message: 'can not read a block mapping entry; a multiline key may not be an implicit key at line 570

配置hexo 的评论和人生统计时,使用valine插件报错message: 'can not read a block mapping entry; a multiline key may not be an implicit key at line 570
 
后面才发现,因为yaml的配置文件的key value的格式问题,冒号: 后面要接一个空格!!!!
不然就是说格式不对了。
继续阅读 »
配置hexo 的评论和人生统计时,使用valine插件报错message: 'can not read a block mapping entry; a multiline key may not be an implicit key at line 570
 
后面才发现,因为yaml的配置文件的key value的格式问题,冒号: 后面要接一个空格!!!!
不然就是说格式不对了。 收起阅读 »

可转债投资体系


可转债投资体系
今天总结以前这段时间的经验,形成自己的一套可转债投资体系。

1. 买入价位决定成败。
在买入的那一刻,就可以知道这边买卖的胜算。不能买价格超过110以上的转债,切记。不要看标的,再好的标的,价格不美丽,买入也让自己陷入被动。不要说好公司的转债可以放宽买贵的,如果觉得是好公司,直接买正股。

2. 如果没有可以买的标的,一定要有耐心。 时刻未到而已。
2020年10月到12月,妖债横行,是个转债都被随便拉,无视正股涨跌,有些转债还涨破天际,一天100%+的涨幅。 把整体水位拉伸到一个120+的水平。 但是,这又如何? 2021年1月底,新债上市一只,破发一只。 最终满地90多元的转债,而且不断有跌破面值,跌破80多的。

记得当时自己的心态是贪心! 因为瞄定了鸿达转债,广汇转债,亚药转债,搜特转债,以为80多的转债要往70多,60多下移,事后看,当时没有及时大力加仓,错过了一个好价位。
所以设定的规则:跌破5元加仓一格,波动可以在-1到+1之间,也就是94-96之间加仓,89-91之间加仓,如此类推。

3. 110元以下,不能频繁做卖出操作
这个位置110以下卖出,会失去心理优势位置。比如90买的,105卖出,然后涨到115,跌到109,这个时候会有一种冲动要买回来,因为心理上怕后续涨到115或更高后的卖飞心态。 110以下尽量忍住不动。 130以后可以分批卖。所以这里要保证,100面值以下要尽量多买,不能经常做T把筹码给出掉了,失去心理优势价位。 因为如果你90卖的,95卖出,然后涨到98,这个时候你反而不会买,心理是想着它跌回到95以下才买入。从而造成后续该转债一飞冲天而你已经失去仓位了。
上面规则适合上班族,无时间看盘者。
如果有时间看盘,那么可以使用部分仓位进行市场风格的参与博弈。当然这部分是高波动部分,一般人不建议操作。
 
 
继续阅读 »

可转债投资体系
今天总结以前这段时间的经验,形成自己的一套可转债投资体系。

1. 买入价位决定成败。
在买入的那一刻,就可以知道这边买卖的胜算。不能买价格超过110以上的转债,切记。不要看标的,再好的标的,价格不美丽,买入也让自己陷入被动。不要说好公司的转债可以放宽买贵的,如果觉得是好公司,直接买正股。

2. 如果没有可以买的标的,一定要有耐心。 时刻未到而已。
2020年10月到12月,妖债横行,是个转债都被随便拉,无视正股涨跌,有些转债还涨破天际,一天100%+的涨幅。 把整体水位拉伸到一个120+的水平。 但是,这又如何? 2021年1月底,新债上市一只,破发一只。 最终满地90多元的转债,而且不断有跌破面值,跌破80多的。

记得当时自己的心态是贪心! 因为瞄定了鸿达转债,广汇转债,亚药转债,搜特转债,以为80多的转债要往70多,60多下移,事后看,当时没有及时大力加仓,错过了一个好价位。
所以设定的规则:跌破5元加仓一格,波动可以在-1到+1之间,也就是94-96之间加仓,89-91之间加仓,如此类推。

3. 110元以下,不能频繁做卖出操作
这个位置110以下卖出,会失去心理优势位置。比如90买的,105卖出,然后涨到115,跌到109,这个时候会有一种冲动要买回来,因为心理上怕后续涨到115或更高后的卖飞心态。 110以下尽量忍住不动。 130以后可以分批卖。所以这里要保证,100面值以下要尽量多买,不能经常做T把筹码给出掉了,失去心理优势价位。 因为如果你90卖的,95卖出,然后涨到98,这个时候你反而不会买,心理是想着它跌回到95以下才买入。从而造成后续该转债一飞冲天而你已经失去仓位了。
上面规则适合上班族,无时间看盘者。
如果有时间看盘,那么可以使用部分仓位进行市场风格的参与博弈。当然这部分是高波动部分,一般人不建议操作。
 
  收起阅读 »