Chrome插件批量清除浏览器的收藏夹中重复,无法访问的网址

闲聊绫波丽 发表了文章 • 0 个评论 • 1560 次浏览 • 2022-01-02 17:37 • 来自相关话题

这个chrome插件挺好用的:
 
Bookmarks clean up
 
chrome应用商场下载即可。
 
可以自动清除一些年代久远,无法访问的站点。
 
还有一些重复收藏的网址。
 
这个chrome插件挺好用的:
 
Bookmarks clean up
 
chrome应用商场下载即可。
 
可以自动清除一些年代久远,无法访问的站点。
 
还有一些重复收藏的网址。
 

揭露垃圾的短信收码平台

闲聊绫波丽 发表了文章 • 0 个评论 • 3090 次浏览 • 2022-01-02 12:21 • 来自相关话题

短信收码平台,主要用来注册一些临时的论坛, 不想泄露自己的隐私。 所以得找一些临时的手机号来收验证码。
 
一起的收码平台质量挺好的。
 
可是现在越来越烂了。
 
总结一些完全没有用的收码平台。 希望大家不要浪费时间在这些垃圾网站上浪费时间。
 
都是自己平时使用过的,在上面等了几分钟后,短信没收到,而上面的短信全是广告。
 
垃圾排名第一:(按搜索引擎出来的,大家就不要点这些网站)
 

无敌云短信验证码接收平台
https://www.clearcode.cn/

 
 

 
上面的基本都是套路,是一些商家的广告。并没有你的验证码。
 
 
 
  查看全部
短信收码平台,主要用来注册一些临时的论坛, 不想泄露自己的隐私。 所以得找一些临时的手机号来收验证码。
 
一起的收码平台质量挺好的。
 
可是现在越来越烂了。
 
总结一些完全没有用的收码平台。 希望大家不要浪费时间在这些垃圾网站上浪费时间。
 
都是自己平时使用过的,在上面等了几分钟后,短信没收到,而上面的短信全是广告。
 
垃圾排名第一:(按搜索引擎出来的,大家就不要点这些网站)
 

无敌云短信验证码接收平台
https://www.clearcode.cn/

 
 

 
上面的基本都是套路,是一些商家的广告。并没有你的验证码。
 
 
 
 

后生可畏 看到某个作者的github commit状态

网络李魔佛 发表了文章 • 0 个评论 • 1275 次浏览 • 2022-01-02 00:45 • 来自相关话题

基本每天保持绿色状态。
没有绿的3天应该是过年状态吧。
 
基本每天保持绿色状态。
没有绿的3天应该是过年状态吧。
 

ubuntu(centos)下golang下载libxml2 报错信息, go 安装libxml2

Golang李魔佛 发表了文章 • 0 个评论 • 1593 次浏览 • 2021-12-29 23:20 • 来自相关话题

ubuntu下golang下载libxml2 报错信息:$ go get -u github.com/lestrrat-go/libxml2
# pkg-config --cflags -- libxml-2.0 Package libxml-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libxml-2.0.pc' to the PKG_CONFIG_PATH environment variable
No package 'libxml-2.0' found pkg-config: exit status 1 ​ ​
 
因为系统少了个libxml2 开发包:

使用以下命令即可修复:sudo apt install libxml2-dev 
 
如果是centos的话,安装命令:yum install libxml2
yum install libxml2-devel
注意是 libxml2-devel !
别用那种下载源码编译的方法,能用yum就用yum,否则弄得系统一堆依赖问题。 查看全部
ubuntu下golang下载libxml2 报错信息:
$ go get -u github.com/lestrrat-go/libxml2                     
# pkg-config --cflags -- libxml-2.0 Package libxml-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libxml-2.0.pc' to the PKG_CONFIG_PATH environment variable
No package 'libxml-2.0' found pkg-config: exit status 1 ​ ​

 
因为系统少了个libxml2 开发包:

使用以下命令即可修复:
sudo apt install libxml2-dev
 
 
如果是centos的话,安装命令:
yum install libxml2
yum install libxml2-devel

注意是 libxml2-devel !
别用那种下载源码编译的方法,能用yum就用yum,否则弄得系统一堆依赖问题。

REST ful API的规范 delete方法不建议在body放入数据

网络李魔佛 发表了文章 • 0 个评论 • 1986 次浏览 • 2021-12-27 14:58 • 来自相关话题

毕竟delete参数是根据uri删除资源.
 
因为资源的唯一性,所以就没必要再在body里面放入其他的数据了.
 
什么? 通过uri不能确定资源的唯一? 那么你这个设计就不是REST规范了.
 
那PUT这些操作也无法准确更新资源了.
毕竟delete参数是根据uri删除资源.
 
因为资源的唯一性,所以就没必要再在body里面放入其他的数据了.
 
什么? 通过uri不能确定资源的唯一? 那么你这个设计就不是REST规范了.
 
那PUT这些操作也无法准确更新资源了.

摘自 网易音乐 评论

闲聊李魔佛 发表了文章 • 0 个评论 • 1366 次浏览 • 2021-12-27 12:54 • 来自相关话题

去年高三帮好朋友给实验班的男孩子写一封信 只有“山有木兮木有枝”七个字 想让他领会后半句心悦君兮君不知的含义 第二天男孩子主动来班里送信 还是昨天那封 他在后面补充到“心悦君兮君已知 奈何十二寒窗苦 待到金榜题名时” 后来这段故事无疾而终 愿你们遇到的每段感情都能有处安放

  查看全部


去年高三帮好朋友给实验班的男孩子写一封信 只有“山有木兮木有枝”七个字 想让他领会后半句心悦君兮君不知的含义 第二天男孩子主动来班里送信 还是昨天那封 他在后面补充到“心悦君兮君已知 奈何十二寒窗苦 待到金榜题名时” 后来这段故事无疾而终 愿你们遇到的每段感情都能有处安放


 

现在很多公众号都是粗制滥造, 代码也没经过验证 就贴上来害人

Golang李魔佛 发表了文章 • 0 个评论 • 1464 次浏览 • 2021-12-27 11:52 • 来自相关话题

来看看这个公众号 :  Golang来啦
 

 
你说函数签名的Counter写错就算了. 但是返回的也是一个指针呀......
 
正确写法
func NewNotSafeCounter() *NotSafeCounter {
return &NotSafeCounter{0}
}
 
  查看全部
来看看这个公众号 :  Golang来啦
 

 
你说函数签名的Counter写错就算了. 但是返回的也是一个指针呀......
 
正确写法
func NewNotSafeCounter() *NotSafeCounter {
return &NotSafeCounter{0}
}

 
 

可转债指数 vs 基金指数 vs 股票指数

闲聊李魔佛 发表了文章 • 0 个评论 • 1285 次浏览 • 2021-12-27 11:13 • 来自相关话题

 
上面这个图是3个百度指数图的对比. 描述的是百度每天搜索的收录次数
典型的周期图. 
 
山谷的地方是周六周天.
说明平时周末大家关心股市的人比平时锐减.  平时大伙都是上班时候看看行情. 一到周末,就不太关心行情.
 
看来上班摸鱼看股票的人不少.
 
  查看全部

 
上面这个图是3个百度指数图的对比. 描述的是百度每天搜索的收录次数
典型的周期图. 
 
山谷的地方是周六周天.
说明平时周末大家关心股市的人比平时锐减.  平时大伙都是上班时候看看行情. 一到周末,就不太关心行情.
 
看来上班摸鱼看股票的人不少.
 
 

内网穿透软件 frp和ngrok的比较

网络李魔佛 发表了文章 • 0 个评论 • 8866 次浏览 • 2021-12-26 18:23 • 来自相关话题

内网穿透就是访问某个内网主机.
 
可以理解为一个vpn网络. 同在一个内网. 不过原理不一样.

内网穿透是绑定的某个端口的数据转发与接收.

 
前提都是需要一台有公网ip的主机,通过这个主机作为跳板, 先访问这个跳板主机, 然后把数据转发到链接到内网.
 
那么比较frp和ngork的各个方面,从而让用户了解各自的需求:
 
1. 开源
frp 开源免费,ngrok1.x开源,但2.x开始收费

2. 配置难度
二者都是用go编写的,所以基本可以跨平台是,linux,windows都可以。
都需要一个客户端,一个服务端

配置而言,frp要比ngrok配置容易多了. 
 
虽然都是go写的.不过ngrok的配置比较麻烦,而且go get 经常拉不下来.
 
推荐frp, 直接下载下来就可以使用了.

 
可以自定义域名. 即使域名没有备案,也可以直接用ip访问.

 
ngrok有个随机的域名,不过那个速度有限速,用来偶尔测试一下还可以。 长期用来工作或者建站肯定不行。
 
 ngrok 2.x 官网提供下载的版本需要注册,获取token,才能使用
 
ngrok config add-authtoken <token>

然后
ngrok http 80
监听本地的80端口。
 
  查看全部
内网穿透就是访问某个内网主机.
 
可以理解为一个vpn网络. 同在一个内网. 不过原理不一样.

内网穿透是绑定的某个端口的数据转发与接收.

 
前提都是需要一台有公网ip的主机,通过这个主机作为跳板, 先访问这个跳板主机, 然后把数据转发到链接到内网.
 
那么比较frp和ngork的各个方面,从而让用户了解各自的需求:
 
1. 开源
frp 开源免费,ngrok1.x开源,但2.x开始收费

2. 配置难度
二者都是用go编写的,所以基本可以跨平台是,linux,windows都可以。
都需要一个客户端,一个服务端

配置而言,frp要比ngrok配置容易多了. 
 
虽然都是go写的.不过ngrok的配置比较麻烦,而且go get 经常拉不下来.
 
推荐frp, 直接下载下来就可以使用了.

 
可以自定义域名. 即使域名没有备案,也可以直接用ip访问.

 
ngrok有个随机的域名,不过那个速度有限速,用来偶尔测试一下还可以。 长期用来工作或者建站肯定不行。
 
 ngrok 2.x 官网提供下载的版本需要注册,获取token,才能使用
 
 ngrok config add-authtoken <token>

然后
 ngrok http 80
监听本地的80端口。
 
 

微信公众号token验证失败的原因

网络李魔佛 发表了文章 • 0 个评论 • 2113 次浏览 • 2021-12-24 23:42 • 来自相关话题

主要是文档写的过于模糊(比较含蓄,实际上是垃圾到不行)
 
因为提供的文档,用的是python2的代码:
import hashlib
import web

class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxxx" #请按照公众平台官网\基本配置中信息填写

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print "handle/GET func: hashcode, signature: ", hashcode, signature
if hashcode == signature:
return echostr
else:
return ""
except Exception, Argument:
return Argument
如果按照上面的代码,放到python3上执行, 实际返回的 echostr 的值是错的. 所以服务器拿这个错的值,匹配, 会总是失败.
 
什么年代了, 一个demo 也不换个新一点的python版本.
 
提供一个新版的python3通过检验的代码:
 
 
# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-
# filename: handle.py

import hashlib
import web

class Handle(object):

def POST(self):
pass

# get方法,验证token
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "token success!"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "123456abcdefg" # 请按照公众平台官网\基本配置中信息填写,两个token保持一致

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode("utf-8"))
sha1.update(list[1].encode("utf-8"))
sha1.update(list[2].encode("utf-8"))
hashcode = sha1.hexdigest() # 获取加密串

# 验证
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""

except Exception as Argument:
return Argument 查看全部
主要是文档写的过于模糊(比较含蓄,实际上是垃圾到不行)
 
因为提供的文档,用的是python2的代码:
import hashlib
import web

class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxxx" #请按照公众平台官网\基本配置中信息填写

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print "handle/GET func: hashcode, signature: ", hashcode, signature
if hashcode == signature:
return echostr
else:
return ""
except Exception, Argument:
return Argument

如果按照上面的代码,放到python3上执行, 实际返回的 echostr 的值是错的. 所以服务器拿这个错的值,匹配, 会总是失败.
 
什么年代了, 一个demo 也不换个新一点的python版本.
 
提供一个新版的python3通过检验的代码:
 
 
# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-
# filename: handle.py

import hashlib
import web

class Handle(object):

def POST(self):
pass

# get方法,验证token
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "token success!"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "123456abcdefg" # 请按照公众平台官网\基本配置中信息填写,两个token保持一致

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode("utf-8"))
sha1.update(list[1].encode("utf-8"))
sha1.update(list[2].encode("utf-8"))
hashcode = sha1.hexdigest() # 获取加密串

# 验证
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""

except Exception as Argument:
return Argument

golang的时间格式化 做法有点像格力手机的开机画面是董小姐

闲聊李魔佛 发表了文章 • 0 个评论 • 1332 次浏览 • 2021-12-20 13:01 • 来自相关话题

网络上的开发者基本都是一路吐槽。
 
过去用java,python,php,等语言,将一个时间格式化成一个字符串都是用“yyy-MM-dd hh:mm:ss”之类的方法,golang 的格式化方法真令我大开眼界

先看官方文档说明:

func (Time) Format
func (t Time) Format(layout string) string
Format returns a textual representation of the time value formatted according to layout, which defines the format by showing how the reference time, defined to be

Mon Jan 2 15:04:05 -0700 MST 2006
would be displayed if it were the value; it serves as an example of the desired output. The same display rules will then be applied to the time value. Predefined layouts ANSIC, UnixDate, RFC3339 and others describe standard and convenient representations of the reference time. For more information about the formats and the definition of the reference time, see the documentation for ANSIC and the other constants defined by this package.


下面给个代码:

fmt.Println(time.Now().Format("2006-01-02 150405"))

要注意那时间,只能是2006-01-02 15:04:05分,其它的时间都不行,真是够绝。
 做法有点像格力手机的开机画面是董小姐。
用个语言还得记住你golang的生日?? 查看全部
网络上的开发者基本都是一路吐槽。
 
过去用java,python,php,等语言,将一个时间格式化成一个字符串都是用“yyy-MM-dd hh:mm:ss”之类的方法,golang 的格式化方法真令我大开眼界

先看官方文档说明:

func (Time) Format
func (t Time) Format(layout string) string
Format returns a textual representation of the time value formatted according to layout, which defines the format by showing how the reference time, defined to be

Mon Jan 2 15:04:05 -0700 MST 2006
would be displayed if it were the value; it serves as an example of the desired output. The same display rules will then be applied to the time value. Predefined layouts ANSIC, UnixDate, RFC3339 and others describe standard and convenient representations of the reference time. For more information about the formats and the definition of the reference time, see the documentation for ANSIC and the other constants defined by this package.


下面给个代码:

fmt.Println(time.Now().Format("2006-01-02 150405"))

要注意那时间,只能是2006-01-02 15:04:05分,其它的时间都不行,真是够绝。

 做法有点像格力手机的开机画面是董小姐。
用个语言还得记住你golang的生日??

golang json Unmarshal 无法修改结构体的值。传入指针

Golang李魔佛 发表了文章 • 0 个评论 • 1887 次浏览 • 2021-12-20 12:59 • 来自相关话题

假如我的json文件的格式如下:
 { "username": "root", "password": "123456", "host": "1.1.1.1.", "port": 3306, "db": "admin" }

然后我的定义的结构体:
 
type T struct {

username string `json:"username"`
password string `json:"password"`
host string `json:"host"`
port int `json:"port"`
db string `json:"db"`

}

然后程序里面解析json的代码:var t T
data, err := ioutil.ReadFile(filename)
fmt.Println("read from file")
//fmt.Println(string(data))
if err != nil {
fmt.Println("in error")
fmt.Println(err)
return err
}
err = json.Unmarshal(data, &t)
if err != nil {
fmt.Println("error ")
fmt.Println(err)
return err
}
fmt.Println("outpout ")
fmt.Printf("%v\n", t)
fmt.Println(t)
发现是无法把t的值修改为json文件里面的值,最后的记过输出,还是一个零值的结果体。

后面知道问题所在了,如果定义的结构体的首字母小写的时候,包外的反射是无法修改结构体的值的,也就是只能只读。

所以只需要把结构体的首字母改为大写,问题就可以解决了。type T struct {
Username string `json:"username"`
Password string `json:"password"`
Host string `json:"host"`
Port int `json:"port"`
Db string `json:"db"`
}
json文件里面不用修改,因为
Unmarshal映射的时候可以适配大小写。
  查看全部
假如我的json文件的格式如下:
 
{ "username": "root", "password": "123456", "host": "1.1.1.1.", "port": 3306, "db": "admin" }

然后我的定义的结构体:
 
type T struct { 

username string `json:"username"`
password string `json:"password"`
host string `json:"host"`
port int `json:"port"`
db string `json:"db"`

}


然后程序里面解析json的代码:
var t T
data, err := ioutil.ReadFile(filename)
fmt.Println("read from file")
//fmt.Println(string(data))
if err != nil {
fmt.Println("in error")
fmt.Println(err)
return err
}
err = json.Unmarshal(data, &t)
if err != nil {
fmt.Println("error ")
fmt.Println(err)
return err
}
fmt.Println("outpout ")
fmt.Printf("%v\n", t)
fmt.Println(t)

发现是无法把t的值修改为json文件里面的值,最后的记过输出,还是一个零值的结果体。

后面知道问题所在了,如果定义的结构体的首字母小写的时候,包外的反射是无法修改结构体的值的,也就是只能只读。

所以只需要把结构体的首字母改为大写,问题就可以解决了。
type T struct {
Username string `json:"username"`
Password string `json:"password"`
Host string `json:"host"`
Port int `json:"port"`
Db string `json:"db"`
}

json文件里面不用修改,因为
Unmarshal映射的时候可以适配大小写。
 

为什么现在还有那么多在线的gonlang 字符串生成json struct的网站? Goland IDE一个快捷方式帮你搞定

Golang李魔佛 发表了文章 • 0 个评论 • 1277 次浏览 • 2021-12-20 01:00 • 来自相关话题

在golanad的ide上,敲入 type xx struct{
}
 
在出现的generate from json的页面,把json的字符串输入进去。
 
IDE即可帮你转换为对应的结构体了。 根本就没有在线IDE什么事情了。
在golanad的ide上,敲入 type xx struct{
}
 
在出现的generate from json的页面,把json的字符串输入进去。
 
IDE即可帮你转换为对应的结构体了。 根本就没有在线IDE什么事情了。

golang根据不同返回解析不同结构的json

Golang李魔佛 发表了文章 • 0 个评论 • 1587 次浏览 • 2021-12-20 00:35 • 来自相关话题

// 数据源
{"type":"a_number", "data":{"somenumber":1234}}
{"type":"b_string", "data":{"somestring":"a string", "anotherstring": "a second string"}}` 
如何解析上面返回的json结构体
 
答:json.RawMessage
 
type Head struct {
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}


var msg Head

json.Unmarshal([]byte(jsonString), &msg)

switch msg.Type {
case "a_number":
var detail A
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeNumber)
case "b_string":
var detail B
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeString)
default:
fmt.Printf("I don't know about type %s!\n", msg.Type)
}
 
就可以解析上面的不规则的结构体了。
 
  查看全部
// 数据源
{"type":"a_number", "data":{"somenumber":1234}}
{"type":"b_string", "data":{"somestring":"a string", "anotherstring": "a second string"}}`
 
如何解析上面返回的json结构体
 
答:json.RawMessage
 
type Head struct {
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}


var msg Head

json.Unmarshal([]byte(jsonString), &msg)

switch msg.Type {
case "a_number":
var detail A
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeNumber)
case "b_string":
var detail B
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeString)
default:
fmt.Printf("I don't know about type %s!\n", msg.Type)
}

 
就可以解析上面的不规则的结构体了。
 
 

现在还有哪些券商可以万一免五?

股票绫波丽 发表了文章 • 0 个评论 • 2951 次浏览 • 2021-12-16 12:40 • 来自相关话题

不得不说,最近的监管以及严禁大V低佣开户,加上券商之间互相投诉,撕皮,很多免五的券商已经暂时或永久关闭关闭了免五的通道。
 
不过如果要开免五还是有办法的,一些券商即使没有免五,费率也是很优惠的。
 
 

 

 
普遍转债都是是百万分之二,etf万0.5的费率,股票万1到万1.2,基本这里的券商到手的费率都是最低的。如果有更低的券商,也欢迎推荐,可以给你发个大大的红包。

需要的可以联系:
  查看全部
不得不说,最近的监管以及严禁大V低佣开户,加上券商之间互相投诉,撕皮,很多免五的券商已经暂时或永久关闭关闭了免五的通道。
 
不过如果要开免五还是有办法的,一些券商即使没有免五,费率也是很优惠的。
 
 

 

 
普遍转债都是是百万分之二,etf万0.5的费率,股票万1到万1.2,基本这里的券商到手的费率都是最低的。如果有更低的券商,也欢迎推荐,可以给你发个大大的红包。

需要的可以联系:
 

vs code 无法启动jupyter notebook 修复 亲测

python李魔佛 发表了文章 • 0 个评论 • 3239 次浏览 • 2021-12-16 12:12 • 来自相关话题

错误信息:failed to start INotebook in kernel, UI Disabled = false s [Error]: Unable to start Kernel 'base (Python 3.8.3)' due to connection timeout. View Jupyter [log](command:jupyter.viewOutput) for further detail





之前一直运行得好好的。不知道安装了什么依赖库后就这样了。。
 
在国外网站找了一通后,找到了解决办法:
 pip install traitlets==4.3.3
不得不感慨,国外大神多,国内csdn乱ctrl cv.
 
  查看全部
错误信息:
failed to start INotebook in kernel, UI Disabled = false s [Error]: Unable to start Kernel 'base (Python 3.8.3)' due to connection timeout.  View Jupyter [log](command:jupyter.viewOutput) for further detail

NM3I8.png


之前一直运行得好好的。不知道安装了什么依赖库后就这样了。。
 
在国外网站找了一通后,找到了解决办法:
 
pip install traitlets==4.3.3

不得不感慨,国外大神多,国内csdn乱ctrl cv.
 
 

QMT代码详解<一> 行业ETF轮动

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 2724 次浏览 • 2021-12-15 17:33 • 来自相关话题

回测代码如下: 代码里面加入了个人理解的注释。
 
#coding:gbk

'''
回测模型示例(非实盘交易策略)

本策略每隔1个月定时触发计算1000能源(399381.SZ)、1000材料(399382.SZ)、1000工业(399383.SZ)、
1000可选(399384.SZ)、1000消费(399385.SZ)、1000医药(399386.SZ)这几个行业指数过去
20个交易日的收益率并选取了收益率最高的指数的成份股并获取了他们的市值数据
随后把仓位调整至市值最大的5只股票上
该策略在股票指数日线下运行
'''
import numpy as np
import math
def init(ContextInfo):
MarketPosition ={}
ContextInfo.MarketPosition = MarketPosition #初始化持仓
index_universe = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
index_stocks = []
for index in index_universe:
for stock in ContextInfo.get_sector(index): # 获取指数的成分股
index_stocks.append(stock)
ContextInfo.set_universe(index_universe+index_stocks) #设定股票池,
ContextInfo.day = 20
ContextInfo.ratio = 0.8
ContextInfo.holding_amount = 5
ContextInfo.accountID='testS'

def handlebar(ContextInfo):
buy_condition = False
sell_condition = False
d = ContextInfo.barpos
print(d)
lastdate = timetag_to_datetime(ContextInfo.get_bar_timetag(d - 1), '%Y%m%d')
date = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y%m%d')
print(date)
index_list = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
return_index = []
weight = ContextInfo.ratio/ContextInfo.holding_amount
size_dict = {}
if (float(date[-4:-2]) != float(lastdate[-4:-2])):
#print '---------------------------------------------------------------------------------'
#print '当前交易日',date,date[-4:-2] 20210101 获取到的月份不一样,这样在每个月初会执行一次这个函数

# 获取的是股票池的
his = ContextInfo.get_history_data(21,'1d','close')

#print "his",his,timetag_to_datetime(ContextInfo.get_bar_timetag(d),"%Y%m%d")
for k in list(his.keys()):
if len(his[k]) == 0:
del his[k]
for index in index_list:
ratio = 0
try:
ratio = (his[index][-2] - his[index][0])/his[index][0]
except KeyError:
print('key error:' + index)
except IndexError:
print('list index out of range:' + index)
return_index.append(ratio)
# 获取指定数内收益率表现最好的行业
best_index = index_list[np.argmax(return_index)]
#print '当前最佳行业是:', ContextInfo.get_stock_name(best_index)[3:]+'行业'
# 获取当天有交易的股票
index_stock = ContextInfo.get_sector(best_index)
stock_available = []
for stock in index_stock:
if ContextInfo.is_suspended_stock(stock) == False: # 是否停牌
stock_available.append(stock)

for stock in stock_available:
if stock in list(his.keys()):
#目前历史流通股本取不到,暂用总股本
if len(his[stock]) >= 2:
stocksize =his[stock][-2] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
elif len(his[stock]) == 1:
stocksize =his[stock][-1] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
else:
return
size_sorted = sorted(list(size_dict.items()), key = lambda item:item[1]) # 根据股本顺序排序
pre_holding = []

for tuple in size_sorted[-ContextInfo.holding_amount:]: # 最好不要占用关键词
pre_holding.append(tuple[0])
#print '买入备选',pre_holding
#函数下单
if len(pre_holding) > 0:
sellshort_list = []
for stock in list(ContextInfo.MarketPosition.keys()): # 遍历持仓,如果不在当前条件范围内,卖出
if stock not in pre_holding and (stock in list(his.keys())):
order_shares(stock,-ContextInfo.MarketPosition[stock],'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('sell',stock)
sell_condition = True
sellshort_list.append(stock)
if len(sellshort_list) >0: # 这句多余
for stock in sellshort_list:
del ContextInfo.MarketPosition[stock]

for stock in pre_holding:
if stock not in list(ContextInfo.MarketPosition.keys()): # 买入
Lots = math.floor(ContextInfo.ratio * (1.0/len(pre_holding)) * ContextInfo.capital / (his[stock][-1] * 100))
order_shares(stock,Lots *100,'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('buy',stock)
buy_condition = True
ContextInfo.MarketPosition[stock] = Lots *100






如果遇到不懂的,可以关注公众号咨询: 查看全部
回测代码如下: 代码里面加入了个人理解的注释。
 
#coding:gbk

'''
回测模型示例(非实盘交易策略)

本策略每隔1个月定时触发计算1000能源(399381.SZ)、1000材料(399382.SZ)、1000工业(399383.SZ)、
1000可选(399384.SZ)、1000消费(399385.SZ)、1000医药(399386.SZ)这几个行业指数过去
20个交易日的收益率并选取了收益率最高的指数的成份股并获取了他们的市值数据
随后把仓位调整至市值最大的5只股票上
该策略在股票指数日线下运行
'''
import numpy as np
import math
def init(ContextInfo):
MarketPosition ={}
ContextInfo.MarketPosition = MarketPosition #初始化持仓
index_universe = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
index_stocks = []
for index in index_universe:
for stock in ContextInfo.get_sector(index): # 获取指数的成分股
index_stocks.append(stock)
ContextInfo.set_universe(index_universe+index_stocks) #设定股票池,
ContextInfo.day = 20
ContextInfo.ratio = 0.8
ContextInfo.holding_amount = 5
ContextInfo.accountID='testS'

def handlebar(ContextInfo):
buy_condition = False
sell_condition = False
d = ContextInfo.barpos
print(d)
lastdate = timetag_to_datetime(ContextInfo.get_bar_timetag(d - 1), '%Y%m%d')
date = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y%m%d')
print(date)
index_list = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
return_index = []
weight = ContextInfo.ratio/ContextInfo.holding_amount
size_dict = {}
if (float(date[-4:-2]) != float(lastdate[-4:-2])):
#print '---------------------------------------------------------------------------------'
#print '当前交易日',date,date[-4:-2] 20210101 获取到的月份不一样,这样在每个月初会执行一次这个函数

# 获取的是股票池的
his = ContextInfo.get_history_data(21,'1d','close')

#print "his",his,timetag_to_datetime(ContextInfo.get_bar_timetag(d),"%Y%m%d")
for k in list(his.keys()):
if len(his[k]) == 0:
del his[k]
for index in index_list:
ratio = 0
try:
ratio = (his[index][-2] - his[index][0])/his[index][0]
except KeyError:
print('key error:' + index)
except IndexError:
print('list index out of range:' + index)
return_index.append(ratio)
# 获取指定数内收益率表现最好的行业
best_index = index_list[np.argmax(return_index)]
#print '当前最佳行业是:', ContextInfo.get_stock_name(best_index)[3:]+'行业'
# 获取当天有交易的股票
index_stock = ContextInfo.get_sector(best_index)
stock_available = []
for stock in index_stock:
if ContextInfo.is_suspended_stock(stock) == False: # 是否停牌
stock_available.append(stock)

for stock in stock_available:
if stock in list(his.keys()):
#目前历史流通股本取不到,暂用总股本
if len(his[stock]) >= 2:
stocksize =his[stock][-2] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
elif len(his[stock]) == 1:
stocksize =his[stock][-1] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
else:
return
size_sorted = sorted(list(size_dict.items()), key = lambda item:item[1]) # 根据股本顺序排序
pre_holding = []

for tuple in size_sorted[-ContextInfo.holding_amount:]: # 最好不要占用关键词
pre_holding.append(tuple[0])
#print '买入备选',pre_holding
#函数下单
if len(pre_holding) > 0:
sellshort_list = []
for stock in list(ContextInfo.MarketPosition.keys()): # 遍历持仓,如果不在当前条件范围内,卖出
if stock not in pre_holding and (stock in list(his.keys())):
order_shares(stock,-ContextInfo.MarketPosition[stock],'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('sell',stock)
sell_condition = True
sellshort_list.append(stock)
if len(sellshort_list) >0: # 这句多余
for stock in sellshort_list:
del ContextInfo.MarketPosition[stock]

for stock in pre_holding:
if stock not in list(ContextInfo.MarketPosition.keys()): # 买入
Lots = math.floor(ContextInfo.ratio * (1.0/len(pre_holding)) * ContextInfo.capital / (his[stock][-1] * 100))
order_shares(stock,Lots *100,'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('buy',stock)
buy_condition = True
ContextInfo.MarketPosition[stock] = Lots *100






如果遇到不懂的,可以关注公众号咨询:

Go 测试题1

Golang李魔佛 发表了文章 • 0 个评论 • 1341 次浏览 • 2021-12-15 12:32 • 来自相关话题

问一个基础
func main() {
v := [...]int{1: 2, 3: 4}
fmt.Println( len(v))
}

这个为什么长度是 4?
 
 
答案:
v数组分配内存[0,2,0,4],所以长度为4。 查看全部
问一个基础
func main() {
v := [...]int{1: 2, 3: 4}
fmt.Println( len(v))
}

这个为什么长度是 4?
 
 
答案:
v数组分配内存[0,2,0,4],所以长度为4。

图床网站横向对比 测试

网络马化云 发表了文章 • 0 个评论 • 1516 次浏览 • 2021-12-13 18:44 • 来自相关话题

1. SM.SM
网站提供登录,可是,一直是登录不了,点击按钮点击后是一直没有反应。后台做的不好。 
不能登录,也就是你上传的图片,就下次想找回,也很难找,除非你找回你的原文章,在原来的文章里面找出原来的链接。
 
然后图片的话遇到一些美女图会经常误删,也就是这样子的。
 

 
就是你的图片链接被吃了。 这也侧面说明图床网站对你的图片进行审查的。 
 
推荐指数:0
 
 
2. imgUrl
这个网站的图片也是有审查的,一般而言,二维码就是直接会被删除,所以不建议拿来存放一些公众号二维码等传播性的工具。
 
优点是速度比较快
 
推荐指数:3星
 
3. 七牛
上传下载速度快,并且正常的图片不会屏蔽,二维码也不会被屏蔽。支持很多的工具。可以自定义名字,也就是你上传的图片的URL不再是一串随机的字符,而是可以设定为指定日期,或者你的原来的文件名。
这样对于查找本地文件,或者根据本地的文件名,查找线上的图片文件,都是很有李的。
 
但是,部署这个有点难度,需要配置一些服务器的内容。比如需要通过API生产token,才可以放入到sharex中,并且需要定时更新。
 
推荐指数:5星
  查看全部
1. SM.SM
网站提供登录,可是,一直是登录不了,点击按钮点击后是一直没有反应。后台做的不好。 
不能登录,也就是你上传的图片,就下次想找回,也很难找,除非你找回你的原文章,在原来的文章里面找出原来的链接。
 
然后图片的话遇到一些美女图会经常误删,也就是这样子的。
 

 
就是你的图片链接被吃了。 这也侧面说明图床网站对你的图片进行审查的。 
 
推荐指数:0
 
 
2. imgUrl
这个网站的图片也是有审查的,一般而言,二维码就是直接会被删除,所以不建议拿来存放一些公众号二维码等传播性的工具。
 
优点是速度比较快
 
推荐指数:3星
 
3. 七牛
上传下载速度快,并且正常的图片不会屏蔽,二维码也不会被屏蔽。支持很多的工具。可以自定义名字,也就是你上传的图片的URL不再是一串随机的字符,而是可以设定为指定日期,或者你的原来的文件名。
这样对于查找本地文件,或者根据本地的文件名,查找线上的图片文件,都是很有李的。
 
但是,部署这个有点难度,需要配置一些服务器的内容。比如需要通过API生产token,才可以放入到sharex中,并且需要定时更新。
 
推荐指数:5星
 

毕业7年,白手起家到资产千万,我的6个致富发财赚钱秘诀 --观后感

股票李魔佛 发表了文章 • 0 个评论 • 1960 次浏览 • 2021-12-09 15:46 • 来自相关话题

看了油管上 土妹的视频,《毕业7年,白手起家到资产千万,我的6个致富发财赚钱秘诀》

她总结了几点,并且有人在评论里面总结了。
 1、有时候选择大于努力(投资炒股->炒美股)
2、不努力就没有选择的机会(名校本科+研究生+充分准备面试技巧+争取工作调动)
3、关键点很重要,在最关键的时候,必须全力一击!
4、富贵险中求,适当冒一点险(风控能力)
5、越早开始存钱,越好
6、打工是发不了财的、但是前期要积累工作经验和锻炼品质,竭尽全力把工作做好!再想办法开拓其他的赚钱方式! 
基本都是很认同她的说法。
以后需要不断地思考,思考未来。该集中努力的地方得一定努力才行。
 
最后附上视频链接:
https://www.youtube.com/watch?v=094BcDIc0LM
 
  查看全部
看了油管上 土妹的视频,《毕业7年,白手起家到资产千万,我的6个致富发财赚钱秘诀》

她总结了几点,并且有人在评论里面总结了。
 
1、有时候选择大于努力(投资炒股->炒美股)
2、不努力就没有选择的机会(名校本科+研究生+充分准备面试技巧+争取工作调动)
3、关键点很重要,在最关键的时候,必须全力一击!
4、富贵险中求,适当冒一点险(风控能力)
5、越早开始存钱,越好
6、打工是发不了财的、但是前期要积累工作经验和锻炼品质,竭尽全力把工作做好!再想办法开拓其他的赚钱方式!
 
基本都是很认同她的说法。
以后需要不断地思考,思考未来。该集中努力的地方得一定努力才行。
 
最后附上视频链接:
https://www.youtube.com/watch?v=094BcDIc0LM
 
 

github pages是可以被百度检索到的,网上的文章都是瞎扯

网络李魔佛 发表了文章 • 0 个评论 • 1289 次浏览 • 2021-12-09 14:13 • 来自相关话题

 
有图有证。
 
看来还是继续用回github pages吧。
 
 

 
有图有证。
 
看来还是继续用回github pages吧。
 
 

gitee pages 文章需要审核才能发布

闲聊李魔佛 发表了文章 • 0 个评论 • 2515 次浏览 • 2021-12-09 08:41 • 来自相关话题

最近用gitee pages部署了一个写文字的地方。
 写了一篇关于某国歌手的文章,内容实际只有一句话,配了一张百度图片上出来的贴图。
 
然后按照原来的方法,hexo g -> hexo d
部署到码云gitee上。
 
然后过了一天发现缓存没有更新。
 
第二天,缓存依然没有更新。
 
后面登录上去看了一下,发现说内容违规。我去。
 
原来这个gitee pages 还要这样审核一下才能通过。这样就没多少意思了。 
 
关键这个gitee pages 是每次要git push到服务器后,都要手动在网页端,点一下更新按钮。。。。

遂删除repo了,say bye bye to gitee。
 

  查看全部
最近用gitee pages部署了一个写文字的地方。
 写了一篇关于某国歌手的文章,内容实际只有一句话,配了一张百度图片上出来的贴图。
 
然后按照原来的方法,hexo g -> hexo d
部署到码云gitee上。
 
然后过了一天发现缓存没有更新。
 
第二天,缓存依然没有更新。
 
后面登录上去看了一下,发现说内容违规。我去。
 
原来这个gitee pages 还要这样审核一下才能通过。这样就没多少意思了。 
 
关键这个gitee pages 是每次要git push到服务器后,都要手动在网页端,点一下更新按钮。。。。

遂删除repo了,say bye bye to gitee。
 

 

hexo下的markdown文件无法生成html文件

网络李魔佛 发表了文章 • 0 个评论 • 1518 次浏览 • 2021-12-09 02:01 • 来自相关话题

 
hexo下的source/_post/ 下的markdown文件后缀只能md 小写。 大写是识别不到,也就无法生成html文件了。
  查看全部
 
hexo下的source/_post/ 下的markdown文件后缀只能md 小写。 大写是识别不到,也就无法生成html文件了。
 

优矿回测可转债 代码 教程

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 4898 次浏览 • 2021-12-09 00:44 • 来自相关话题

不少投资者在投资的过程中,都想要回测自己的策略或者验证自己的想法. 不少读者也在后台留言,能否写写入门类的教程.

可是碍于非科班出生, 对于编程的一窍不通, 所以大部分止步于简单的数据统计.

比如采用excel对采集来的数据,手工测试与验证, 高级点的可以应用一些excel函数进行简单回测.

这里会有一个烦人且第一大障碍, 就是需要有采集来的数据. 首先保证这个数据的完整性与准确性. 这一步其实已经过滤掉想要回测的80%的人了. 具体优矿支持的数据。
 
 
优矿支持的数据
股票:沪深交易所股票的基本信息以及日/分钟级别的股票行情。 财务报表:沪深港上市公司披露的2007年会计准则变更以来的所有财务报表数据,包含三大报表和财报附注等细节。 公司行为:沪深上市公司业绩预告,业绩快报,IPO,配股,分红,拆股,股改等信息。 基金:场内外各类基金的基本信息,日/分钟级别的场内基金行情,日级别的场外基金净值,以及基金资产配置,收益情况,净值调整等信息。 期货:国内四大期货交易所期货合约的基本信息,日/分钟的期货行情,以及国债期货的转换因子等信息。 指数:国内外指数基本信息,日/分钟级别的指数行情,以及指数成分构成情况,指数成分股权重情况等信息。 港股:香港交易所股票基本信息以及日级别的股票行情。 大宗商品:国内各个品种(包括期货合约可交割品种)的大宗商品现货价格行情,以及产销量,库存等信息。 债券:债券/回购基本信息,日级别的债券/回购行情,以及发行上市,付息,利率,评级和评级变动,债券发行人评级及变动,担保人评级及变动等信息。 期权:上交所期权合约的基本信息,日/分钟级别的期权行情,以及每日盘前静态数据等信息。 宏观产业:中国及全球各国宏观指标,行业经济指标等数据。

特色数据
股票/指数等品种的量化因子库 雪球、股吧等社交媒体数据 主流媒体新闻文本和结构化数据 主流渠道公告文本和结构化数据 淘宝、天猫等电商数据

其实其他的聚框,米宽,箩筐等等,都是大同小异的,本文只是挑选笔者使用比较多的优矿来介绍. 不过现在优矿并不支持实盘.

本文只是做一个量化平台框架的基本介绍, 后续的文章会有进阶, 加入买卖操作, 计算最大回撤, 以及更为复杂的多因子回测. 只要有的数据,基本都可以拿来加入到你的模型之中.
 
##################################################################

因为优矿本身并不支持可转债的交易,所以系统内置的order,buy,sell函数是无法应用到可转债上面。

不过只要能够获取到每日的行情数据,那么我们就可以自己构造一个交易系统。

核心就就是每次保存你的持仓信息,等到下一次调仓时,对持仓进行比较,对于调出的转债进行移除,新加的转债进行加入。 然后统计一下当前市值,记录下来,就可以得到收益率曲线。
 
部分代码如下:import datetime

start = '2018-01-01' # 回测起始时间
end = '2021-05-28' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 5 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd' 时间间隔的单位为交易日,
hold_num = 10 # 持有转债的个数


def initialize(context):
global MyPosition, HighValue, MyCash, Withdraw, HoldRank, HoldNum,Start_Cash
MyPosition = {} #持仓
MyCash = 1000000 #现金
Start_Cash= 1000000
HighValue = MyCash #最高市值
Withdraw = 0 #最大回撤
HoldRank = hold_num #排名多少之后卖出
HoldNum = hold_num #持债支数

def bonds(beginDate=u"20170101",endDate=u"20201215",EB_ENABLE=False):
code_set = set()
df = DataAPI.MktConsBondPremiumGet(SecID=u"",
tickerBond=u"",
beginDate=beginDate,
endDate=endDate,
field=u"",
pandas="1")

cb_df = df.tickerBond.str.startswith(('12', '11'))
df = df[cb_df]
cb_df = df.tickerBond.str.startswith('117')
df = df[~cb_df]
if not EB_ENABLE:
eb = df.secShortNameBond.str.match('\d\d.*?E[123B]') # TODO 判断EB是否过滤
df = df[~eb]

ticker_list =
for _, row in df[['tickerBond', 'secShortNameBond', 'tickerEqu']].iterrows():
if row['tickerBond'] not in code_set:
ticker_list.append((row['tickerBond'], row['secShortNameBond'], row['tickerEqu']))
code_set.add(row['tickerBond'])
return list(code_set)


def handle_data(context):
global MyPosition, HighValue, MyCash, Withdraw, HoldRank, HoldNum,Start_Cash

today_date = context.now.strftime('%Y%m%d')

#每天重新计算双低排名
ticker_list=bonds(today_date,today_date)
data = DataAPI.MktConsBondPerfGet(beginDate=today_date,endDate=today_date,secID='',tickerBond=ticker_list,
tickerEqu=u"",field=u"",pandas="1")
data['secID']=data['tickerBond']
data.set_index('secID',inplace=True)
data['DoubleLow'] = data['closePriceBond'] + data['bondPremRatio']
data = data.sort_values(by="DoubleLow" , ascending=True)
PosValue = MyCash

#抛出不在持有排名HoldRank的
for stock in MyPosition.keys():
try:
CurPrice = data.loc[stock]['closePriceBond']
except:
last_date = (context.now + datetime.timedelta(days=-7)).strftime('%Y%m%d')
CurPrice=get_last_price(stock,last_date,today_date)

PosValue += MyPosition[stock] * CurPrice * 10 #计算当前市值

if stock not in data.index[:HoldRank]:
# 省略若干

log.info('{} 卖出{},{},价格:{}'.format(today_date,stock,name,CurPrice))


if PosValue > HighValue:HighValue = PosValue
if (HighValue - PosValue) / HighValue > Withdraw:Withdraw = (HighValue - PosValue) / HighValue

#买入排在HoldRank内的,总持有数量HoldNum
min_hold = min(HoldRank,len(data.index))
for i in range(min_hold):
if len(MyPosition) >= HoldNum:break
if data.index[i] not in MyPosition.keys():
# 省略若干
log.info('{} 买入{}, {}, 价格{}, 溢价率{}'.format(today_date,data.index[i],name,price,cb_ration))

ratio = (PosValue-Start_Cash)/Start_Cash*100
log.info(today_date + ': 最高市值 ' + str(HighValue) + ' , 当前市值 ' + str(PosValue) + '收益率 : '
+str(ratio)+'% , 最大回撤 ' + str(round(Withdraw*100,2))+'%') [/i][/i]
[i]欢迎讨论探索,星球里面有更多的完整策略与代码,回测数据,结论资源。
 
[/i] 查看全部
不少投资者在投资的过程中,都想要回测自己的策略或者验证自己的想法. 不少读者也在后台留言,能否写写入门类的教程.

可是碍于非科班出生, 对于编程的一窍不通, 所以大部分止步于简单的数据统计.

比如采用excel对采集来的数据,手工测试与验证, 高级点的可以应用一些excel函数进行简单回测.

这里会有一个烦人且第一大障碍, 就是需要有采集来的数据. 首先保证这个数据的完整性与准确性. 这一步其实已经过滤掉想要回测的80%的人了. 具体优矿支持的数据。
 
 
优矿支持的数据
  • 股票:沪深交易所股票的基本信息以及日/分钟级别的股票行情。
  •  
  • 财务报表:沪深港上市公司披露的2007年会计准则变更以来的所有财务报表数据,包含三大报表和财报附注等细节。
  •  
  • 公司行为:沪深上市公司业绩预告,业绩快报,IPO,配股,分红,拆股,股改等信息。
  •  
  • 基金:场内外各类基金的基本信息,日/分钟级别的场内基金行情,日级别的场外基金净值,以及基金资产配置,收益情况,净值调整等信息。
  •  
  • 期货:国内四大期货交易所期货合约的基本信息,日/分钟的期货行情,以及国债期货的转换因子等信息。
  •  
  • 指数:国内外指数基本信息,日/分钟级别的指数行情,以及指数成分构成情况,指数成分股权重情况等信息。
  •  
  • 港股:香港交易所股票基本信息以及日级别的股票行情。
  •  
  • 大宗商品:国内各个品种(包括期货合约可交割品种)的大宗商品现货价格行情,以及产销量,库存等信息。
  •  
  • 债券:债券/回购基本信息,日级别的债券/回购行情,以及发行上市,付息,利率,评级和评级变动,债券发行人评级及变动,担保人评级及变动等信息。
  •  
  • 期权:上交所期权合约的基本信息,日/分钟级别的期权行情,以及每日盘前静态数据等信息。
  •  
  • 宏观产业:中国及全球各国宏观指标,行业经济指标等数据。


特色数据
  • 股票/指数等品种的量化因子库
  •  
  • 雪球、股吧等社交媒体数据
  •  
  • 主流媒体新闻文本和结构化数据
  •  
  • 主流渠道公告文本和结构化数据
  •  
  • 淘宝、天猫等电商数据


其实其他的聚框,米宽,箩筐等等,都是大同小异的,本文只是挑选笔者使用比较多的优矿来介绍. 不过现在优矿并不支持实盘.

本文只是做一个量化平台框架的基本介绍, 后续的文章会有进阶, 加入买卖操作, 计算最大回撤, 以及更为复杂的多因子回测. 只要有的数据,基本都可以拿来加入到你的模型之中.
 
##################################################################

因为优矿本身并不支持可转债的交易,所以系统内置的order,buy,sell函数是无法应用到可转债上面。

不过只要能够获取到每日的行情数据,那么我们就可以自己构造一个交易系统。

核心就就是每次保存你的持仓信息,等到下一次调仓时,对持仓进行比较,对于调出的转债进行移除,新加的转债进行加入。 然后统计一下当前市值,记录下来,就可以得到收益率曲线。
 
部分代码如下:
import datetime

start = '2018-01-01' # 回测起始时间
end = '2021-05-28' # 回测结束时间
benchmark = 'HS300' # 策略参考标准
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 5 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd' 时间间隔的单位为交易日,
hold_num = 10 # 持有转债的个数


def initialize(context):
global MyPosition, HighValue, MyCash, Withdraw, HoldRank, HoldNum,Start_Cash
MyPosition = {} #持仓
MyCash = 1000000 #现金
Start_Cash= 1000000
HighValue = MyCash #最高市值
Withdraw = 0 #最大回撤
HoldRank = hold_num #排名多少之后卖出
HoldNum = hold_num #持债支数

def bonds(beginDate=u"20170101",endDate=u"20201215",EB_ENABLE=False):
code_set = set()
df = DataAPI.MktConsBondPremiumGet(SecID=u"",
tickerBond=u"",
beginDate=beginDate,
endDate=endDate,
field=u"",
pandas="1")

cb_df = df.tickerBond.str.startswith(('12', '11'))
df = df[cb_df]
cb_df = df.tickerBond.str.startswith('117')
df = df[~cb_df]
if not EB_ENABLE:
eb = df.secShortNameBond.str.match('\d\d.*?E[123B]') # TODO 判断EB是否过滤
df = df[~eb]

ticker_list =
for _, row in df[['tickerBond', 'secShortNameBond', 'tickerEqu']].iterrows():
if row['tickerBond'] not in code_set:
ticker_list.append((row['tickerBond'], row['secShortNameBond'], row['tickerEqu']))
code_set.add(row['tickerBond'])
return list(code_set)


def handle_data(context):
global MyPosition, HighValue, MyCash, Withdraw, HoldRank, HoldNum,Start_Cash

today_date = context.now.strftime('%Y%m%d')

#每天重新计算双低排名
ticker_list=bonds(today_date,today_date)
data = DataAPI.MktConsBondPerfGet(beginDate=today_date,endDate=today_date,secID='',tickerBond=ticker_list,
tickerEqu=u"",field=u"",pandas="1")
data['secID']=data['tickerBond']
data.set_index('secID',inplace=True)
data['DoubleLow'] = data['closePriceBond'] + data['bondPremRatio']
data = data.sort_values(by="DoubleLow" , ascending=True)
PosValue = MyCash

#抛出不在持有排名HoldRank的
for stock in MyPosition.keys():
try:
CurPrice = data.loc[stock]['closePriceBond']
except:
last_date = (context.now + datetime.timedelta(days=-7)).strftime('%Y%m%d')
CurPrice=get_last_price(stock,last_date,today_date)

PosValue += MyPosition[stock] * CurPrice * 10 #计算当前市值

if stock not in data.index[:HoldRank]:
# 省略若干

log.info('{} 卖出{},{},价格:{}'.format(today_date,stock,name,CurPrice))


if PosValue > HighValue:HighValue = PosValue
if (HighValue - PosValue) / HighValue > Withdraw:Withdraw = (HighValue - PosValue) / HighValue

#买入排在HoldRank内的,总持有数量HoldNum
min_hold = min(HoldRank,len(data.index))
for i in range(min_hold):
if len(MyPosition) >= HoldNum:break
if data.index[i] not in MyPosition.keys():
# 省略若干
log.info('{} 买入{}, {}, 价格{}, 溢价率{}'.format(today_date,data.index[i],name,price,cb_ration))

ratio = (PosValue-Start_Cash)/Start_Cash*100
log.info(today_date + ': 最高市值 ' + str(HighValue) + ' , 当前市值 ' + str(PosValue) + '收益率 : '
+str(ratio)+'% , 最大回撤 ' + str(round(Withdraw*100,2))+'%') [/i][/i]

[i]欢迎讨论探索,星球里面有更多的完整策略与代码,回测数据,结论资源。
 
[/i]

QMT无法下载python库

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 1952 次浏览 • 2021-12-08 21:58 • 来自相关话题

 
 点击打开大图

因为一直有很多朋友和我反馈,QMT经常下载python库失败。 我自己也试了下。的确,这个软件经常抽风,软件问题,实在没有办法。
券商软件做的这么垃圾的,也是第一次见。 换了谁也不想用,老是卡在这种设置问题,然后客服也找不到,也是挺郁闷的。
暂时不确定是软件本身的问题,还是券商自己的问题。
 
##### 后续更新:
券商反馈,在开盘期间做了限流,导致下载速度极慢。 在晚上的时间段,下载速度很快,一下子就下载好了。
几台服务器同时下好了。

  查看全部
 
 点击打开大图

因为一直有很多朋友和我反馈,QMT经常下载python库失败。 我自己也试了下。的确,这个软件经常抽风,软件问题,实在没有办法。
券商软件做的这么垃圾的,也是第一次见。 换了谁也不想用,老是卡在这种设置问题,然后客服也找不到,也是挺郁闷的。
暂时不确定是软件本身的问题,还是券商自己的问题。
 
##### 后续更新:
券商反馈,在开盘期间做了限流,导致下载速度极慢。 在晚上的时间段,下载速度很快,一下子就下载好了。
几台服务器同时下好了。

 

30天学会Golang

Golang马化云 发表了文章 • 0 个评论 • 1523 次浏览 • 2021-12-04 12:20 • 来自相关话题

适合有一定的编程基础的同学学习。
附github目录图以及github地址
 
https://github.com/Rockyzsu/GolangLearning
 



 同时欢迎关注公众号: 30天尝试新事情

 
  查看全部
适合有一定的编程基础的同学学习。
附github目录图以及github地址
 
https://github.com/Rockyzsu/GolangLearning
 



 同时欢迎关注公众号: 30天尝试新事情

 
 

券商的盘后理财产品 踩坑记

股票绫波丽 发表了文章 • 0 个评论 • 3530 次浏览 • 2021-12-02 10:13 • 来自相关话题

建议大家都看看交割单
 
比如这个银河证券的盘后 财富星 理财产品
实际是一个盘后自动逆回购。本身收益率就低下,估计年化是2%-3%不到。
 
结果后面还有更坑的,是它的手续费。万0.3
 

 
1万的收益,收取的手续费是0.3元(其他的0.9,1元的是因为周4算3天的逆回购)
等同于你的收益30%左右还要被券商吸走。
不过这个应该写在开通协议的合同里面,只怪自己没有去看。 不过大部分人应该都不会去看的。券商就是要的这种效果。
 
  查看全部
建议大家都看看交割单
 
比如这个银河证券的盘后 财富星 理财产品
实际是一个盘后自动逆回购。本身收益率就低下,估计年化是2%-3%不到。
 
结果后面还有更坑的,是它的手续费。万0.3
 

 
1万的收益,收取的手续费是0.3元(其他的0.9,1元的是因为周4算3天的逆回购)
等同于你的收益30%左右还要被券商吸走。
不过这个应该写在开通协议的合同里面,只怪自己没有去看。 不过大部分人应该都不会去看的。券商就是要的这种效果。
 
 

证券app直接开户的费率为什么那么高

股票绫波丽 发表了文章 • 0 个评论 • 1652 次浏览 • 2021-12-02 00:06 • 来自相关话题

要开低佣就必须注意以下几点:

1.不能直接上APP开户,否则会被随机分配营业部,然后就百分之一万只能开到默认的万3佣金。

2.低佣必须用特殊的渠道才能开到。

你要是认识一些网上的大V或者券商朋友,那就好办了,有他们的渠道的话,就可以开到万一的超低佣金。

所以说关键在于,怎么才能找到低佣的渠道呢?

找到渠道也不难,就像网上千奇百怪的优惠券,虽然不会轻易被发现,但也总有人找得到一样;就算你实在找不到,想想有没有谁是开了的,问一问也一定能得到答案。



备注:开户
否则不通过
  查看全部
要开低佣就必须注意以下几点:

1.不能直接上APP开户,否则会被随机分配营业部,然后就百分之一万只能开到默认的万3佣金。

2.低佣必须用特殊的渠道才能开到。

你要是认识一些网上的大V或者券商朋友,那就好办了,有他们的渠道的话,就可以开到万一的超低佣金。

所以说关键在于,怎么才能找到低佣的渠道呢?

找到渠道也不难,就像网上千奇百怪的优惠券,虽然不会轻易被发现,但也总有人找得到一样;就算你实在找不到,想想有没有谁是开了的,问一问也一定能得到答案。



备注:开户
否则不通过
 

今年预估相关的依赖港美股打新大陆券商收益大幅下跌

股票李魔佛 发表了文章 • 0 个评论 • 1365 次浏览 • 2021-12-01 15:58 • 来自相关话题

1. 新人不入场
 
2. 场内的人就想往外跑。
 
3. 年底最后一个月,一些港股新股拼命发,不少是二婚股,像网易云音乐,微博这种。可能也是券商有压力,有这个发新股的需求,冷清的时候IPO上市费用相对会比热门是要低吧。排队也相对没有那么拥挤。
 
4. 富途,老虎,雪盈等可能都不好过。
 
  查看全部
1. 新人不入场
 
2. 场内的人就想往外跑。
 
3. 年底最后一个月,一些港股新股拼命发,不少是二婚股,像网易云音乐,微博这种。可能也是券商有压力,有这个发新股的需求,冷清的时候IPO上市费用相对会比热门是要低吧。排队也相对没有那么拥挤。
 
4. 富途,老虎,雪盈等可能都不好过。
 
 

搜狗拼音居然还会请求本地的web 80端口?要干嘛呢

网络李魔佛 发表了文章 • 0 个评论 • 1488 次浏览 • 2021-12-01 11:36 • 来自相关话题

在本地的电脑做golang的Gin开发,部署了一个80端口的web接口,然后就看到搜狗拼音的请求进来了。
 
不知道它实际是做什么用的。当时,这个绝对不正常,一个输入法软件,扫描我本地文件就算了。 居然还扫描我的本地web端口,如果开启了某个端口,你居然还会自动请求我?
 

 
并且,这个数据并不是外网来的。因为我这是内网的机子,并没有和外网联通,关键我也是一个路由器连着,外网也根本进不来。
 
好了,卸载了。 查看全部
在本地的电脑做golang的Gin开发,部署了一个80端口的web接口,然后就看到搜狗拼音的请求进来了。
 
不知道它实际是做什么用的。当时,这个绝对不正常,一个输入法软件,扫描我本地文件就算了。 居然还扫描我的本地web端口,如果开启了某个端口,你居然还会自动请求我?
 

 
并且,这个数据并不是外网来的。因为我这是内网的机子,并没有和外网联通,关键我也是一个路由器连着,外网也根本进不来。
 
好了,卸载了。