golang mysql count(*) 的写法

mysql最为常用的语句。
 
使用golang标准库 database/sql 实现:
 
 
package main

import (
"database/sql"
"fmt"
"log"

_ "github.com/lib/pq"
)

func main() {
var count int

db, err := sql.Open("postgres", "user=test password=test dbname=foo sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()

row := db.QueryRow("SELECT COUNT(*) FROM table_name")
err := row.Scan(&count)
if err != nil {
log.Fatal(err)
}

fmt.Println(count)
}
 
即可。
 
 
继续阅读 »
mysql最为常用的语句。
 
使用golang标准库 database/sql 实现:
 
 
package main

import (
"database/sql"
"fmt"
"log"

_ "github.com/lib/pq"
)

func main() {
var count int

db, err := sql.Open("postgres", "user=test password=test dbname=foo sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()

row := db.QueryRow("SELECT COUNT(*) FROM table_name")
err := row.Scan(&count)
if err != nil {
log.Fatal(err)
}

fmt.Println(count)
}
 
即可。
 
  收起阅读 »

golang mysql包 database/sql的基本操作:增删改查 (go sql操作 保存这篇文章就足够了)

如果不是使用gorm,直接操作底层mysql命令,那么最常使用的是 database/sql 这个包了。

下面的是一些常见的操作,如果需要写底层sql语句,使用频率极高,值得收藏。
 
/*
* @Author: 30daydo
* @FilePath: /go110/go-012/g012.go
* @Description: Go 数据库基本操作
*/

package main

import (
"database/sql"
"fmt"
"runtime"

_ "github.com/go-sql-driver/mysql"
)

/**
// 创建 user 表
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
`age` int NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户信息表'
**/

// 全局对象 db
var db *sql.DB

// 定义一个 user 结构体接收数据:
type user struct {
id int
age int
name string
}

// 始化数据库的函数
func initDB() (err error) {

// 构建连接的 dsn 格式是:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8"
dsn := "user:password@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"

// 给全局变量赋值, 注意这里不要使用 :=
db, err = sql.Open("mysql", dsn)
if err != nil {
fmt.Println("初始化数据库失败")
return err
}

// 校验dsn是否正确
fmt.Println("尝试与数据库建立连接...")
err = db.Ping()
if err != nil {
fmt.Println("连接失败")
return err
}
fmt.Println("连接成功")

db.SetMaxOpenConns(2000) // 设置最大打开连接数
db.SetMaxIdleConns(10) // 设置最大空闲连接数

return nil
}

// 插入数据
func insertRow(name string, age int) int64 {

sqlStr := "INSERT INTO user(name, age) VALUES (?,?)"

ret, err := db.Exec(sqlStr, name, age)

if err != nil {
fmt.Printf("插入失败, err: %v\n", err)
return 0
}

// 新插入数据的 id
insertId, err := ret.LastInsertId()
if err != nil {
fmt.Printf("获取新插入数据的 ID 失败, err:%v\n", err)
return 0
}
fmt.Printf("插入成功, ID 为 %d.\n", insertId)

return insertId
}

// 查询单条数据记录
func queryRow(rowId int64) {
sqlStr := "SELECT id, name, age FROM user WHERE id = ?"
var u user
// 确保 QueryRow 之后调用 Scan 方法,释放持有的数据库链接
err := db.QueryRow(sqlStr, rowId).Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("未找到记录, 查询失败, err: %v\n", err)
return
}
fmt.Printf("查询数据成功, id: %d name: %s age: %d \n", u.id, u.name, u.age)
}

// 更新数据
func updateRow(rowId int64, newAge int) {
sqlStr := "UPDATE user SET age=? WHERE id = ?"
ret, err := db.Exec(sqlStr, newAge, rowId)
if err != nil {
fmt.Printf("更新失败 , err:%v\n", err)
return
}
// 操作影响的行数
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("获取影响函数失败, err: %v\n", err)
return
}
fmt.Printf("更新成功, 影响行数为: %d\n", n)
}

// 删除数据
func deleteRow(rowId int64) {
sqlStr := "DELETE FROM user WHERE id = ?"
ret, err := db.Exec(sqlStr, rowId)
if err != nil {
fmt.Printf("删除失败, err: %v\n", err)
return
}
n, err := ret.RowsAffected() // 操作影响的行数
if err != nil {
fmt.Printf("获取影响函数失败, err: %v\n", err)
return
}
fmt.Printf("删除成功, 影响行数为: %d\n", n)
}

// 查询多行
func queryMultiRow() {
sqlStr := "SELECT id, name, age FROM user WHERE id > ?"
rows, err := db.Query(sqlStr, 0)
if err != nil {
fmt.Printf("查询失败, err:%v\n", err)
return
}
// 重要:关闭 rows, 释放持有的数据库链接
defer rows.Close()

// 循环读取结果集中的数据
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("查询多行数据失败, err:%v\n", err)
return
}
fmt.Printf("当前数据 id: %d name: %s age: %d\n", u.id, u.name, u.age)
}
}

func main() {
// 使用内置函数打印
println("Hello", "菜鸟实战")

// 初始化数据库
initDB()

// 插入数据
var id1 = insertRow("唐遇春", 17)
var id2 = insertRow("冯显", 38)
var id3 = insertRow("花千里", 20)

// 查询多行数据
queryMultiRow()

// 更新数据
updateRow(id2, 35)

// 查询单行数据
queryRow(id2)

// 删除数据
deleteRow(id1)

// 查询多行数据
queryMultiRow()
queryRow(id3)

// 当前版本
fmt.Printf("版本: %s \n", runtime.Version())
}

 
当然,上面的语句也可以不用Prepare的写法,直接插入进去:
 
func insertDirect() {
db, err := sql.Open("mysql",
"username:password@tcp(127.0.0.1:3306)/test_db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
sql := "INSERT INTO user(id, name, pwd) VALUES(?, ?, ?)"
res, err := db.Exec(sql, 13, "Jobs", "444555")
checkErr(err)
fmt.Println(res.LastInsertId())

}
继续阅读 »
如果不是使用gorm,直接操作底层mysql命令,那么最常使用的是 database/sql 这个包了。

下面的是一些常见的操作,如果需要写底层sql语句,使用频率极高,值得收藏。
 
/*
* @Author: 30daydo
* @FilePath: /go110/go-012/g012.go
* @Description: Go 数据库基本操作
*/

package main

import (
"database/sql"
"fmt"
"runtime"

_ "github.com/go-sql-driver/mysql"
)

/**
// 创建 user 表
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
`age` int NOT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户信息表'
**/

// 全局对象 db
var db *sql.DB

// 定义一个 user 结构体接收数据:
type user struct {
id int
age int
name string
}

// 始化数据库的函数
func initDB() (err error) {

// 构建连接的 dsn 格式是:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8"
dsn := "user:password@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"

// 给全局变量赋值, 注意这里不要使用 :=
db, err = sql.Open("mysql", dsn)
if err != nil {
fmt.Println("初始化数据库失败")
return err
}

// 校验dsn是否正确
fmt.Println("尝试与数据库建立连接...")
err = db.Ping()
if err != nil {
fmt.Println("连接失败")
return err
}
fmt.Println("连接成功")

db.SetMaxOpenConns(2000) // 设置最大打开连接数
db.SetMaxIdleConns(10) // 设置最大空闲连接数

return nil
}

// 插入数据
func insertRow(name string, age int) int64 {

sqlStr := "INSERT INTO user(name, age) VALUES (?,?)"

ret, err := db.Exec(sqlStr, name, age)

if err != nil {
fmt.Printf("插入失败, err: %v\n", err)
return 0
}

// 新插入数据的 id
insertId, err := ret.LastInsertId()
if err != nil {
fmt.Printf("获取新插入数据的 ID 失败, err:%v\n", err)
return 0
}
fmt.Printf("插入成功, ID 为 %d.\n", insertId)

return insertId
}

// 查询单条数据记录
func queryRow(rowId int64) {
sqlStr := "SELECT id, name, age FROM user WHERE id = ?"
var u user
// 确保 QueryRow 之后调用 Scan 方法,释放持有的数据库链接
err := db.QueryRow(sqlStr, rowId).Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("未找到记录, 查询失败, err: %v\n", err)
return
}
fmt.Printf("查询数据成功, id: %d name: %s age: %d \n", u.id, u.name, u.age)
}

// 更新数据
func updateRow(rowId int64, newAge int) {
sqlStr := "UPDATE user SET age=? WHERE id = ?"
ret, err := db.Exec(sqlStr, newAge, rowId)
if err != nil {
fmt.Printf("更新失败 , err:%v\n", err)
return
}
// 操作影响的行数
n, err := ret.RowsAffected()
if err != nil {
fmt.Printf("获取影响函数失败, err: %v\n", err)
return
}
fmt.Printf("更新成功, 影响行数为: %d\n", n)
}

// 删除数据
func deleteRow(rowId int64) {
sqlStr := "DELETE FROM user WHERE id = ?"
ret, err := db.Exec(sqlStr, rowId)
if err != nil {
fmt.Printf("删除失败, err: %v\n", err)
return
}
n, err := ret.RowsAffected() // 操作影响的行数
if err != nil {
fmt.Printf("获取影响函数失败, err: %v\n", err)
return
}
fmt.Printf("删除成功, 影响行数为: %d\n", n)
}

// 查询多行
func queryMultiRow() {
sqlStr := "SELECT id, name, age FROM user WHERE id > ?"
rows, err := db.Query(sqlStr, 0)
if err != nil {
fmt.Printf("查询失败, err:%v\n", err)
return
}
// 重要:关闭 rows, 释放持有的数据库链接
defer rows.Close()

// 循环读取结果集中的数据
for rows.Next() {
var u user
err := rows.Scan(&u.id, &u.name, &u.age)
if err != nil {
fmt.Printf("查询多行数据失败, err:%v\n", err)
return
}
fmt.Printf("当前数据 id: %d name: %s age: %d\n", u.id, u.name, u.age)
}
}

func main() {
// 使用内置函数打印
println("Hello", "菜鸟实战")

// 初始化数据库
initDB()

// 插入数据
var id1 = insertRow("唐遇春", 17)
var id2 = insertRow("冯显", 38)
var id3 = insertRow("花千里", 20)

// 查询多行数据
queryMultiRow()

// 更新数据
updateRow(id2, 35)

// 查询单行数据
queryRow(id2)

// 删除数据
deleteRow(id1)

// 查询多行数据
queryMultiRow()
queryRow(id3)

// 当前版本
fmt.Printf("版本: %s \n", runtime.Version())
}

 
当然,上面的语句也可以不用Prepare的写法,直接插入进去:
 
func insertDirect() {
db, err := sql.Open("mysql",
"username:password@tcp(127.0.0.1:3306)/test_db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
sql := "INSERT INTO user(id, name, pwd) VALUES(?, ?, ?)"
res, err := db.Exec(sql, 13, "Jobs", "444555")
checkErr(err)
fmt.Println(res.LastInsertId())

}
收起阅读 »

宁稳网可转债弹性因子 python回测

利用文章: 
https://t.zsxq.com/08779XPlk

的数据和代码,修改原来的代码
 
df=df.sort_values('税前收益率',ascending=False)
改为
df=df.sort_values('弹性',ascending=False) # 倒序


df=df.sort_values('弹性',ascending=True) # 正序

还有这里:
 
df = pd.read_excel(full_path)

df['税前收益率'] = df['税前收益率'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','税前收益率']]

改为:

df['弹性'] = df['弹性'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','弹性']]

如果修改持有个数,天数,修改HOLD_NUM ,和FREQ 即可

得到下面的图:
 

20221204003-name.jpg
点击查看大图
 
"1天,大到小" 收益率 -30%,最大回撤34%

"1天,小到大" 收益率15.74%,最大回撤10.43%

'5天,大到小' 收益率-25%,最大回撤30.71%

'5天,小到大' 收益率7.36%, 最大回撤10.47%


可见弹性按照单天弹性值排名,买入最大的10只,无论按1天还是5天轮动,今天收益率是亏损的;

可见弹性按照单天弹性值排名,买入最小的10只,无论按1天还是5天轮动,今天收益率是盈利的;
 
如果对数据有疑问,可以到公众号后台留言~
继续阅读 »
利用文章: 
https://t.zsxq.com/08779XPlk

的数据和代码,修改原来的代码
 
df=df.sort_values('税前收益率',ascending=False)
改为
df=df.sort_values('弹性',ascending=False) # 倒序


df=df.sort_values('弹性',ascending=True) # 正序

还有这里:
 
df = pd.read_excel(full_path)

df['税前收益率'] = df['税前收益率'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','税前收益率']]

改为:

df['弹性'] = df['弹性'].map(convert_float)
df['转股价格']=df['转股价格'].astype(float)
df=df[['转债代码','转债名称','转债价格','弹性']]

如果修改持有个数,天数,修改HOLD_NUM ,和FREQ 即可

得到下面的图:
 

20221204003-name.jpg
点击查看大图
 
"1天,大到小" 收益率 -30%,最大回撤34%

"1天,小到大" 收益率15.74%,最大回撤10.43%

'5天,大到小' 收益率-25%,最大回撤30.71%

'5天,小到大' 收益率7.36%, 最大回撤10.47%


可见弹性按照单天弹性值排名,买入最大的10只,无论按1天还是5天轮动,今天收益率是亏损的;

可见弹性按照单天弹性值排名,买入最小的10只,无论按1天还是5天轮动,今天收益率是盈利的;
 
如果对数据有疑问,可以到公众号后台留言~
收起阅读 »

python父类如何判断子类时候实现了某个方法或者属性赋值

用hasattr内置函数即可
 
看看下面的例子
 class Parent:

def __init__(self):
self.name='parent'
self.age=10

def run(self):
if hasattr(self,'get_salary'):
print('has func')
print(self.get_salary())

class Child(Parent):

def __init__(self):
# self.name='child'
Parent.__init__(self)
self.salary=100


def get_salary(self):
return self.salary

obj = Child()
obj.run()

obj.run调用的是parent里面的方法。
而parent的run里面调用一个hasattr, 来判断self 是否有get_salary这个函数。
因为self是从子类传进去的,所以self实际是 child的实例。
 
因为child里面是有get_salary方法(属性)的,所以hasatrr 是返回true, 然后调用子类的self.get_salary
从而程序没有报错。打印正确的返回数据
 
继续阅读 »
用hasattr内置函数即可
 
看看下面的例子
 class Parent:

def __init__(self):
self.name='parent'
self.age=10

def run(self):
if hasattr(self,'get_salary'):
print('has func')
print(self.get_salary())

class Child(Parent):

def __init__(self):
# self.name='child'
Parent.__init__(self)
self.salary=100


def get_salary(self):
return self.salary

obj = Child()
obj.run()

obj.run调用的是parent里面的方法。
而parent的run里面调用一个hasattr, 来判断self 是否有get_salary这个函数。
因为self是从子类传进去的,所以self实际是 child的实例。
 
因为child里面是有get_salary方法(属性)的,所以hasatrr 是返回true, 然后调用子类的self.get_salary
从而程序没有报错。打印正确的返回数据
  收起阅读 »

Ptrade QMT 哪家费率最便宜,门槛最低?

最近咨询的朋友很多。这里做个汇总,可以节省大家的时间。 
笔者只会推荐合适的券商和量化接口给你,而不会推荐坑爹的券商给你。
 
如果你不信任,绕路即可,莫浪费大家时间。或者你有好的资源或者券商,你也可以推荐给我,可以给你发红包,奖励你提供有用的情报信息。
 
目前支持ptrade,qmt可以股票可以免五(0.1元起步)的券商,只有国盛,需要的可以找我开。 但是有入金门槛,ptrade门槛30w, qmt 的门槛50w。 国盛的ptrade可以链接外网。其他家的不行。但国盛的qmt不支持运行在云服务器。
 
其他家的qmt是支持的云服务器的,但国金的qmt会每天自动退出,需要每次手动点击登录,我也写了一个自动登录的小脚本,开完户的朋友可以拿去用用。
 
门槛低的国信,适合新手使用,但是没有miniqmt,这个东西也不一定适合你。 真的需要这个功能,在qmt里面可以写一段代码,让它把下单接口变成http指令,把下单功能独立出来,也是可以的。不过这个属于进阶功能。 需要的也可以把代码给你。
 
笔者用过大部分券商的ptrade qmt,所以个人的指导与推荐还是很有指导意见的。 写过的策略也大部分人(99%)多, 平台好坏,坑的多寡,哪里有雷,都已经摸清摸楚。 可以大大节省你们的时间。 当然你也可以忽略,自己去折腾折腾。选ptrade 还是qmt,然后哪个券商,什么费率。
 
mmexport1669547412034.png


 
需要开通ptrade - qmt 低门槛 低费率 的 或者可以提供更低费用的资源的可以加微信:
 

ptrade 接口文档: http://ptradeapi.com
 
继续阅读 »
最近咨询的朋友很多。这里做个汇总,可以节省大家的时间。 
笔者只会推荐合适的券商和量化接口给你,而不会推荐坑爹的券商给你。
 
如果你不信任,绕路即可,莫浪费大家时间。或者你有好的资源或者券商,你也可以推荐给我,可以给你发红包,奖励你提供有用的情报信息。
 
目前支持ptrade,qmt可以股票可以免五(0.1元起步)的券商,只有国盛,需要的可以找我开。 但是有入金门槛,ptrade门槛30w, qmt 的门槛50w。 国盛的ptrade可以链接外网。其他家的不行。但国盛的qmt不支持运行在云服务器。
 
其他家的qmt是支持的云服务器的,但国金的qmt会每天自动退出,需要每次手动点击登录,我也写了一个自动登录的小脚本,开完户的朋友可以拿去用用。
 
门槛低的国信,适合新手使用,但是没有miniqmt,这个东西也不一定适合你。 真的需要这个功能,在qmt里面可以写一段代码,让它把下单接口变成http指令,把下单功能独立出来,也是可以的。不过这个属于进阶功能。 需要的也可以把代码给你。
 
笔者用过大部分券商的ptrade qmt,所以个人的指导与推荐还是很有指导意见的。 写过的策略也大部分人(99%)多, 平台好坏,坑的多寡,哪里有雷,都已经摸清摸楚。 可以大大节省你们的时间。 当然你也可以忽略,自己去折腾折腾。选ptrade 还是qmt,然后哪个券商,什么费率。
 
mmexport1669547412034.png


 
需要开通ptrade - qmt 低门槛 低费率 的 或者可以提供更低费用的资源的可以加微信:
 

ptrade 接口文档: http://ptradeapi.com
  收起阅读 »

Linux 运行resilio (一个跨平台的资源共享类软件)【附pro license】

什么是resilio ?

只需要知道一个分享密钥key,即可同步整个文件夹了,不需要第三方服务器,不受存储空间和流量限制,Resilio Sync的数据不在云端,而是存储在本地,传输速度基本上只受用户网络带宽的制约,它可以支持多人同时同步,而且,越多人对文件夹进行同步,则同步速度越快,没有审查,不过现在已经属于404 的产品了,不过如果找到神key,资源还是蛮丰富的。

安装过程:

1、打开官网下载安装Resilio Sync,国内用户需要自备网络环境。
对于linux , ubuntu,解压后实际只有一个可执行文件,猜测这个很可能是golang写的。因为大部分golang的程序都可以编译成一个文件。
 $ ./rslsync  
By using this application, you agree to our Privacy Policy, Terms of Use and End User License Agreement.
https://www.resilio.com/legal/privacy
https://www.resilio.com/legal/terms-of-use
https://www.resilio.com/legal/eula
 

运行后rslsync是在后台运行的。 不会返回访问界面,当然linux下也不会有界面。 需要你打开浏览器, 输入 http://127.0.0.1:8888
就可以看到resilio的内容了。
 

20221127001.jpg

 

2、下载Resilio Sync授权文件:ResilioSyncPro.btskey. 附件里面

3、然后解压,解压后文件后缀是btskey,打开安装好的Resilio Sync,打开设置的License界面,点击Apply License

这个时候页面是空的,没有任何空的内容。 这个时候就需要一些神key。因为上面也说了,resilio是通过分享key,来获取资源的。
比如zlibrary,有人共享了不少电子书在某个文件夹里面。 只要找到一个key,你就可以找到一个资源分享的组织。
 

20221127003.jpg

 
需要电子书的key,可以关注公众号:

 
回复:电子书key
可以获取zibibrary 几个T的电子书。

 
继续阅读 »
什么是resilio ?

只需要知道一个分享密钥key,即可同步整个文件夹了,不需要第三方服务器,不受存储空间和流量限制,Resilio Sync的数据不在云端,而是存储在本地,传输速度基本上只受用户网络带宽的制约,它可以支持多人同时同步,而且,越多人对文件夹进行同步,则同步速度越快,没有审查,不过现在已经属于404 的产品了,不过如果找到神key,资源还是蛮丰富的。

安装过程:

1、打开官网下载安装Resilio Sync,国内用户需要自备网络环境。
对于linux , ubuntu,解压后实际只有一个可执行文件,猜测这个很可能是golang写的。因为大部分golang的程序都可以编译成一个文件。
 $ ./rslsync  
By using this application, you agree to our Privacy Policy, Terms of Use and End User License Agreement.
https://www.resilio.com/legal/privacy
https://www.resilio.com/legal/terms-of-use
https://www.resilio.com/legal/eula
 

运行后rslsync是在后台运行的。 不会返回访问界面,当然linux下也不会有界面。 需要你打开浏览器, 输入 http://127.0.0.1:8888
就可以看到resilio的内容了。
 

20221127001.jpg

 

2、下载Resilio Sync授权文件:ResilioSyncPro.btskey. 附件里面

3、然后解压,解压后文件后缀是btskey,打开安装好的Resilio Sync,打开设置的License界面,点击Apply License

这个时候页面是空的,没有任何空的内容。 这个时候就需要一些神key。因为上面也说了,resilio是通过分享key,来获取资源的。
比如zlibrary,有人共享了不少电子书在某个文件夹里面。 只要找到一个key,你就可以找到一个资源分享的组织。
 

20221127003.jpg

 
需要电子书的key,可以关注公众号:

 
回复:电子书key
可以获取zibibrary 几个T的电子书。

  收起阅读 »

可转债到期收益率因子回测 YTM回测 vs 双低 低溢价 低价策略

最近看到有人发的一些可转债高YTM的回测结果图,说高YTM轮动收益达到年化20%。嗯?高TYM实际上大部分是和低价转债是重叠的,理论和实际收益率都应该不会有这么高的。

自从优矿转为收费后,基本就没有登录过了。现在的回测在本地进行了,宁稳网的可转债数据上有YTM这因子数据,所以这次使用宁稳网的数据回测。也不使用什么第三方框架了,直接手写回测,模拟交易过程。
 
逻辑就是按照交易日期,读取所有excel数据。保存到一个dataframe里面,然后按照日期对YTM排名。 选出排名N名的进行买入,掉出N名的进行卖出。
 
数据源
 
采用宁稳的全表数据,里面有YTM因子

20221126001.jpg

 
20221126002.jpg


 
YTM收益率曲线
本地使用python编写回测代码,纯手工,不使用第三方框架。 平时我也多次力荐大家手写,别依赖那些第三方框架,什么vnpy,backtrade,一是特别难用,数据要适配,二是不好调试,除非你对它们的源码特别熟悉。本回测代码和宁稳数据放在个人知识星球,大部分人其实只关心回测结果就够了。

下图是2022年1月1日至11月25日的回测数据。持有10个标的,红色的是1天调仓,蓝色的是5天调仓
 

20221126006.jpg

 
5天轮动,2022年的收益率为4.29%,最大回撤6.98% 。

1天轮动,2022年的收益率为9.33%,最大回撤5.32% 。

1天轮动的整体收益率要比5天轮动的高5个点,并且最大回撤也小一点。

持仓日志
 

20221126009.jpg


从持仓以及调仓日志来看,买入的大部分是低价转债,且部分也是之前有瑕疵,爆过雷的转债。
 
高YTM轮动 vs 双低,低溢价,低价

接着对比一下几个常规的转债策略,双低,低溢价,低价。

回测条件相同,起始时间2022-01-01,结束时间2022-11-25。

持有10只,5天轮动。
 

20221126005.jpg

 
在今年的可转债偏弱的行情下,高YTM轮动在这4个策略里面的收益率是最高的。

低溢价一如既然的高波动,一会ICU,一会蹦迪。但笔者觉得跌到前期最大回撤的位置,低溢价可以考虑介入的。
 

20221126010.jpg

 
YTM和低价格的今年回测收益率接近,YTM高了一个点左右,最大回撤接近。 而低溢价还在回撤的途中,目前今年的收益率为-25%,如果轮动频率高一些,低溢价收益率会高一些,强赎的转债基本会被轮入低溢价标的,因为最近半年强赎后的转债像进入了死亡螺旋一样,正股转债一起跌;因此排除强赎转债会对低溢价收益率有不少的提升。
 
完整代码以及数据请开通星球查收。
f088492c7da0ce8b90cbdb7aafe3b191.png

 
 
 
 
 
继续阅读 »
最近看到有人发的一些可转债高YTM的回测结果图,说高YTM轮动收益达到年化20%。嗯?高TYM实际上大部分是和低价转债是重叠的,理论和实际收益率都应该不会有这么高的。

自从优矿转为收费后,基本就没有登录过了。现在的回测在本地进行了,宁稳网的可转债数据上有YTM这因子数据,所以这次使用宁稳网的数据回测。也不使用什么第三方框架了,直接手写回测,模拟交易过程。
 
逻辑就是按照交易日期,读取所有excel数据。保存到一个dataframe里面,然后按照日期对YTM排名。 选出排名N名的进行买入,掉出N名的进行卖出。
 
数据源
 
采用宁稳的全表数据,里面有YTM因子

20221126001.jpg

 
20221126002.jpg


 
YTM收益率曲线
本地使用python编写回测代码,纯手工,不使用第三方框架。 平时我也多次力荐大家手写,别依赖那些第三方框架,什么vnpy,backtrade,一是特别难用,数据要适配,二是不好调试,除非你对它们的源码特别熟悉。本回测代码和宁稳数据放在个人知识星球,大部分人其实只关心回测结果就够了。

下图是2022年1月1日至11月25日的回测数据。持有10个标的,红色的是1天调仓,蓝色的是5天调仓
 

20221126006.jpg

 
5天轮动,2022年的收益率为4.29%,最大回撤6.98% 。

1天轮动,2022年的收益率为9.33%,最大回撤5.32% 。

1天轮动的整体收益率要比5天轮动的高5个点,并且最大回撤也小一点。

持仓日志
 

20221126009.jpg


从持仓以及调仓日志来看,买入的大部分是低价转债,且部分也是之前有瑕疵,爆过雷的转债。
 
高YTM轮动 vs 双低,低溢价,低价

接着对比一下几个常规的转债策略,双低,低溢价,低价。

回测条件相同,起始时间2022-01-01,结束时间2022-11-25。

持有10只,5天轮动。
 

20221126005.jpg

 
在今年的可转债偏弱的行情下,高YTM轮动在这4个策略里面的收益率是最高的。

低溢价一如既然的高波动,一会ICU,一会蹦迪。但笔者觉得跌到前期最大回撤的位置,低溢价可以考虑介入的。
 

20221126010.jpg

 
YTM和低价格的今年回测收益率接近,YTM高了一个点左右,最大回撤接近。 而低溢价还在回撤的途中,目前今年的收益率为-25%,如果轮动频率高一些,低溢价收益率会高一些,强赎的转债基本会被轮入低溢价标的,因为最近半年强赎后的转债像进入了死亡螺旋一样,正股转债一起跌;因此排除强赎转债会对低溢价收益率有不少的提升。
 
完整代码以及数据请开通星球查收。
f088492c7da0ce8b90cbdb7aafe3b191.png

 
 
 
 
  收起阅读 »

Ptrade多策略如何编写?

多策略需要解决的一个最主要的问题,就是仓位管理。
 
系统自带的读取仓位函数需要你重写。
 
目前使用一个类来管理仓位:
 
初始化部分:
class PositionManager():

def __init__(self):
if SINGLE_FACTOR not in [1, 2, 3, 4]:
raise ValueError('策略数字有误')

self.strategy = SINGLE_FACTOR
NOTEBOOK_PATH = '/home/fly/notebook/'
# self.filename = NOTEBOOK_PATH + 'S-{}.txt'.format(self.strategy)
self.filename = NOTEBOOK_PATH + personal_define_filename
self.portfolio = self.read()
log.info(self.portfolio)
self.write()

def init_data(self):
js_data = {
'cash': CASH,
'strategy': self.strategy,
'positions': ,
'portfolio_value': None,
'positions_value': None,
'capital_used': None,
'start_date': datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
'current_day': 0,
}

数据需要收盘后保存到文件,数据库也行;不过考虑到大部分ptrade(除了国盛,需要开通的可以联系公众号:可转债量化分析)都没有连接外网功能,所以最简单的方式就是写入文件,纯粹的文本文件。
 
目前笔者使用json存储

20221116001.jpg

 点击查看大图
 
这样存储有一个好处,就是如果你想中途修改策略持仓,可以直接修改这个文本文件。比如你的策略不小心买入了一只强赎的转债,你想手动卖掉,那么很简单,你只要在这个json文件里面把对应的持仓删除,再把他的市值加到可用资金里面去即可。 用法是相当灵活。
 
需要完整代码或者指导的朋友可以关注下面公众号和知识星球。
 
 

 

 
 
继续阅读 »
多策略需要解决的一个最主要的问题,就是仓位管理。
 
系统自带的读取仓位函数需要你重写。
 
目前使用一个类来管理仓位:
 
初始化部分:
class PositionManager():

def __init__(self):
if SINGLE_FACTOR not in [1, 2, 3, 4]:
raise ValueError('策略数字有误')

self.strategy = SINGLE_FACTOR
NOTEBOOK_PATH = '/home/fly/notebook/'
# self.filename = NOTEBOOK_PATH + 'S-{}.txt'.format(self.strategy)
self.filename = NOTEBOOK_PATH + personal_define_filename
self.portfolio = self.read()
log.info(self.portfolio)
self.write()

def init_data(self):
js_data = {
'cash': CASH,
'strategy': self.strategy,
'positions': ,
'portfolio_value': None,
'positions_value': None,
'capital_used': None,
'start_date': datetime.datetime.now().strftime('%Y%m%d%H%M%S'),
'current_day': 0,
}

数据需要收盘后保存到文件,数据库也行;不过考虑到大部分ptrade(除了国盛,需要开通的可以联系公众号:可转债量化分析)都没有连接外网功能,所以最简单的方式就是写入文件,纯粹的文本文件。
 
目前笔者使用json存储

20221116001.jpg

 点击查看大图
 
这样存储有一个好处,就是如果你想中途修改策略持仓,可以直接修改这个文本文件。比如你的策略不小心买入了一只强赎的转债,你想手动卖掉,那么很简单,你只要在这个json文件里面把对应的持仓删除,再把他的市值加到可用资金里面去即可。 用法是相当灵活。
 
需要完整代码或者指导的朋友可以关注下面公众号和知识星球。
 
 

 

 
  收起阅读 »

Ptrade拆单 分批下单 python代码 可转债/股票

在转债市场,部分转债的流动性很差,有时候连成交100张也需要等待一段时间。

所以如果资金量大,就需要拆单操作。

交易代码部分,如果设置 SPLIT_ORDER_ENABLE = True 即进行拆单操作:


在交易部分:(省略部分不相关代码)
                if SPLIT_ORDER_ENABLE:
split_order(code, BUY_DIRECTION, amount)
else:
buy_price = round(buy_price, 3)
ret = order(code, amount, limit_price=buy_price)
BUY_DIRECTION 为买,值是1,一个常量

SELL_DIRECTION为卖,值为-1,也是一个常量,传入拆单函数中
 
 
拆单函数提取出来:
def split_order(code, direction, target_count):
'''
拆单
:param code: 股票代码
:param direction: 买:1 卖:-1
:param target_count: 总共要卖的股数
:return:
'''

count = int(target_count / EACH_ORDER_COUNT)
# 例如:560张, 200 张一单, 2次 + 最后一次160 张

remain_count = target_count % EACH_ORDER_COUNT

for i in range(count):
ret = order(code, direction * EACH_ORDER_COUNT)
time.sleep(SPLIT_ORDER_DELAY) # 拆开的单子等待一个时间,再下另外一单

if direction == 1: # 买的时候需要整数,卖则不需要
remain_count = int(remain_count / 10) * 10

if remain_count > 0:
ret = order(code, direction * remain_count)
常用的操作都类似,写成模块方便下次调用。写多了就是套模块。
 
在可转债实盘中,拆单后每笔下单200张,就是每次200张下一次单,因为有可能不是马上成交,所以还需要一段等待延时,再去下单;不然你的拆单也变得没有意义,因为委托那里都是挂的你的单,并没有被消化掉。
 

20221110002.jpg



20221110003.jpg


可以看到实盘交易日志,即使拆单为200张一笔,外加一段延时,成交张数也是稀稀拉拉的,出现了不少的部分成交;也就是一次连200张都未成交完成;一笔200张的,部分成交10张,20张,都是有可能的,这也足以说明,可转债的流动性问题,滑点是很难被忽略的。

当然,这是轮动调仓的时候,金额较大的情况下拆单。如果高频交易下就不能这么操作了。 
具体怎么写,可以关注个人公众号与知识星球。

知识星球原文:

20221110001.jpg

 
如需要代写量化策略实盘代码,可以到个人公众号【可转债量化分析】后台留言。
 
 
 
 
继续阅读 »
在转债市场,部分转债的流动性很差,有时候连成交100张也需要等待一段时间。

所以如果资金量大,就需要拆单操作。

交易代码部分,如果设置 SPLIT_ORDER_ENABLE = True 即进行拆单操作:


在交易部分:(省略部分不相关代码)
                if SPLIT_ORDER_ENABLE:
split_order(code, BUY_DIRECTION, amount)
else:
buy_price = round(buy_price, 3)
ret = order(code, amount, limit_price=buy_price)
BUY_DIRECTION 为买,值是1,一个常量

SELL_DIRECTION为卖,值为-1,也是一个常量,传入拆单函数中
 
 
拆单函数提取出来:
def split_order(code, direction, target_count):
'''
拆单
:param code: 股票代码
:param direction: 买:1 卖:-1
:param target_count: 总共要卖的股数
:return:
'''

count = int(target_count / EACH_ORDER_COUNT)
# 例如:560张, 200 张一单, 2次 + 最后一次160 张

remain_count = target_count % EACH_ORDER_COUNT

for i in range(count):
ret = order(code, direction * EACH_ORDER_COUNT)
time.sleep(SPLIT_ORDER_DELAY) # 拆开的单子等待一个时间,再下另外一单

if direction == 1: # 买的时候需要整数,卖则不需要
remain_count = int(remain_count / 10) * 10

if remain_count > 0:
ret = order(code, direction * remain_count)
常用的操作都类似,写成模块方便下次调用。写多了就是套模块。
 
在可转债实盘中,拆单后每笔下单200张,就是每次200张下一次单,因为有可能不是马上成交,所以还需要一段等待延时,再去下单;不然你的拆单也变得没有意义,因为委托那里都是挂的你的单,并没有被消化掉。
 

20221110002.jpg



20221110003.jpg


可以看到实盘交易日志,即使拆单为200张一笔,外加一段延时,成交张数也是稀稀拉拉的,出现了不少的部分成交;也就是一次连200张都未成交完成;一笔200张的,部分成交10张,20张,都是有可能的,这也足以说明,可转债的流动性问题,滑点是很难被忽略的。

当然,这是轮动调仓的时候,金额较大的情况下拆单。如果高频交易下就不能这么操作了。 
具体怎么写,可以关注个人公众号与知识星球。

知识星球原文:

20221110001.jpg

 
如需要代写量化策略实盘代码,可以到个人公众号【可转债量化分析】后台留言。
 
 
 
  收起阅读 »

akshare获取reits数据,搞笑,数据源测试过没有呀,没有集思录会员还没获取?


描述: 集思录-实时数据-REITs-A股 REITs

限量: 单次返回所有 REITs 的基本信息数据
 



20221107004.jpg

估计是旧的,以前游客就可以获取到数据的了。现在就不行了。
 

20221107003.jpg

 
然后另外一个获取东财的函数,获取了20个就完事了。
结果人间现在超过20家,获取的数据都不全的。
 
akshare,用的还是有点糟心。长期来看,还是自己写靠谱,有些坑,你第一次用就可以发现,但是有些坑,却是埋在那里,像个定时炸弹。
 
 
20221108003.jpg


akshare的代码:

20221108004.jpg


 

 
继续阅读 »


描述: 集思录-实时数据-REITs-A股 REITs

限量: 单次返回所有 REITs 的基本信息数据
 



20221107004.jpg

估计是旧的,以前游客就可以获取到数据的了。现在就不行了。
 

20221107003.jpg

 
然后另外一个获取东财的函数,获取了20个就完事了。
结果人间现在超过20家,获取的数据都不全的。
 
akshare,用的还是有点糟心。长期来看,还是自己写靠谱,有些坑,你第一次用就可以发现,但是有些坑,却是埋在那里,像个定时炸弹。
 
 
20221108003.jpg


akshare的代码:

20221108004.jpg


 

  收起阅读 »

Ptrade里写策略坑比较多的地方(一)

总结一些,给过来人少踩些坑
 1. 后缀符号不统一
这个是天煞的产品涉及的问题。 好好地代码后缀,比如 深圳市场的 有时候出现 300333.SZ , 有时候结构体里面却会是 300333.XSHE,
 
比如返回的orders 字典,里面用的是 00333.XSHE,而仓位的结构体 position 里面用的缺失 .sz

20221103001.jpg

 
类似这样的问题在很多函数里面都有。
 
2. 部分成交 的主推函数
如果一个订单,部分成交,会先触发部分成交主推; 然后最后一个部分成交,反而会触发全部成交主推。
细想,似乎也是合理的,只是,你在全部成交里面返回的成交数量,实际只是最后一次部分成交的量。
 
3. 想到再写
更多更新 可以参看个人知识星球或者公众号。

 
 
 
继续阅读 »
总结一些,给过来人少踩些坑
 1. 后缀符号不统一
这个是天煞的产品涉及的问题。 好好地代码后缀,比如 深圳市场的 有时候出现 300333.SZ , 有时候结构体里面却会是 300333.XSHE,
 
比如返回的orders 字典,里面用的是 00333.XSHE,而仓位的结构体 position 里面用的缺失 .sz

20221103001.jpg

 
类似这样的问题在很多函数里面都有。
 
2. 部分成交 的主推函数
如果一个订单,部分成交,会先触发部分成交主推; 然后最后一个部分成交,反而会触发全部成交主推。
细想,似乎也是合理的,只是,你在全部成交里面返回的成交数量,实际只是最后一次部分成交的量。
 
3. 想到再写
更多更新 可以参看个人知识星球或者公众号。

 
 
  收起阅读 »

DBeaver中建表 报错: Incorrect table definition; there can be ony one auto column and it must be

 Incorrect table definition; there can be only one auto column and it must be defined as a key
 
在DBeaver中建表,建了一列主键,自增的,保存。报错。
 
错误原因:
 Incorrect table definition; there can be only one auto column and it must be defined as a key
 
需要设置改为为主键。
设置地方:

stickPicture.png


stickPicture2.png

 
在约束关系那里,选定一个主键即可!
 
 
继续阅读 »
 Incorrect table definition; there can be only one auto column and it must be defined as a key
 
在DBeaver中建表,建了一列主键,自增的,保存。报错。
 
错误原因:
 Incorrect table definition; there can be only one auto column and it must be defined as a key
 
需要设置改为为主键。
设置地方:

stickPicture.png


stickPicture2.png

 
在约束关系那里,选定一个主键即可!
 
  收起阅读 »

银河双子星能否在虚拟机和云主机运行

中国银河“双子星新一代”是银河证券采用最新AI技术倾心为投资者打造的新一代PC金融终端。
20221019002.jpg

 
如果需要在服务器运行一些自动化定时脚本程序,需要券商软件支持在虚拟机运行才可以。
 
因为云主机都是虚拟化出来的,都属于虚拟机一类。
 
下载了在本地的vmware player测试了一下,发现银河双子星不能在虚拟机下运行。

20221019001.jpg

点击查看大图
 
悲催。。只能换成同花顺的通用下单委托程序。
 
银河万一免五开户,门槛低。
(政策随时变,趁有免五的时候赶紧开了)
需要的联系。

 
继续阅读 »
中国银河“双子星新一代”是银河证券采用最新AI技术倾心为投资者打造的新一代PC金融终端。
20221019002.jpg

 
如果需要在服务器运行一些自动化定时脚本程序,需要券商软件支持在虚拟机运行才可以。
 
因为云主机都是虚拟化出来的,都属于虚拟机一类。
 
下载了在本地的vmware player测试了一下,发现银河双子星不能在虚拟机下运行。

20221019001.jpg

点击查看大图
 
悲催。。只能换成同花顺的通用下单委托程序。
 
银河万一免五开户,门槛低。
(政策随时变,趁有免五的时候赶紧开了)
需要的联系。

  收起阅读 »

macbook m1版本 兼容性问题

m1 是arm版本,以前的旧软件就不要指望装到m1了,除非还有开发人员进行移植。 
 
比如你有个软件依赖旧版本的postgresql,那么就没有办法在m1上搞个旧版本的postgresql了,不过新版的postgresql是支持的。
 
这种向前兼容性很差的问题,如果对于项目,日常高频使用软件里有旧版应用,应该会挺难受,只能早一些替代方案。
 

18f3ee2965a567d24461c1afd663af13.jpeg

 
继续阅读 »
m1 是arm版本,以前的旧软件就不要指望装到m1了,除非还有开发人员进行移植。 
 
比如你有个软件依赖旧版本的postgresql,那么就没有办法在m1上搞个旧版本的postgresql了,不过新版的postgresql是支持的。
 
这种向前兼容性很差的问题,如果对于项目,日常高频使用软件里有旧版应用,应该会挺难受,只能早一些替代方案。
 

18f3ee2965a567d24461c1afd663af13.jpeg

  收起阅读 »

ubuntu安装z.lua 路径跳转工具

z.lua 是一个快速路径切换工具,它会跟踪你在 shell 下访问过的路径,通过一套称为 Frecent 的机制(源自 FireFox),经过一段简短的学习之后,z.lua 会帮你跳转到所有匹配正则关键字的路径里 Frecent 值最高的那条路径去。

正则将按顺序进行匹配,"z foo bar" 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo。
 
性能:
性能比 z.sh 快三倍,比 fasd / autojump 快十倍以上。
支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
支持 Fish Shell,Power Shell 和 Windows cmd。
使用增强匹配算法,更准确的带你去到你想去的地方。
低占用,能够仅在当前路径改变时才更新数据库(将 $_ZL_ADD_ONCE 设成 1)。
交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
集成 fzf (可选),可以用来做可视化选择或者参数补全。
快速跳转到父目录,或者项目根目录,代替反复 “cd ../../.." 。
兼容 lua 5.1, 5.2 和 5.3 以上版本。
自包含且无额外依赖,单个 z.lua 文件完成所有工作。

安装步骤:
官网太蛋疼,没有写好。
 
下面是个人的安装步骤,在ubuntu20上测试的。
 
1. 安装lua
sudo apt install lua5.3
 
2. 下载z.lua脚本
git clone [url]https://github.com/skywind3000/z.lua.git[/url] 

 
你也可以直接到文末下载。 关注公众号,回复 z.lua即可
 
下载后记录它的 目录:
比如:
/home/root/tool/z.lua

3.  然后配置bash shell
 
首先,确定你是哪个shell, 不同shell的初始化命令参数不一样:
 
bash:
 
在 .bashrc 文件最后加上这一行

eval "$(lua /path/to/z.lua --init bash)"

 
zsh:
在 .zshrc 文件最后加上这一行

eval "$(lua /path/to/z.lua --init zsh)"
 
 
Posix Shells:
 
 
在.profile 文件最后一行加入这一行

eval "$(lua /path/to/z.lua --init posix)"
 
 
4. 重启shell ,注销系统或者 source ~/.zshrc  激活新的shell
 
z.lua 要经过cd 进入不同的目录才会生效的。一开始如果输入 z 回车,是没有任何反应的。
查看缓存的目录
z -l 
 

20221015001.jpg

 
如果没有显示目录,要么你的配置出问题,要么还是你还没有用cd 切换足够多的目录 让lua 保存记录
 
 

关注公众号,回复 z.lua 获取 z.lua 安装包
 
继续阅读 »
z.lua 是一个快速路径切换工具,它会跟踪你在 shell 下访问过的路径,通过一套称为 Frecent 的机制(源自 FireFox),经过一段简短的学习之后,z.lua 会帮你跳转到所有匹配正则关键字的路径里 Frecent 值最高的那条路径去。

正则将按顺序进行匹配,"z foo bar" 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo。
 
性能:
性能比 z.sh 快三倍,比 fasd / autojump 快十倍以上。
支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
支持 Fish Shell,Power Shell 和 Windows cmd。
使用增强匹配算法,更准确的带你去到你想去的地方。
低占用,能够仅在当前路径改变时才更新数据库(将 $_ZL_ADD_ONCE 设成 1)。
交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
集成 fzf (可选),可以用来做可视化选择或者参数补全。
快速跳转到父目录,或者项目根目录,代替反复 “cd ../../.." 。
兼容 lua 5.1, 5.2 和 5.3 以上版本。
自包含且无额外依赖,单个 z.lua 文件完成所有工作。

安装步骤:
官网太蛋疼,没有写好。
 
下面是个人的安装步骤,在ubuntu20上测试的。
 
1. 安装lua
sudo apt install lua5.3
 
2. 下载z.lua脚本
git clone [url]https://github.com/skywind3000/z.lua.git[/url] 

 
你也可以直接到文末下载。 关注公众号,回复 z.lua即可
 
下载后记录它的 目录:
比如:
/home/root/tool/z.lua

3.  然后配置bash shell
 
首先,确定你是哪个shell, 不同shell的初始化命令参数不一样:
 
bash:
 
在 .bashrc 文件最后加上这一行

eval "$(lua /path/to/z.lua --init bash)"

 
zsh:
在 .zshrc 文件最后加上这一行

eval "$(lua /path/to/z.lua --init zsh)"
 
 
Posix Shells:
 
 
在.profile 文件最后一行加入这一行

eval "$(lua /path/to/z.lua --init posix)"
 
 
4. 重启shell ,注销系统或者 source ~/.zshrc  激活新的shell
 
z.lua 要经过cd 进入不同的目录才会生效的。一开始如果输入 z 回车,是没有任何反应的。
查看缓存的目录
z -l 
 

20221015001.jpg

 
如果没有显示目录,要么你的配置出问题,要么还是你还没有用cd 切换足够多的目录 让lua 保存记录
 
 

关注公众号,回复 z.lua 获取 z.lua 安装包
  收起阅读 »

Django mysql SSL 证书配置

Django的mysql配置在settings.py 里面
 具体配置如下:
 
ca_path = '/etc/ssl/certs/ca-certificates.crt' # 证书地址

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'wordpress',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1`',
'PORT': 3306,
'OPTIONS': {'ssl':{'KEY': ca_path}}
}
}
继续阅读 »
Django的mysql配置在settings.py 里面
 具体配置如下:
 
ca_path = '/etc/ssl/certs/ca-certificates.crt' # 证书地址

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'wordpress',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1`',
'PORT': 3306,
'OPTIONS': {'ssl':{'KEY': ca_path}}
}
}
收起阅读 »

银河证券万一免五 低门槛开户

最近活动继续,免5正常开 (截至至2023-12月底)
 银河证券 全国营业部数量最多;目前有国庆活动,可以低费率万一免五开户,名额不多,时间有限。
 
需要的朋友就赶紧来开一波了。 错过这一轮要等很久的了。

862d90e2d3c2d7840efa68ed5042c66c.jpeg

 
具体费率 股票万一免五
基金etf lof 万0.6
可转债费率十万分之五
 
基金转债也是免五的。
 

 
银河证券app 的自带条件单也越来越丰富,目前是除了华宝智投外 第二好用的条件单证券,也有网格自动下单。
 
如果需要量化,可以开通GMatrix,电脑端的量化操作软件,更加丰富的条件单设置。
 
Gmatrix设置界面,条件单

mmexport1665471972344.png

 
需要可以加微信咨询开户:
 

 
钓鱼的非城勿扰
继续阅读 »
最近活动继续,免5正常开 (截至至2023-12月底)
 银河证券 全国营业部数量最多;目前有国庆活动,可以低费率万一免五开户,名额不多,时间有限。
 
需要的朋友就赶紧来开一波了。 错过这一轮要等很久的了。

862d90e2d3c2d7840efa68ed5042c66c.jpeg

 
具体费率 股票万一免五
基金etf lof 万0.6
可转债费率十万分之五
 
基金转债也是免五的。
 

 
银河证券app 的自带条件单也越来越丰富,目前是除了华宝智投外 第二好用的条件单证券,也有网格自动下单。
 
如果需要量化,可以开通GMatrix,电脑端的量化操作软件,更加丰富的条件单设置。
 
Gmatrix设置界面,条件单

mmexport1665471972344.png

 
需要可以加微信咨询开户:
 

 
钓鱼的非城勿扰 收起阅读 »

SQLAlchemy python数据库实战 【勘误与电子书pdf下载】

SQLAlchemy python数据库实战 
  

 
 
勘误:
P64 页:
backref = backref('orders',order_by=id) 应该改为 : backref = backref('orders',order_by=order_id) 
 
P68页:
cookie= relationship('Cookie',uselist=False,order_by=id) 应该改为 : cookie= relationship('Cookie',uselist=False,order_by=order_id) 
 
总体来说,动物书还是不错的。
需要pdf电子书的朋友,可以关注下面公众号,

后台回复:
SQLAlchemy python数据库实战 
 
获取电子书下载链接。
 
继续阅读 »
SQLAlchemy python数据库实战 
  

 
 
勘误:
P64 页:
backref = backref('orders',order_by=id) 应该改为 : backref = backref('orders',order_by=order_id) 
 
P68页:
cookie= relationship('Cookie',uselist=False,order_by=id) 应该改为 : cookie= relationship('Cookie',uselist=False,order_by=order_id) 
 
总体来说,动物书还是不错的。
需要pdf电子书的朋友,可以关注下面公众号,

后台回复:
SQLAlchemy python数据库实战 
 
获取电子书下载链接。
  收起阅读 »

SQLAlchemy mysql ssl证书 连接

如果你的mysql 服务器需要ssl证书才能连接,那么平时的create_engine连接语句是会报错的。
 
需要加上参数:
connect_args,加上ssl路径。
 
from sqlalchemy import create_engine
ca_path = '/etc/ssl/certs/ca-certificates.crt' # linux 证书路径
ssl_args = {'ssl_ca': ca_path}

engine = create_engine('mysql+pymysql://root:password@127.0.01:3306/wordpressdb?charset=utf8',
echo = True,
connect_args=ssl_args
)
继续阅读 »
如果你的mysql 服务器需要ssl证书才能连接,那么平时的create_engine连接语句是会报错的。
 
需要加上参数:
connect_args,加上ssl路径。
 
from sqlalchemy import create_engine
ca_path = '/etc/ssl/certs/ca-certificates.crt' # linux 证书路径
ssl_args = {'ssl_ca': ca_path}

engine = create_engine('mysql+pymysql://root:password@127.0.01:3306/wordpressdb?charset=utf8',
echo = True,
connect_args=ssl_args
)
收起阅读 »

python社工库合集


maigret.png

 https://github.com/soxoj/maigret

这个项目太吓人了,输入 id,就能把互联网上你的相关账号全部扒出来,而且不仅仅是简单的 id 匹配,你的用户资料字段也会被匹配,而且连 pornhub/xvideo 账号都有。
 
使用方法(python):
 
# install from pypi 
 
pip3 install maigret 
 
# usage 
maigret username

20221008001.jpg

 个人亲测了一下,这个库主要针对国内外一些大型的网站进行扫描,得到的结果还是很准的。

如果有专门针对国内网站的库,欢迎留言回复~
 
 
继续阅读 »

maigret.png

 https://github.com/soxoj/maigret

这个项目太吓人了,输入 id,就能把互联网上你的相关账号全部扒出来,而且不仅仅是简单的 id 匹配,你的用户资料字段也会被匹配,而且连 pornhub/xvideo 账号都有。
 
使用方法(python):
 
# install from pypi 
 
pip3 install maigret 
 
# usage 
maigret username

20221008001.jpg

 个人亲测了一下,这个库主要针对国内外一些大型的网站进行扫描,得到的结果还是很准的。

如果有专门针对国内网站的库,欢迎留言回复~
 
  收起阅读 »

influxdb什么都没有做,数据目录占用很大磁盘空间

之前只是安装了influxdb的程序,并设置成了服务。
后面就没有怎么导入数据。
 
结果最近硬盘一直警报,说空间不够了。
 
经过一番排查,发现是influxdb的数据目录很大,有接近100GB。
默认目录在这里:
/var/lib/influxdb/engine/data

停止服务:
 
sudo systemctl restart influxdb

 不过这样下次系统重启,influxdb还是会自动重启。还需要把服务给禁用掉。
update-rc.d influxdb remove

 如果没有报错,就成功了。
 

 
 
继续阅读 »
之前只是安装了influxdb的程序,并设置成了服务。
后面就没有怎么导入数据。
 
结果最近硬盘一直警报,说空间不够了。
 
经过一番排查,发现是influxdb的数据目录很大,有接近100GB。
默认目录在这里:
/var/lib/influxdb/engine/data

停止服务:
 
sudo systemctl restart influxdb

 不过这样下次系统重启,influxdb还是会自动重启。还需要把服务给禁用掉。
update-rc.d influxdb remove

 如果没有报错,就成功了。
 

 
  收起阅读 »

把抖音的小姐姐舞蹈视频的背景音乐静音了,瞬间觉得她们好傻

 

20221006003.jpg

 
PS: 找到了一个视频接口,猜测是哪个爬虫项目的。可以不断的获取新的抖音小姐姐视频。后面因为硬盘空间不够就停掉了。

20221006004.jpg

 
 
 

20221006003.jpg

 
PS: 找到了一个视频接口,猜测是哪个爬虫项目的。可以不断的获取新的抖音小姐姐视频。后面因为硬盘空间不够就停掉了。

20221006004.jpg

 
 

万一免五 新开股票证券账户 注意事项

问:如何通过手机客户端进行自助开户?

答:通过扫描专属开户二维码或下载安装客户端手机版,即可进行开户和交易。1个工作日后可调好佣金,长期有效




问:手机开户对网络有什么要求?

答:根据中登公司规定,个人客户凭借数字证书在网上开户需要进行视频见证。因此,开户过程中需要保持较快速度的网络通信,建议您在4G及以上或Wi-Fi的环境下进行手机开户将会更流畅。




问:手机开户有时间要求吗?

答:手机开户7*24小时受理,您可以随时提交开户申请。交易时间几分钟审核通过,非交易时间第二个交易日早上九点左右审核通过




问:哪些手机系统支持手机开户?

答:苹果及安卓系统手机都支持手机开户;建议更新至苹果/安卓系统最新版本。为了您在开户过程中能流畅地进行视频,请您准备具备双摄像头的手机(摄像头像素在500万以上效果更佳),并确保网络流畅。




问:手机开户的过程有哪些?

答:您只需进行上传证件照片、视频录像、填写信息的操作,3-5分钟即可完成开户手续。



低佣开户.jpeg


低佣开户.jpeg



问:为什么拍的身份证照片都不符合要求?

答:必须为您本人有效二代身份证原件拍摄,拍摄的身份证照片要求身份证图像边框完整,文字清晰,亮度均匀,无水印,无遮挡。请保持网络通顺、稳定,拍摄环境光线充足。




问:为什么要进行视频见证?

答:视频见证是为确保您的资产安全,根据监管机构要求,投资者网上开立中国登记公司股东账户还必须和证券公司网上开户见证人员通过网上视频进行实时视频见证,见证过程中见证人员将对您上传的证件资料和视频内容进行审核,并对见证视频进行录像。视频见证必须由您本人亲自办理。




问:视频见证如何操作?

答:请确保头像在摄像范围内,用普通话阅读界面上的文字提示。还可以在拍摄完之后,点击“视频回放”确认图像和声音是否清晰。




问:手机版客户端可以在哪些手机应用市场下载?

答:您可以在官网【软件下载】栏目或通过以下手机市场下载客户端。苹果系统的手机用户可以在App Store中搜索“xxxx”下载iPhone版。安卓系统的手机用户可以在手机应用商店、360手机助手、应用宝、百度手机助手等主流手机应用市场中搜索“xxxx”下载Android版。




问:手机收不到验证码怎么办?

答:由于网络等原因,验证码可能存在延时,60秒后仍未收到验证码,可申请重新获取,若始终无法获取验证码,请致电95357进行咨询。




问:身份验证失败是什么原因?

答:姓名和身份证需经过公安局官方联网系统验证,请确保输入的姓名和身份证信息正确。




问:身份证正反面如何区分?

答:身份证正面是身份证头像面,背面是发证机关和有效期面。




问:身份证识别失败是什么原因?

答:请将手机相机调整为“横屏模式”再进行身份证拍摄,并尽可能确保照片上的信息清晰可辨。




问:哪些交易密码不能通过?

答:根据规定,交易密码不允许设置成简单密码,简单密码包括:(1)密码为同一数字。;(2)数字顺序递增或递减,例如123456,654321;(3)数字前后三位递增重复,例如123123。




问:创业板可以开通吗?

答: 如果您已在其他券商开通过创业板,仍可通过对应券商手机APP业务办理里面转签,在其他券商的创业板权限不受影响。如果第一次开通,需要满足开户两年,连续二十个工作日日均资产十万+,才能在手机端开通.




问:“一人三户”是什么意思?

答:根据中国证券登记结算有限公司发布的关于修订《证券账户业务指南》具体修订内容“一个投资者只能申请开立一个一码通账户。一个投资者在同一市场最多可以申请开立3个沪A股账户、20个深A张账号,封闭式基金账户,只能申请开立1个信用账户、B股账户。”



问:我已在其他券商开了股票账户,能否通过一人多户新开账户,具体如何办理?

答:支持“一人多户”,如果您已经在其他证券公司开了A股股票账户,您同样可以新开两个其他证券公司账户。




问:开户的结果什么时候可以告知?

答:如果您是在交易日上午9:30-16:00成功提交开户申请,则开户结果最快将在交易时间内实时反馈给您;如果您是在交易日上午0:00-9:30成功提交开户申请,则开户结果最快会在当日反馈给您;如果您是在16:00后成功提交开户申请,则开户结果最快会在下一交易日内反馈给您。




问:开户进度如何得知?

答:我司会及时将开户结果以短信的方式告知您,您也可以自行在手机端开户界面,输入您开户时使用的手机号码,在获取验证码后并验证成功后即可看到您的开户进度。




问:我在其他券商这里开过股票账户,原券商绑定的银行卡可以用吗?

答:绝大多数银行支持一卡绑定多家券商。




问:手机开户是否提供纸质证券账户卡?

答:手机开户暂不提供纸质账户卡。根据中登公司相关规则,公司会通过证券交易终端、短信等多种途径向投资者反馈证券账户号码。
 
最后,仍有少量头部券商万一免X名额,扫码获取,备注:开户
 
 
继续阅读 »
问:如何通过手机客户端进行自助开户?

答:通过扫描专属开户二维码或下载安装客户端手机版,即可进行开户和交易。1个工作日后可调好佣金,长期有效




问:手机开户对网络有什么要求?

答:根据中登公司规定,个人客户凭借数字证书在网上开户需要进行视频见证。因此,开户过程中需要保持较快速度的网络通信,建议您在4G及以上或Wi-Fi的环境下进行手机开户将会更流畅。




问:手机开户有时间要求吗?

答:手机开户7*24小时受理,您可以随时提交开户申请。交易时间几分钟审核通过,非交易时间第二个交易日早上九点左右审核通过




问:哪些手机系统支持手机开户?

答:苹果及安卓系统手机都支持手机开户;建议更新至苹果/安卓系统最新版本。为了您在开户过程中能流畅地进行视频,请您准备具备双摄像头的手机(摄像头像素在500万以上效果更佳),并确保网络流畅。




问:手机开户的过程有哪些?

答:您只需进行上传证件照片、视频录像、填写信息的操作,3-5分钟即可完成开户手续。



低佣开户.jpeg


低佣开户.jpeg



问:为什么拍的身份证照片都不符合要求?

答:必须为您本人有效二代身份证原件拍摄,拍摄的身份证照片要求身份证图像边框完整,文字清晰,亮度均匀,无水印,无遮挡。请保持网络通顺、稳定,拍摄环境光线充足。




问:为什么要进行视频见证?

答:视频见证是为确保您的资产安全,根据监管机构要求,投资者网上开立中国登记公司股东账户还必须和证券公司网上开户见证人员通过网上视频进行实时视频见证,见证过程中见证人员将对您上传的证件资料和视频内容进行审核,并对见证视频进行录像。视频见证必须由您本人亲自办理。




问:视频见证如何操作?

答:请确保头像在摄像范围内,用普通话阅读界面上的文字提示。还可以在拍摄完之后,点击“视频回放”确认图像和声音是否清晰。




问:手机版客户端可以在哪些手机应用市场下载?

答:您可以在官网【软件下载】栏目或通过以下手机市场下载客户端。苹果系统的手机用户可以在App Store中搜索“xxxx”下载iPhone版。安卓系统的手机用户可以在手机应用商店、360手机助手、应用宝、百度手机助手等主流手机应用市场中搜索“xxxx”下载Android版。




问:手机收不到验证码怎么办?

答:由于网络等原因,验证码可能存在延时,60秒后仍未收到验证码,可申请重新获取,若始终无法获取验证码,请致电95357进行咨询。




问:身份验证失败是什么原因?

答:姓名和身份证需经过公安局官方联网系统验证,请确保输入的姓名和身份证信息正确。




问:身份证正反面如何区分?

答:身份证正面是身份证头像面,背面是发证机关和有效期面。




问:身份证识别失败是什么原因?

答:请将手机相机调整为“横屏模式”再进行身份证拍摄,并尽可能确保照片上的信息清晰可辨。




问:哪些交易密码不能通过?

答:根据规定,交易密码不允许设置成简单密码,简单密码包括:(1)密码为同一数字。;(2)数字顺序递增或递减,例如123456,654321;(3)数字前后三位递增重复,例如123123。




问:创业板可以开通吗?

答: 如果您已在其他券商开通过创业板,仍可通过对应券商手机APP业务办理里面转签,在其他券商的创业板权限不受影响。如果第一次开通,需要满足开户两年,连续二十个工作日日均资产十万+,才能在手机端开通.




问:“一人三户”是什么意思?

答:根据中国证券登记结算有限公司发布的关于修订《证券账户业务指南》具体修订内容“一个投资者只能申请开立一个一码通账户。一个投资者在同一市场最多可以申请开立3个沪A股账户、20个深A张账号,封闭式基金账户,只能申请开立1个信用账户、B股账户。”



问:我已在其他券商开了股票账户,能否通过一人多户新开账户,具体如何办理?

答:支持“一人多户”,如果您已经在其他证券公司开了A股股票账户,您同样可以新开两个其他证券公司账户。




问:开户的结果什么时候可以告知?

答:如果您是在交易日上午9:30-16:00成功提交开户申请,则开户结果最快将在交易时间内实时反馈给您;如果您是在交易日上午0:00-9:30成功提交开户申请,则开户结果最快会在当日反馈给您;如果您是在16:00后成功提交开户申请,则开户结果最快会在下一交易日内反馈给您。




问:开户进度如何得知?

答:我司会及时将开户结果以短信的方式告知您,您也可以自行在手机端开户界面,输入您开户时使用的手机号码,在获取验证码后并验证成功后即可看到您的开户进度。




问:我在其他券商这里开过股票账户,原券商绑定的银行卡可以用吗?

答:绝大多数银行支持一卡绑定多家券商。




问:手机开户是否提供纸质证券账户卡?

答:手机开户暂不提供纸质账户卡。根据中登公司相关规则,公司会通过证券交易终端、短信等多种途径向投资者反馈证券账户号码。
 
最后,仍有少量头部券商万一免X名额,扫码获取,备注:开户
 
 
收起阅读 »

Ptrade量化交易之 拆单买入卖出操作

在交易过程中,如果遇到成交量小的股票或者可转债,etf,稍微买多一些会对现价造成冲击,价格容易被你自己拉起来。所以假如你的交易量很大的话,一般最好使用拆单操作。 可以参考下面的python拆单代码:
 注:代码里面针对的是可转债交易,股票的话把这一行:

remain_count=int(remain_count/10)*10 改为

remain_count=int(remain_count/100)*100 就可以了

股票100股整数倍买,转债是10张倍数买。


code,direction,target_count : 第一个代码,第二个买卖方向,第三个是目标数目
 

each_order_count = 100 # 每单的股数,张数

def split_order(code,direction,target_count):
'''
拆单
:param code: 股票代码
:param direction: 买:1 卖:-1
:param target_count: 总共要卖的股数
:return:
'''

SPLIT_ORDER_DELAY =1
each_order_count = 100 # 每单的股数,张数
count = int(target_count/each_order_count)
remain_count = target_count%each_order_count

for i in range(count):
ret = order(code,direction*each_order_count)
time.sleep(SPLIT_ORDER_DELAY)

if direction==1:
remain_count=int(remain_count/10)*10 # 可转债买的时候只能10的倍数交易,

if remain_count>0:
ret = order(code,direction*each_order_count)

 
更多ptrade实盘代码,欢迎关注个人知识星球
继续阅读 »
在交易过程中,如果遇到成交量小的股票或者可转债,etf,稍微买多一些会对现价造成冲击,价格容易被你自己拉起来。所以假如你的交易量很大的话,一般最好使用拆单操作。 可以参考下面的python拆单代码:
 注:代码里面针对的是可转债交易,股票的话把这一行:

remain_count=int(remain_count/10)*10 改为

remain_count=int(remain_count/100)*100 就可以了

股票100股整数倍买,转债是10张倍数买。


code,direction,target_count : 第一个代码,第二个买卖方向,第三个是目标数目
 

each_order_count = 100 # 每单的股数,张数

def split_order(code,direction,target_count):
'''
拆单
:param code: 股票代码
:param direction: 买:1 卖:-1
:param target_count: 总共要卖的股数
:return:
'''

SPLIT_ORDER_DELAY =1
each_order_count = 100 # 每单的股数,张数
count = int(target_count/each_order_count)
remain_count = target_count%each_order_count

for i in range(count):
ret = order(code,direction*each_order_count)
time.sleep(SPLIT_ORDER_DELAY)

if direction==1:
remain_count=int(remain_count/10)*10 # 可转债买的时候只能10的倍数交易,

if remain_count>0:
ret = order(code,direction*each_order_count)

 
更多ptrade实盘代码,欢迎关注个人知识星球
收起阅读 »

Ptrade挂单后撤单函数 实现

在ptrade的每一笔挂单,都不一定能够保证很成功,比如刚挂了单,股票就飞了。
 所以也需要有撤单,重新挂的动作。
 
    order(code,amount) # 买入或者卖出

time.sleep(CANCEL_ORDER_TIME) # 等待片刻

cancel_order_reorder(context) # 进入撤单函数

中间需要有个等待时间。
1。 买入后,并不一定买上成交,需要一点时间消化,尤其是量大的单子,得要慢慢吃掉。
2。 成交回报并不是实时的。记住,ptrade的成交回报是有个延时,约9秒。 也就是你成交后,立即调用get_positions函数 看看你持仓,是无法看到你刚刚买入的股票数据的。
 
比如:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)

def handle_data(context, data):
order(g.security,100)
position = get_position(g.security)
log.info(position)
这样你是无法获取的你的持仓的。
 
 
下面的示例代码,获取还在挂单的委托单子,然后逐个撤销,重新按照最新的市价下单。
 
def cancel_order_reorder(context):
'''
取消订单,重新下单
:return:
'''

open_orders = get_open_orders()

for _order in open_orders:
_id = _order.id
amount=_order.amount
filled=_order.filled
next_amount = amount-filled
code = _order.symbol
log.info('撤单{} - {}'.format(code,next_amount))
cancel_order(_id)

# time.sleep(1)
log.info('重新下单{} 数量{}'.format(code,next_amount))
order(code,next_amount)

 
后话:
很多投资者没有编程基础,学习起来会很吃力,耗费大量的时间,得不偿失。写出来的代码也是很多bug而不自知。等到实盘了用真金白银 得到了教训,还不如早期跟一两个人有经验的人学习,甚至找个代写代码就好了。
 当然,能力超强,精力旺盛的大神就无视了,这个人折腾起来什么都可以搞得有模有样。 
 
继续阅读 »
在ptrade的每一笔挂单,都不一定能够保证很成功,比如刚挂了单,股票就飞了。
 所以也需要有撤单,重新挂的动作。
 
    order(code,amount) # 买入或者卖出

time.sleep(CANCEL_ORDER_TIME) # 等待片刻

cancel_order_reorder(context) # 进入撤单函数

中间需要有个等待时间。
1。 买入后,并不一定买上成交,需要一点时间消化,尤其是量大的单子,得要慢慢吃掉。
2。 成交回报并不是实时的。记住,ptrade的成交回报是有个延时,约9秒。 也就是你成交后,立即调用get_positions函数 看看你持仓,是无法看到你刚刚买入的股票数据的。
 
比如:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)

def handle_data(context, data):
order(g.security,100)
position = get_position(g.security)
log.info(position)
这样你是无法获取的你的持仓的。
 
 
下面的示例代码,获取还在挂单的委托单子,然后逐个撤销,重新按照最新的市价下单。
 
def cancel_order_reorder(context):
'''
取消订单,重新下单
:return:
'''

open_orders = get_open_orders()

for _order in open_orders:
_id = _order.id
amount=_order.amount
filled=_order.filled
next_amount = amount-filled
code = _order.symbol
log.info('撤单{} - {}'.format(code,next_amount))
cancel_order(_id)

# time.sleep(1)
log.info('重新下单{} 数量{}'.format(code,next_amount))
order(code,next_amount)

 
后话:
很多投资者没有编程基础,学习起来会很吃力,耗费大量的时间,得不偿失。写出来的代码也是很多bug而不自知。等到实盘了用真金白银 得到了教训,还不如早期跟一两个人有经验的人学习,甚至找个代写代码就好了。
 当然,能力超强,精力旺盛的大神就无视了,这个人折腾起来什么都可以搞得有模有样。 
 
收起阅读 »

降低股票交易佣金成本,万一免五还有吗

大家一般自己去券商APP开户,默认提示都是万2.5费率,单笔不满5元收取5元手续费,意思就是如果你买一万块钱的股票虽然佣金是1万*万2.5=2.5,但是不好意思,因为低于最低收费5元,直接按五块收取!

所以免5:这个就好解释了,就算你买1000块钱的股票也是按照佣金比例收取。如果费率是万1,那么买1000块钱股票就只收0.1元。交易成本对比一目了然,来,看图说话


万一免五png.png



股票交易成本(证券公司的交割单中明列的)包括如下几种,

1. 印花税

卖出的时候千分之1,政府收。这个是政府统一收取,也是股民为国家应尽的义务。是按实收取的,没有起步收费,是1分钱就收1分。

2. 过户费

沪深交易所买卖都有,万分之0.2,中国登记结算公司收。中国登记结算公司是为证券交易提供集中登记、存管与结算服务的法人。所有投资者的交易结算最终都由他负责,他收取的费用对所有券商和投资者也是无差别的。这个也是按实收的,没有起步收费。

3. 证券公司手续费

买卖都有,一般证券公司手续费包含规费。规费是交易所收取,由两部分组成:

(1) 证管费万分之0.2。

(2) 证券交易经手费万分之0.487。

因此规费合计为万分之0.687。买卖双边收取。规费在券商的交割单中并不单列,与手续费合在一起收取。

万一免五指的就是这个部分了。假设我交易1千元股票,如果手续费率是万1,那么手续费应为0.1元,但一般情况下手续费不足5元按5元收取,所以实收手续费是5元。在免5(免五)的情况下,手续费按实收0.1元,也就是节省了4.9元手续费。
 
新手容易踩坑,随便开了一个户,等交易的时候才发现原来扣钱这么多,见过太多的新手开户时并不了解费率,交易时才感觉到肉疼,所以希望大家在开户时可以多比较,多对比,找到适合自己的券商。而且要找低佣渠道的券商。降低股票交易成本
 


目前笔者获取了最低开户福利渠道,扫码获取详情,备注:开户
 
继续阅读 »
大家一般自己去券商APP开户,默认提示都是万2.5费率,单笔不满5元收取5元手续费,意思就是如果你买一万块钱的股票虽然佣金是1万*万2.5=2.5,但是不好意思,因为低于最低收费5元,直接按五块收取!

所以免5:这个就好解释了,就算你买1000块钱的股票也是按照佣金比例收取。如果费率是万1,那么买1000块钱股票就只收0.1元。交易成本对比一目了然,来,看图说话


万一免五png.png



股票交易成本(证券公司的交割单中明列的)包括如下几种,

1. 印花税

卖出的时候千分之1,政府收。这个是政府统一收取,也是股民为国家应尽的义务。是按实收取的,没有起步收费,是1分钱就收1分。

2. 过户费

沪深交易所买卖都有,万分之0.2,中国登记结算公司收。中国登记结算公司是为证券交易提供集中登记、存管与结算服务的法人。所有投资者的交易结算最终都由他负责,他收取的费用对所有券商和投资者也是无差别的。这个也是按实收的,没有起步收费。

3. 证券公司手续费

买卖都有,一般证券公司手续费包含规费。规费是交易所收取,由两部分组成:

(1) 证管费万分之0.2。

(2) 证券交易经手费万分之0.487。

因此规费合计为万分之0.687。买卖双边收取。规费在券商的交割单中并不单列,与手续费合在一起收取。

万一免五指的就是这个部分了。假设我交易1千元股票,如果手续费率是万1,那么手续费应为0.1元,但一般情况下手续费不足5元按5元收取,所以实收手续费是5元。在免5(免五)的情况下,手续费按实收0.1元,也就是节省了4.9元手续费。
 
新手容易踩坑,随便开了一个户,等交易的时候才发现原来扣钱这么多,见过太多的新手开户时并不了解费率,交易时才感觉到肉疼,所以希望大家在开户时可以多比较,多对比,找到适合自己的券商。而且要找低佣渠道的券商。降低股票交易成本
 


目前笔者获取了最低开户福利渠道,扫码获取详情,备注:开户
 
收起阅读 »

可转债 最新的不下修转股价 名单 持续更新

已公布不下修转股价的可转债列表汇总
 
数据更新至2022年9月24日。

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

现在市场的情况也是这样,如果可转债公布不下修,第二天的开盘会以低开反映出来。

数据来源:巨潮。

文末附获取原始数据方法。
 
t1.jpeg
点击查看大图


t2.jpeg
点击查看大图


t3.jpeg
点击查看大图
 

链接: https://pan.baidu.com/s/1TVAR3nftALTWR0VTnagVhg 提取码: 5wde
更多公众号文章代码与数据,可输入:帮助
 

 
继续阅读 »
已公布不下修转股价的可转债列表汇总
 
数据更新至2022年9月24日。

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

现在市场的情况也是这样,如果可转债公布不下修,第二天的开盘会以低开反映出来。

数据来源:巨潮。

文末附获取原始数据方法。
 
t1.jpeg
点击查看大图


t2.jpeg
点击查看大图


t3.jpeg
点击查看大图
 

链接: https://pan.baidu.com/s/1TVAR3nftALTWR0VTnagVhg 提取码: 5wde
更多公众号文章代码与数据,可输入:帮助
 

  收起阅读 »

Ptrade在一个循环事件里 能否不断获取股票实时价格?

假设在一个事件循环里:
如:
run_daily(context, get_price, '09:44')
定义的get_price 函数,
然后get_price函数里面有一个死循环,不断地获取价格。
 
因为ptrade的行情切片 是每3秒更新的一次的,如果行情没更新,那么当前的价格也是过去最近的一个3s的价格。
 
现在问题是,在一个固定的时间里面,不断地读取价格函数,能获取到最新的价格吗 ?
 
 
我们用代码实践一下:
 
import time
def initialize(context):
# 初始化策略

run_daily(context, get_price, '09:44')

def handle_data(context, data):
pass


def get_price(context):
for i in range(10):
target_list =['113585.SS','123057.SZ']
bond_gear_price_target = get_gear_price(target_list)

for code in target_list:
price = bond_gear_price_target[code]['offer_grp'][1][0]
log.info('code: {} price {} '.format(code,price))

time.sleep(1)

输出的结果:
 
2022-09-28 10:31:00 - INFO - code: 113585.SS price 169.147 
2022-09-28 10:31:00 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:01 - INFO - code: 113585.SS price 169.147
2022-09-28 10:31:01 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:02 - INFO - code: 113585.SS price 169.156
2022-09-28 10:31:02 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:03 - INFO - code: 113585.SS price 169.156
2022-09-28 10:31:03 - INFO - code: 128053.SZ price 144.8
2022-09-28 10:31:04 - INFO - code: 113585.SS price 169.199
2022-09-28 10:31:04 - INFO - code: 128053.SZ price 144.8
2022-09-28 10:31:05 - INFO - code: 113585.SS price 169.199
2022-09-28 10:31:05 - INFO - code: 128053.SZ price 144.8
2022-09-28 10:31:06 - INFO - code: 113585.SS price 169.199
2022-09-28 10:31:06 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:07 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:07 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:08 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:08 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:09 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:09 - INFO - code: 128053.SZ price 144.746
2022-09-28 10:31:10 - INFO - code: 113585.SS price 169.066
2022-09-28 10:31:10 - INFO - code: 128053.SZ price 144.746
2022-09-28 10:31:11 - INFO - code: 113585.SS price 169.066
2022-09-28 10:31:11 - INFO - code: 128053.SZ price 144.746
2022-09-28 10:31:12 - INFO - code: 113585.SS price 169.066
2022-09-28 10:31:12 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:13 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:13 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:14 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:14 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:15 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:15 - INFO - code: 128053.SZ price 144.692
2022-09-28 10:31:16 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:16 - INFO - code: 128053.SZ price 144.692
2022-09-28 10:31:17 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:17 - INFO - code: 128053.SZ price 144.692
2022-09-28 10:31:18 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:18 - INFO - code: 128053.SZ price 144.691
2022-09-28 10:31:19 - INFO - code: 113585.SS price 169.062
2022-09-28 10:31:19 - INFO - code: 128053.SZ price 144.691
2022-09-28 10:31:20 - INFO - code: 113585.SS price 169.062


为了更为直观,过滤掉另外一只可转债
只保留一只
2022-09-28 10:31:00 - INFO - code: 113585.SS price 169.147 

2022-09-28 10:31:01 - INFO - code: 113585.SS price 169.147

2022-09-28 10:31:02 - INFO - code: 113585.SS price 169.156

2022-09-28 10:31:03 - INFO - code: 113585.SS price 169.156

2022-09-28 10:31:04 - INFO - code: 113585.SS price 169.199

2022-09-28 10:31:05 - INFO - code: 113585.SS price 169.199

2022-09-28 10:31:06 - INFO - code: 113585.SS price 169.199

2022-09-28 10:31:07 - INFO - code: 113585.SS price 169.068

2022-09-28 10:31:08 - INFO - code: 113585.SS price 169.068

2022-09-28 10:31:09 - INFO - code: 113585.SS price 169.068

2022-09-28 10:31:10 - INFO - code: 113585.SS price 169.066

2022-09-28 10:31:11 - INFO - code: 113585.SS price 169.066
可以看到价格也是基本没个3s更新一次。
 
 
 
更多ptrade实盘代码,请常见个人星球。
【可转债追涨杀跌日内T+0,双低 低价 低溢价 规模多因子轮动】

20220928002.jpg

 

20220928001.jpg

 

 
 
继续阅读 »
假设在一个事件循环里:
如:
run_daily(context, get_price, '09:44')
定义的get_price 函数,
然后get_price函数里面有一个死循环,不断地获取价格。
 
因为ptrade的行情切片 是每3秒更新的一次的,如果行情没更新,那么当前的价格也是过去最近的一个3s的价格。
 
现在问题是,在一个固定的时间里面,不断地读取价格函数,能获取到最新的价格吗 ?
 
 
我们用代码实践一下:
 
import time
def initialize(context):
# 初始化策略

run_daily(context, get_price, '09:44')

def handle_data(context, data):
pass


def get_price(context):
for i in range(10):
target_list =['113585.SS','123057.SZ']
bond_gear_price_target = get_gear_price(target_list)

for code in target_list:
price = bond_gear_price_target[code]['offer_grp'][1][0]
log.info('code: {} price {} '.format(code,price))

time.sleep(1)

输出的结果:
 
2022-09-28 10:31:00 - INFO - code: 113585.SS price 169.147 
2022-09-28 10:31:00 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:01 - INFO - code: 113585.SS price 169.147
2022-09-28 10:31:01 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:02 - INFO - code: 113585.SS price 169.156
2022-09-28 10:31:02 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:03 - INFO - code: 113585.SS price 169.156
2022-09-28 10:31:03 - INFO - code: 128053.SZ price 144.8
2022-09-28 10:31:04 - INFO - code: 113585.SS price 169.199
2022-09-28 10:31:04 - INFO - code: 128053.SZ price 144.8
2022-09-28 10:31:05 - INFO - code: 113585.SS price 169.199
2022-09-28 10:31:05 - INFO - code: 128053.SZ price 144.8
2022-09-28 10:31:06 - INFO - code: 113585.SS price 169.199
2022-09-28 10:31:06 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:07 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:07 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:08 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:08 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:09 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:09 - INFO - code: 128053.SZ price 144.746
2022-09-28 10:31:10 - INFO - code: 113585.SS price 169.066
2022-09-28 10:31:10 - INFO - code: 128053.SZ price 144.746
2022-09-28 10:31:11 - INFO - code: 113585.SS price 169.066
2022-09-28 10:31:11 - INFO - code: 128053.SZ price 144.746
2022-09-28 10:31:12 - INFO - code: 113585.SS price 169.066
2022-09-28 10:31:12 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:13 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:13 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:14 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:14 - INFO - code: 128053.SZ price 144.785
2022-09-28 10:31:15 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:15 - INFO - code: 128053.SZ price 144.692
2022-09-28 10:31:16 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:16 - INFO - code: 128053.SZ price 144.692
2022-09-28 10:31:17 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:17 - INFO - code: 128053.SZ price 144.692
2022-09-28 10:31:18 - INFO - code: 113585.SS price 169.068
2022-09-28 10:31:18 - INFO - code: 128053.SZ price 144.691
2022-09-28 10:31:19 - INFO - code: 113585.SS price 169.062
2022-09-28 10:31:19 - INFO - code: 128053.SZ price 144.691
2022-09-28 10:31:20 - INFO - code: 113585.SS price 169.062


为了更为直观,过滤掉另外一只可转债
只保留一只
2022-09-28 10:31:00 - INFO - code: 113585.SS price 169.147 

2022-09-28 10:31:01 - INFO - code: 113585.SS price 169.147

2022-09-28 10:31:02 - INFO - code: 113585.SS price 169.156

2022-09-28 10:31:03 - INFO - code: 113585.SS price 169.156

2022-09-28 10:31:04 - INFO - code: 113585.SS price 169.199

2022-09-28 10:31:05 - INFO - code: 113585.SS price 169.199

2022-09-28 10:31:06 - INFO - code: 113585.SS price 169.199

2022-09-28 10:31:07 - INFO - code: 113585.SS price 169.068

2022-09-28 10:31:08 - INFO - code: 113585.SS price 169.068

2022-09-28 10:31:09 - INFO - code: 113585.SS price 169.068

2022-09-28 10:31:10 - INFO - code: 113585.SS price 169.066

2022-09-28 10:31:11 - INFO - code: 113585.SS price 169.066
可以看到价格也是基本没个3s更新一次。
 
 
 
更多ptrade实盘代码,请常见个人星球。
【可转债追涨杀跌日内T+0,双低 低价 低溢价 规模多因子轮动】

20220928002.jpg

 

20220928001.jpg

 

 
  收起阅读 »

国庆节 微信头像红旗 制作 附 python代码 和 红旗素材

国庆节的时候,很多地方都会升挂国旗,庆祝祖国一年一度的节日。

给自己制作国旗头像,是一件很有意义的事。微信官方就曾经举办过活动。

制作国旗头像的方法有很多,本文给大家介绍用Python制作渐变的微信国旗头像。
 

5EFB522509E5461D870CDA736ED7E6DF.png

 

渐变的国旗头像效果非常好看。
 
制作方式也很简单,下面介绍实现方法,可以复制本文的代码,制作属于自己的国旗头像。
 
 

1.准备国旗图片

flag-1024.png

 
声明:严禁非法使用国旗图片。在国旗图片下载页面下方有《国旗法》等相关规定。

 
本文使用1024像素的图片。
 

2.准备头像图片
登录自己的微信,打开个人信息,点击头像,点击右上角的三个点,将图片保存到手机,
 
然后将图片传到电脑上。

为了不失一般性,本文使用的图片是我从网络上获取的一张600*600像素的头像图片。

准备好后,将国旗图片和头像图片拷贝到代码同一个目录下。
 

代码实现

先安装Python中用于处理图片的pillow库。
 
pip install pillow


安装完成后,使用pillow库来制作国旗头像。
只需要十几行代码就能实现。完整代码如下。
 
# coding=utf-8
from PIL import Image
import math

key = 3.2# 修改key值可以调整国旗的范围,推荐2~4之间的数字,支持小数
motherland_flag = Image.open('flag-1024.png')
head_picture = Image.open('mmexport1663893338571.png')
# 截图国旗上的五颗五角星
flag_width, flag_height = motherland_flag.size
crop_flag = motherland_flag.crop((66, 0, flag_height+66, flag_height))
# 将国旗截图处理成颜色渐变
for i in range(flag_height):
for j in range(flag_height):
color = crop_flag.getpixel((i, j))
distance = int(math.sqrt(i*i + j*j))
alpha = 255 - int(distance//key)
new_color = (*color[0:-1], alpha if alpha > 0 else 0)
crop_flag.putpixel((i, j), new_color)
# 修改渐变图片的尺寸,适应头像大小,粘贴到头像上
new_crop_flag = crop_flag.resize(head_picture.size)
head_picture.paste(new_crop_flag, (0, 0), new_crop_flag)
# 保存自己的国旗头像
head_picture.save('国旗头像.png')

 
到此为止,已经制作好了国旗头像了。
 
 
下面是代码的详细结束:

代码介绍:
代码介绍:

导入需要使用的Python库,pillow库用于对图片进行截取、大小修改、粘贴等处理。math库用于计算像素点的距离。

使用Image.open()方法,读取准备好的国旗图片和头像图片到代码中。

对国旗图片进行截取,获取一张正方形的图片,截取时调整截取位置,保证5颗五角星完整展示在截图中。

crop()方法中传入的是一个(left, upper, right, lower)的元组,分别是截图的左、上、右、下像素位置。
将正方形国旗截图设置成透明度渐变的图片。国旗图片的模式默认是RGBA,本文需要的刚好是RGBA(red,green,blue,alpha)模式的图片,RGBA模式的图片颜色值是一个长度为4的元组,我们修改不同像素点的A值即可将图片设置成渐变。

本文是以国旗左上角为圆心,离圆心越远的像素点A值越小,像素点越透明。使用getpixel()和putpixel()两个方法来获取和重设像素点的颜色值,使用math.sqrt()计算像素点距离。

将渐变图片的大小转换成和头像的大小一样,然后粘贴到图片顶层。使用resize()方法重设图片大小,使用paste()方法粘贴图片。

保存图片,此时的微信头像图片上已经粘贴了透明渐变的国旗图片,微信国旗头像制作完成。


本文介绍了用Python制作微信国旗头像的方法。在本文的代码中,以左上角为圆心,离圆心越远越透明,可以修改key值,调整国旗透明变化的范围。

如果需要制作其他渐变类型,如以右上角为圆心逐渐透明、从左侧向右侧逐渐透明、从上到下逐渐透明等,可以修改国旗渐变部分的代码、翻转图片等。
 

 
 
 

 
继续阅读 »
国庆节的时候,很多地方都会升挂国旗,庆祝祖国一年一度的节日。

给自己制作国旗头像,是一件很有意义的事。微信官方就曾经举办过活动。

制作国旗头像的方法有很多,本文给大家介绍用Python制作渐变的微信国旗头像。
 

5EFB522509E5461D870CDA736ED7E6DF.png

 

渐变的国旗头像效果非常好看。
 
制作方式也很简单,下面介绍实现方法,可以复制本文的代码,制作属于自己的国旗头像。
 
 

1.准备国旗图片

flag-1024.png

 
声明:严禁非法使用国旗图片。在国旗图片下载页面下方有《国旗法》等相关规定。

 
本文使用1024像素的图片。
 

2.准备头像图片
登录自己的微信,打开个人信息,点击头像,点击右上角的三个点,将图片保存到手机,
 
然后将图片传到电脑上。

为了不失一般性,本文使用的图片是我从网络上获取的一张600*600像素的头像图片。

准备好后,将国旗图片和头像图片拷贝到代码同一个目录下。
 

代码实现

先安装Python中用于处理图片的pillow库。
 
pip install pillow


安装完成后,使用pillow库来制作国旗头像。
只需要十几行代码就能实现。完整代码如下。
 
# coding=utf-8
from PIL import Image
import math

key = 3.2# 修改key值可以调整国旗的范围,推荐2~4之间的数字,支持小数
motherland_flag = Image.open('flag-1024.png')
head_picture = Image.open('mmexport1663893338571.png')
# 截图国旗上的五颗五角星
flag_width, flag_height = motherland_flag.size
crop_flag = motherland_flag.crop((66, 0, flag_height+66, flag_height))
# 将国旗截图处理成颜色渐变
for i in range(flag_height):
for j in range(flag_height):
color = crop_flag.getpixel((i, j))
distance = int(math.sqrt(i*i + j*j))
alpha = 255 - int(distance//key)
new_color = (*color[0:-1], alpha if alpha > 0 else 0)
crop_flag.putpixel((i, j), new_color)
# 修改渐变图片的尺寸,适应头像大小,粘贴到头像上
new_crop_flag = crop_flag.resize(head_picture.size)
head_picture.paste(new_crop_flag, (0, 0), new_crop_flag)
# 保存自己的国旗头像
head_picture.save('国旗头像.png')

 
到此为止,已经制作好了国旗头像了。
 
 
下面是代码的详细结束:

代码介绍:
代码介绍:

导入需要使用的Python库,pillow库用于对图片进行截取、大小修改、粘贴等处理。math库用于计算像素点的距离。

使用Image.open()方法,读取准备好的国旗图片和头像图片到代码中。

对国旗图片进行截取,获取一张正方形的图片,截取时调整截取位置,保证5颗五角星完整展示在截图中。

crop()方法中传入的是一个(left, upper, right, lower)的元组,分别是截图的左、上、右、下像素位置。
将正方形国旗截图设置成透明度渐变的图片。国旗图片的模式默认是RGBA,本文需要的刚好是RGBA(red,green,blue,alpha)模式的图片,RGBA模式的图片颜色值是一个长度为4的元组,我们修改不同像素点的A值即可将图片设置成渐变。

本文是以国旗左上角为圆心,离圆心越远的像素点A值越小,像素点越透明。使用getpixel()和putpixel()两个方法来获取和重设像素点的颜色值,使用math.sqrt()计算像素点距离。

将渐变图片的大小转换成和头像的大小一样,然后粘贴到图片顶层。使用resize()方法重设图片大小,使用paste()方法粘贴图片。

保存图片,此时的微信头像图片上已经粘贴了透明渐变的国旗图片,微信国旗头像制作完成。


本文介绍了用Python制作微信国旗头像的方法。在本文的代码中,以左上角为圆心,离圆心越远越透明,可以修改key值,调整国旗透明变化的范围。

如果需要制作其他渐变类型,如以右上角为圆心逐渐透明、从左侧向右侧逐渐透明、从上到下逐渐透明等,可以修改国旗渐变部分的代码、翻转图片等。
 

 
 
 

  收起阅读 »

ptrade 微信通知

对于节假日,ptrade经常会被暂停维护。 而有时候维护后需要你手动去重启策略。
 
所以情况多了,经常会忘记,手动登录进去重启。导致策略没有运行。
 
所以办法1,在盘前函数加入 微信通知,在交易日,如果盘前(8:30分左右),没有收到微信提醒,那么就需要即使登录到ptrade进行手动重启。
 
代码如下:
def notify(content=''):
send_qywx(
'微信id', '微信key', 'agent', info=content,
touser= '你的微信名字',
)

def before_trading_start(context, data):
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
notify('Ptrade 盘前运行{}'.format(now))

差不多这样就可以了。
 
不过笔者一般会使用另外一个种方式,因为如果哪一天没有收到,意味这ptrade没有起来,但你没有收到,你也就忘了这么一回事。 所以笔者的做法是,正常情况下不推送,而在ptrade不启动的时候才推送到微信。
 
下回更新。待续
 
# 继续更新
每天盘前,ptrade会到mysql插入一条数据,比如当天的日期
然后有个程序每天定时去读取mysql,如果读不到数据,就发送数据给微信即可。
 
class DBSelector():
'''
数据库选择类
'''

def get_engine(self):

from sqlalchemy import create_engine
try:
engine = create_engine(
'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USER, PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_DB))
except Exception as e:
log.error(e)
return None

return engine

def get_mysql_conn(self, db):
import pymysql
try:
conn = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=USER, password=PASSWORD, db=db,
charset='utf8')
except Exception as e:
log.error(e)
return None
else:
return conn

def main():
now = datetime.datetime.now()
if not now.weekday():
print('not week day')
return

db = DBSelector()
conn = db.get_mysql_conn('ptrade')
cursor = conn.cursor()
sql_str = 'select count(*) from `ptrade_runing_status` where `date`=%s limit 1'
date = now.strftime('%Y-%m-%d')
cursor.execute(sql_str, (date,))
result = cursor.fetchone()
if result[0] == 0:
send_message_via_wechat('{} ptrade没有启动!'.format(now))

if __name__=='__main__':
main()

 
继续阅读 »
对于节假日,ptrade经常会被暂停维护。 而有时候维护后需要你手动去重启策略。
 
所以情况多了,经常会忘记,手动登录进去重启。导致策略没有运行。
 
所以办法1,在盘前函数加入 微信通知,在交易日,如果盘前(8:30分左右),没有收到微信提醒,那么就需要即使登录到ptrade进行手动重启。
 
代码如下:
def notify(content=''):
send_qywx(
'微信id', '微信key', 'agent', info=content,
touser= '你的微信名字',
)

def before_trading_start(context, data):
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
notify('Ptrade 盘前运行{}'.format(now))

差不多这样就可以了。
 
不过笔者一般会使用另外一个种方式,因为如果哪一天没有收到,意味这ptrade没有起来,但你没有收到,你也就忘了这么一回事。 所以笔者的做法是,正常情况下不推送,而在ptrade不启动的时候才推送到微信。
 
下回更新。待续
 
# 继续更新
每天盘前,ptrade会到mysql插入一条数据,比如当天的日期
然后有个程序每天定时去读取mysql,如果读不到数据,就发送数据给微信即可。
 
class DBSelector():
'''
数据库选择类
'''

def get_engine(self):

from sqlalchemy import create_engine
try:
engine = create_engine(
'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USER, PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_DB))
except Exception as e:
log.error(e)
return None

return engine

def get_mysql_conn(self, db):
import pymysql
try:
conn = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=USER, password=PASSWORD, db=db,
charset='utf8')
except Exception as e:
log.error(e)
return None
else:
return conn

def main():
now = datetime.datetime.now()
if not now.weekday():
print('not week day')
return

db = DBSelector()
conn = db.get_mysql_conn('ptrade')
cursor = conn.cursor()
sql_str = 'select count(*) from `ptrade_runing_status` where `date`=%s limit 1'
date = now.strftime('%Y-%m-%d')
cursor.execute(sql_str, (date,))
result = cursor.fetchone()
if result[0] == 0:
send_message_via_wechat('{} ptrade没有启动!'.format(now))

if __name__=='__main__':
main()

 
收起阅读 »