202207

机构是如何评价基金经理的?
https://zhuanlan.zhihu.com/p/67250336

如何评价基金经理及基金的选择?
https://www.zhihu.com/question/22771562

python

lxml 使用
https://blog.csdn.net/ydw_ydw/article/details/82227699

from lxml import etree
html = etree.HTML(text)
for n in html.xpath('//h3[@class="text-heading css-1a2yizx"]'):
    print(n.text)
    for n2 in n.getnext().findall('li[@data-cy="browse-list-link"]/a'):
        print('\t%s' % (n2.text))

金融评测指标empyrical库详解Sortino、calmar、omega、sharpe、annual_return、max_drawdown
https://dev-docs.csdn.net/articles/c9ab471ae39247efa635f52081d88796/sharpe-sortino-omega-calmar-empyrical

国内装 virtual-env 报错

$ pip install virtual-env
Looking in indexes: http://mirrors.tencentyun.com/pypi/simple
ERROR: Could not find a version that satisfies the requirement virtual-env (from versions: none)
ERROR: No matching distribution found for virtual-env

如下可解决

pip install virtualenv -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

将matplotlib绘制的图形直接以base64格式传递到html使用
https://www.jianshu.com/p/f3ea49e05600

from io import BytesIO
import base64
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)

# 写入内存
save_file = BytesIo()
plt.savefig(save_file, format='png')

# 转换base64并以utf8格式输出
save_file_base64 = base64.b64encode(save_file.getvalue()).decode('utf8')

vim

vim 最精简配置

set nocp nu ts=4 sw=4 et sta hls si noeb vb t_vb=

tmux

sudo apt-get install tmux
$ vim ~/.tmux.conf
    set-option -g mouse on

ctrl+b d
ctrl+b %
ctrl+b "
ctrl+b alt+left
tmux -ls
tmux tmux attach -t 0

tmux的复制粘贴

1. C-b [ 进入复制模式
2. 参考上表移动鼠标到要复制的区域,移动鼠标时可用vim的搜索功能"/","?"
3. 安空格键开始选择复制区域
4. 选择完成后安enter键退出
5. C-b ] 粘贴

postgree

取消分页

\pset pager off

显示边框

\pset linestyle ascii
\pset border 2
SELECT * FROM Pets;

sql split string by space into table in postgresql
https://stackoverflow.com/questions/1986491/sql-split-string-by-space-into-table-in-postgresql

select unnest(string_to_array('the quick lazy fox', ' '));

Word frequencies from strings in Postgres?
https://stackoverflow.com/questions/5226202/word-frequencies-from-strings-in-postgres

postgresql 数组类型
https://www.jb51.cc/postgresql/194660.html

用 python 写 postgree 自定义函数
https://www.postgresql.org/docs/current/plpython-funcs.html

# CREATE EXTENSION plpythonu;
CREATE EXTENSION

# CREATE OR REPLACE FUNCTION pysplit(s text)
#   RETURNS text
# AS $$
#   words = s.split()
#   return '|'.join([words[i]+' '+words[i+1] for i in range(len(words)-1)])
# $$ LANGUAGE plpythonu;
CREATE FUNCTION

# select regexp_split_to_table(pysplit('a b c d'), '\|');
 regexp_split_to_table
-----------------------
 a b
 b c
 c d
(3 rows)

PostgreSQL-触发器
http://www.manongjc.com/detail/29-qzkmtgoohzmphaz.html

触发器函数中的特殊变量

  • NEW:该变量为 INSERT/UPDATE 操作触发的行级触发器中存储的新的数据行,数据类型是 RECORD。 在语句级别的触发器里此变量没有分配,DELETE 操作触发的行级触发器中此变量也没有分配。
  • OLD:该变量为 UPDATE/DELETE 操作触发的行级触发器中存储的旧数据行,数据类型是 RECORD。 在语句级别的触发器里此变量没有分配, INSERT 操作触发的行级触发器中此变量也没有分配。
  • TG_NAME:数据类型是 name,该变量包含实际触发的触发器名。
  • TG_OP: 内容为 INSERT、UPDATE、DELETE、TRUNCATE 之一的字符串,用于指定 DML 语句的类型。
  • TG_TABLE_NAME: 触发器所在表的名称。

PostgreSQL 触发器
https://blog.csdn.net/pg_hgdb/article/details/121560616

# CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL);

# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 列出所有触发器 
SELECT * FROM pg_trigger;

-- 查看特定表的触发器
SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

-- 删除触发器
drop trigger example_trigger on company;

postgres 自增序列
https://blog.csdn.net/m0_37664223/article/details/90052783

-- 查找 xxx 自增序列的当前值
select currval('xxx');
-- 查找 xxx 自增序列的下一个值
select nextval('xxx');
-- 创建 xxx 自增序列
CREATE SEQUENCE xxx
    INCREMENT 1    序列增长步值
    MINVALUE 1   最小值
    MAXVALUE 9999999999    最大值
    START 1  开始值
    CACHE 1  缓存值,会在cache中预存序列值,如果数据库异常关闭,序列值会丢失
    CYCLE;   循环,表示到最大值后从头开始

-- 修改 xxx 自增序列,除了 start 之外的其他值都可以修改
ALTER SEQUENCE xxx
    INCREMENT 10 
    MAXVALUE 100000000 
    CYCLE 
    NOCACHE ; 

----删除前先解除某个字段,例如表名是 student, name 字段对该序列的(序列名字是 name_seq)依赖
ALTER TABLE student ALTER COLUMN name SET DEFAULT null;

DROP SEQUENCE IF EXISTS "name_seq";

---- start_id 即 id 目前的最大值,可写为 1,
CREATE SEQUENCE "name_seq" START WITH start_id;
ALTER TABLE student ALTER COLUMN name SET DEFAULT nextval('name_seq'::regclass);

-- 设置自增长从当前最大值开始
select setval('seq', (select max(name) from "student"));

-- 重置自增字段为1
ALTER SEQUENCE seq RESTART WITH 1;

Postgresql 创建主键并设置自动递增的三种方法
https://blog.csdn.net/songchunyi/article/details/7711108

create table test_b
(
  id serial PRIMARY KEY,
  name character varying(128)
);

create table test_c 
(
  id integer PRIMARY KEY,
  name character varying(128)
);  
CREATE SEQUENCE test_c_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
alter table test_c alter column id set default nextval('test_c_id_seq');

创建索引

CREATE INDEX index_moni_gk_city_day ON moni_gk_city_day USING btree (datatime, citycode);

删除索引

drop index tab1_bill_code_index  ;

mysql

ip is blocked because of many connection errors 错误
https://debugah.com/host-blocked-because-of-many-connection-errors-how-to-solve-10147/

当客户端连接服务端超时(超过connect_timeout), 服务端就会给这个客户端记录一次error,当出错的次数达到max_connect_errors的时候,这个客户端就会被锁定。所以根据业务来尽量把这个值设置大一点,mysql默认值为10,我们可以根据具体需要设置大一点,这里设置为1000.(并非越大越好,越大被攻击时安全性越低)。
配置有master/slave主从数据库的要把主库和从库都修改一遍。

show status like  'Threads%';
SHOW VARIABLES LIKE '%error%';
SHOW VARIABLES LIKE '%wait_timeout%';
set global max_connect_errors = 1000;
flush hosts;

The value of the max_connection_errors system variable determines how many successive interrupted connection requests are permitted to myqsl server.

选取部分数据到新表

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
create table temp_temp as SELECT * FROM TABLE_NAME where a = 1;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

Any way to select without causing locking in MySQL?
https://stackoverflow.com/questions/917640/any-way-to-select-without-causing-locking-in-mysql

SELECT * FROM TABLE_NAME WITH (nolock)

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;

mysql 出现 unblock with ‘mysqladmin flush-hosts’
https://wenku.baidu.com/view/0e7f56b268ec0975f46527d3240c844769eaa034.html

show variables like '%max_connect_errors%'; 
set global max_connect_errors = 100; 

flush hosts;

# vi /etc/my.cnf
max_connect_errors = 100

nginx

Nginx proxy_pass DNS Cache
https://www.nadeau.io/post/nginx-proxy_pass-dns-cache/

After some debugging, I finally discovered that the IP address nginx was hitting was different from the one that DNS was returning. It turns out that nginx resolves hostnames only once on load, meaning whatever IP address it got on load would stick around until reload.

server {
  listen 80;
  server_name files.example.com;

  // or use whatever resolver your machine is set to use
  resolver 8.8.8.8;

  set $proxy_pass_url http://example.s3.amazonaws.com;

  location / {
    proxy_pass $proxy_pass_url;
  }
}

nginx proxy_pass 后面是域名的时候,它会只解析一次 ip,然后缓存起来。

shell

ip 地址库:

命令行查询 ip 的所在地
https://www.maketecheasier.com/ip-address-geolocation-lookups-linux/

sudo apt-get install geoip-bin
geoiplookup 8.8.4.4

wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind4.dat.gz
gunzip maxmind4.dat.gz
sudo mv maxmind4.dat /usr/share/GeoIP/GeoIP.dat.gz

wget https://dl.miyuru.lk/geoip/maxmind/city/maxmind4.dat.gz
gunzip maxmind4.dat.gz
sudo mv maxmind4.dat /usr/share/GeoIP/maxmind4.city.dat

wget https://dl.miyuru.lk/geoip/maxmind/asn/maxmind4.dat.gz
gunzip maxmind4.dat.gz
sudo mv maxmind4.dat /usr/share/GeoIP/maxmind4.asn.dat

geoiplookup -f /usr/share/GeoIP/GeoIP.dat.gz 54.241.194.177
geoiplookup -f /usr/share/GeoIP/maxmind4.city.dat 54.241.194.177
geoiplookup -f /usr/share/GeoIP/maxmind4.asn.dat 54.241.194.177

获取文件名

input="/home/data.txt"
file_name="${input##*/}"

How can I use sed to replace a multi-line string?
https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string

sed 多行模式

cat alpha.txt | tr '\n' '\r' | sed -e 's/a test\rPlease do not/not a test\rBe/'  | tr '\r' '\n'

sed 不带 -r 的正则表达式中括号里的空格要写在前面,不能写在后面

$ echo 'a-b c'| sed 's/[ a-z\-]/6/g'
66666
$ echo 'a-b c'| sed 's/[a-z\- ]/6/g'
sed: -e expression #1, char 14: Invalid range end
$ echo 'a-b c'| sed 's/[a-z- ]/6/g'
sed: -e expression #1, char 13: Invalid range end

tshark

https://www.jianshu.com/p/b78191fa4305

实时打印当前mysql查询语句

tshark -s 512 -i eth1 -n -f 'tcp dst port 3306' -R 'mysql.query' -T fields -e mysql.query

实时打印当前http请求的url(包括域名)

tshark  -s 512 -i eth0 -n -f 'tcp dst port 80'  -T fields -e http.host -e http.request.uri -l | grep -Ev '^\s+$' 

cloudwatch logs

nginx log format:带空格,带逗号的字段用引号括起来

log_format main '$time_iso8601 $status $request_time $upstream_response_time $upstream_cache_status $remote_addr "$http_x_forwarded_for" $http_host $upstream_addr "$request" $body_bytes_sent "$http_referer" "$http_user_agent"';

解析字段对应字段用引号括起来

parse '* * * * * * "*" * * "* * *" * * "*"' as time_iso8601,status,request_time,upstream_response_time,upstream_cache_status,remote_addr,http_x_forwarded_for, http_host,upstream_addr,method,url,http_version,body_bytes_sent,http_referer,http_user_agent
| limit 10

量化

宏观指标

  • GDP:国内生产总值
    • GDP 越高,表示国内经济越繁荣
  • CPI: 物价指数,反应通胀水平
    • 3% 是警戒线,高于警戒线,一般会紧缩
    • 低于 0 会通缩,问题更严重
    • 1-2% 是温和通胀,属于正常情况
  • PPI: 工业品价格指数,主要指原材料和能源价格,是周期类投资必看的指标。
    • 经济周期向上一般 PPI 会向上,
  • M0 M1 M2: M0 表示流通中的现金;M1 是 M0 + 活期存款; M2 是 M1 + 定期存款
    • 如果 M1 增速 大于 M2 说明市场资金很活跃,一般发生在牛市,原理就是大家把定期存款取出来到市场上了
    • 相反 M1 下穿 M2,意味着市场货币收缩了,大家把活期转成了定期,房价和权益市场就会下跌。
  • 十年期国债收益率:可以当做无风险收益率,
    • 国债收益率上升表示市场缺钱,对股市利空,如果利率长的太急,很有可能形成股债双杀。
    • 国债收益率下行,意味着市场上的钱越来越多,市场资金充裕,是投资债券的好时机。
    • 新债利率低于老债,所以大家都去买老债,所以债券价格就会上升。
  • 社融:社会融资总额,包括银行贷款,股票融资,发债融资,非标融资,专项债,社融反应资金的需求程度,
    • 社融一般会跟随 M2 的走势,如果 M2 上穿社融,说明放水意义不大了。
    • 社融下降意味着经济需求不足,说明大家对未来预期不好。
  • 社消总额:代表大家消费能力和意愿。
    • 社消下降说明消费出了问题。
    • 经济三驾马车:投资,进出口,消费。进出口受外部影响比较大,自己说了不算,假如投资也拉不动经济,就全部指望消费了。
  • PMI:采购人经理指数,表示工厂里的采购经理如何看待经济,通常是经济的先行指标。
    • 50 为枯荣线,枯荣线之上表示经济扩张,之下表示经济收缩。
    • 每个月会公布两个 PMI 指标,统计局的数据偏向国企大型企业,财新的数据代表中小企业。
  • CRB 指数:路透社编制的反应大宗商品周期性波动的指数,
    • 大宗商品主要分 4 类:1、工业金属,铜铝锌锡;2、贵金属,黄金白银;3、农产品,小麦玉米;4、能源品,煤炭石油。
    • 关注大宗商品的投资者需要关注 CRB 商品指数,如果不呈现上升趋势,周期行业还是少碰为好。
  • 库存周期:库存是一个重要的经济指标,反应经济周期。
    • 主动去库存:经济不景气,库存太大,降价甩卖,所以大宗商品会走低。
    • 被动去库存:经济复苏,涨价去库存,仓库的东西不多了,不着急卖了,因为供应短缺,所以大宗商品价格甚至会有上涨
    • 主动补库存:经济繁荣,价格涨,库存升,仓库的东西不够卖了,所以一边加价,一边压货。
    • 被动补库存:开始衰退,价格开始下降了,库存还在上升。
  • 信用利差:不同信用的人的融资利率不同,高信用和低信用的融资利率差就是信用利差。
    • 信用利差上升说明经济遇冷,银行给信用差的人的贷款利率提高,所以中小企业成本会上升。
    • 信用利差下降,说明银行不担心信用差的人违约,所以降低利率,中小企业会收益。
    • 信用利差上升时,股市表现就会不好。
    • 信用利差下降时,股市就不会那么糟糕了。
  • MLF 麻辣粉:中期借款便利,央行印出来的钱并借给商业银行的钱的利率,它代表基准贷款利率
    • MLF 下降,贷款利率也会下降,相当于变相降息
    • 相反,MLF 上升就有加息的效果
  • DR 007: 银行间市场 7 天质押回购利率
    • 上升过快,表示银行开始收缩了
  • 其它:逆回购,银行间拆借利率,税,失业率,铜金比,油金比,GDP和国债比值

WorldQuant 101 Alphas

WorldQuant 101 Alphas及一些思考
https://zhuanlan.zhihu.com/p/52459234

价量关系。就算是新股民也会听说价量的段子,什么最近大盘缩量啊,量在价先啊,高手只看K线和成交量啊啥的。确实,价量是交易最基本的组成要素,无论提到多高的高度不为过。通常把价涨量缩和价跌量升称为背离,剩下两个有人喜欢叫同向,我喜欢叫共振。最简单描述价量关系的指标就是相关系数,101 Alphas中有很多种写法。

  • 背离
    • -1 * correlation(volume, close, N) : 成交量与收盘价在N日内的背离程度
    • -1 * correlation(delta(volume, 1), delta(close,1), N): 成交量变动与收盘价日内变动在N日内的背离程度
    • -1 * correlation(rank(delta(volume), 1)), rank(delta(close,1)), N) : 成交量变动全市场强度与收盘价日内变动全市场强度在N日内的背离程度
    • -1 * correlation(ts_rank(delta(volume), 1),M), ts_rank(delta(close,1),K), N): 当日成交量变动在M日内的相对强度与当日收盘价日内变动在K日内的相对强度 在N日内的背离程度
  • 共振
    • 上面所有公式去掉-1
  • 契合程度
    • abs(correlation(·)) 这种写法,我称其为契合程度,在#036和#087中出现

单单就一个涨停板限制就可以把其中大多数alpha的构造逻辑摧毁,对于波动,在中国市场不太适合rank和ts_rank函数。

  • rank是横截面排序,某一股票的alpha在当前时刻下在其他所有股票的alpha中的位置;ts_rank是序列排序,某一股票的当前alpha在某段时间内的alpha中的位置。一个是与其他股票比较,一个是与自己比较,这两个函数都是在描述强弱。
  • 然而作用于涨跌幅的时候涨停板会从中作梗:首先是四舍五入的问题,涨停板的涨幅可以上达10.05%,下达9.95%,明明都是板却非要比个高低。由于磁吸效应的存在,涨停板强度的描述可以利用封板时间比,报成比,换手率等指标衡量。不过说回来,现在的主力真不喜欢拉板,熊市的磁吸效应没那么强而且从监管的角度来讲太危险了。
  • 其次是一字板本身的价量背离问题。对于单一bar来讲,一字板是最严重的价量背离。我不知道大多数人讲的价量关系是不是在流动性充裕的基础上的,当流动性有问题的时候,价量关系的衡量标准和平常必然不同。这个问题可以通过拉长时间区间来缓解,可以用长周期如周线来抵消涨停板带来的异常,也可以针对特点改一下rank与ts_rank。

基于短周期价量特征的多因子选股体系
https://www.cnblogs.com/bitquant/p/8393936.html

通过交易型阿尔法策略的研究,我们发现在A股市场,与传统多因子模型所获取的股票价值阿尔法收益相比,交易型阿尔法收益的空间更大、收益稳定性也更强。

即便是最纯粹的价值投资者也不得不承认,交易行为在短期内对股票价格起着几乎是决定性的影响,而发掘这种交易型套利空间正是量化投资的优势所在,因此量化模型在这一领域内应有着广泛的运用空间。

数值型因子的大规模分层测试—WorldQuant 101、国泰191、Sundays100+
https://zhuanlan.zhihu.com/p/60872286

国泰191 Alphas的研报《基于短周期价量特征的多因子选股体系》于2017年6月份公布,其中191个alphas有70个是WorldQuant 101因子原样照抄或者是小改一下

单因子测试

  • 主流单一因子测试方法也就分层法和 IC 法。
  • 不过需要注意的是,通常金工研究认为,测试单一因子的有效性应考虑市场因子、市值因子和行业因子的风险暴露,也即用线性回归残差替代因子本身。
  • 但我感觉不一定必须用,毕竟之后的因子库还要降维的。虽然可解释性上更低了一点,也更不符合金融行业的习惯,但在不深入挖掘某一因子的风险(收益)来源时,此举加大了工作量,说到底还是看需求。

分层法: 剔除风险暴露的因子值进行了月度调仓的分层法测试

  • 显著性(TOP20% 与 BOTTOM20% 差值的期望大不大)
  • 稳健性(TOP20% 与 BOTTOM20% 差值的方差小不小)
  • 在一条线上可以理解为收益率与回撤。
  • 但有很多因子你会发现,尾部的超额收益怎么都比不上中间两组。这就要用全市场的几条线来看了。

关于市值:Alpha = - closerank(vwap - close) / rank(vwap + close)

  • 市值因子一般认为是 CAPM 的漏洞,定价时就没考虑这个;
  • 市场对小公司的信息也没有挖掘得很充分。
  • 对于我国的低价因子还有两点,
    • 一是市场监管不到位导致的财务造假,
    • 二是注册制不到位导致的壳资源预期。
  • 这些都是制度问题,制度带来的收益必然随制度变化而变化。因此当我国退市、注册两个制度变化的时候,必然会对小市值策略产生影响,但不至于颠覆。
  • 我的愚见,对于一个所谓的好因子,首先应看是不是市值暴露带来的收益,即有没有市值味儿。
  • wq_alpha 和 gt_alpha 中,十分显著且稳定的基本上都有市值暴露。

短期价量背离程度的强度:rank(covariance(rank(high), rank(volume), 5))

  • 价量背离之前说过了是一个不错的因子,除了牛市中后期(加速)的时候,基本都有稳定的反向关系,无论参数从 5 到 20。
  • 加入 rank() 函数之后,牛市中后期也不会影响因子的稳定性,反而会得到超额收益,
  • 所以说,“放量大涨能延续” 说的是大盘,而不是个股(甚至大盘也不对)。缩量才是王道!!!

研报中的一些圣经

  • 事件因子圣经:20160527-国泰-事件驱动的因子化特征
  • 价值投资圣经:20170831-东方-质优股量化投资
  • 资金流因子圣经?:20180611-长江-资金流因子全测试
  • 多因子模型组合圣经:20171117-中信-多因子模型的组合优化与风险

技术指标调参
https://zhuanlan.zhihu.com/p/53279433

  • 技术分析到底有没有用我不知道,画线派、价量派和指标派各有各的理;
  • 有人认为只要精通一两种方法,也有人认为多种方法要结合使用。
  • 说到底,在技术分析没有引入“决策”之前,依旧可以将其视为因子,毕竟万物皆因子。是因子就可以检验相关性,这就是本文所探讨的东西。

本文选取了 6 类 10 种技术指标,计算他们的值,变动率,波动率与未来股票的值,变动率的关系。

  • 趋势类:MACD — macd;DMI — pdi-mdi;ADX — adx;
  • 随机类:KD — k-d;CCI — cci;
  • 波动类:STD — 平均股价的标准差;ATR—atr;
  • 成交量类:OBV — obv简单平均;
  • 通道类:SAR — 股价均值-sar;
  • 能量类:BRAR — br-ar;
  • benchmark:n日前的平均股价;

精选研报复现—牛熊线BBCurve
https://zhuanlan.zhihu.com/p/36437315

@jit
def cal_bull(close,mu,sigma,T,epsilon):
    return close * np.exp(T*mu + np.sqrt(T)*sigma*epsilon)

epsilon = scipy.stats.t.ppf(1-alpha/2,n) #ε
ripesd['logreturn'] = ripesd['close'].map(lambda x: np.log(x)).diff() #对数收益率
ripesd['mu'] = ripesd['logreturn'].rolling(n*T).mean() #μ
ripesd['sigma'] = ripesd['logreturn'].rolling(n*T).std() #σ
ripesd['close_-t'] = ripesd['close'].shift(T)
ripesd['bull'] = ripesd.apply(lambda x: cal_bull(x['close_-t'],x['mu'],x['sigma'],T,epsilon),axis=1)
ripesd = ripesd.dropna()

#上穿下穿买卖点
ripesd['buy'] = ripesd.apply(lambda x: True if x['close'] >= x['bull'] and x['close_-1'] <= x['bull_-1'] else False,axis=1)
ripesd['sell'] = ripesd.apply(lambda x: True if x['close'] <= x['bull'] and x['close_-1'] >= x['bull_-1'] else False,axis=1)


@jit
def cal_bull_3ver(close,mu,sigma,T,epsilon):
    return close * ((1+mu)**T + np.sqrt(T)*sigma*epsilon)

epsilon = scipy.stats.t.ppf(1-alpha/2,n)
ripesd['return'] = ripesd['close'].pct_change() #算术收益率
ripesd['mu'] = ripesd['return'].rolling(n*T).mean()
ripesd['sigma'] = ripesd['return'].rolling(n*T).std()
ripesd['close_-t'] = ripesd['close'].shift(T)
ripesd['bull'] = ripesd.apply(lambda x: cal_bull_3ver(x['close_-t'],x['mu'],x['sigma'],T,epsilon),axis=1)

世坤WorldQuant因子分析框架
https://zhuanlan.zhihu.com/p/396465853

  • 2015年公布的世坤101alpha论文讲述了World Quant(投资机构)用量价,波动率,流动性概念构建的101个当时实盘中被使用的选股因子。
  • 从本质来说因子可分趋势,回归,和趋势+回归;统计因子,和条件触发。
  • 实际交易中,盘口数据(order book),对冲成本,过拟合的哲学问题,怎么用机器学习去撸数以万计的alpha rank,时序,截面,lead-lag自变量因子,并保证系统先进(计算速度,cuda,防止internal crossing等)才是真正赚钱的机制。
  • 因此世坤公布这篇论文是目前国内大部分私募研究的基石,只能给大家提供研究的方向,根本不会堵塞公司本来的 alpha 通道。
  • 另外,一个很重要的结论是波动率对因子起决定性作用。而换手率(交易量)和对数回报并没有很大的相关性。
  • 因此除了频段以外,波动率是一个很好发分类法则去判断做趋势还是回归。(高频偏趋势,低频偏回归)
  • 在世坤 101 个因子里,平均协方差和夏普分别为 15.9% 和 2.25。

教你用Python计算对量化交易至关重要的VWAP指标
https://zhuanlan.zhihu.com/p/488527696

  • TP =(最高价+最低价+收盘价)/3V = 成交量

  • VWAP = (TP_1 * V_1 + TP_2 * V_2 + TP_n * V_n)/n

    Create VWAP function

    def vwap(df):
    v = df[‘volume’].values
    tp = (df[‘low’] + df[‘close’] + df[‘high’]).div(3).values
    return df.assign(vwap=(tp * v).cumsum() / v.cumsum())

    vwap(df)

Backtesting a Trading Strategy with Pandas and Python
https://www.learnpythonwithrune.org/backtesting-a-trading-strategy-with-pandas-and-python/

data['Signal'] = data['Adj Close'].rolling(5).mean() - data['Adj Close'].rolling(20).mean()
data['Position'] = (data['Signal'].apply(np.sign) + 1)/2

data.drop(['High', 'Low', 'Open', 'Volume', 'Close'], axis=1, inplace=True)
data.dropna(inplace=True)

data['Log return'] = np.log(data['Adj Close']/data['Adj Close'].shift())
data['Return'] = data['Position'].shift(1)*data['Log return']

data[['Log return', 'Return']].cumsum().apply(np.exp)

np.exp(data[['Log return', 'Return']].mean()*252)

data[['Log return', 'Return']].std()*252**.5

jupyter 无法预览

python -m pip install -I jinja2==3.0.3  

《甄嬛传》妃嫔合集
https://zhuanlan.zhihu.com/p/352962760

1.皇后2.华妃3.端妃4.敬嫔5.齐妃6.菀贵人/熹贵妃7.惠贵人8.安答应9.丽嫔10.曹贵人11.宁贵人12.瑛贵人13.欣常在14.祺嫔15.富察贵人16.夏常在17.余答应18.芝答应19.淳常在20.贞嫔21.康常在22.孙答应

An introduction to Byobu
https://simonfredsted.com/1588

Byobu advertises itself as a terminal multiplexer and a terminal window manager.

不ROOT不刷机,小米手机如何安装谷歌 GMS 三件套
https://zhuanlan.zhihu.com/p/211362120

  • Google Services Framework
  • Google play Services
  • Google Play Store

Effortless API Design
https://stoplight.io/studio

iotop常用快捷键:

  • 左右箭头:改变排序方式,默认是按IO排序。
  • r:改变排序顺序。
  • o:只显示有IO输出的进程。
  • p:进程/线程的显示方式的切换。
  • a:显示累积使用量。
  • q:退出。

Linux stress 命令
https://www.cnblogs.com/sparkdev/p/10354947.html

#消耗 CPU 资源
stress -c 4

# 消耗内存资源
stress --vm 2 --vm-bytes 300M --vm-keep

#消耗 IO 资源
stress -i 4

# 压测磁盘及 IO
stress -d 1 --hdd-bytes 10M

ulimit 命令详解
https://www.cnblogs.com/zengkefu/p/5649407.html

vi /etc/security/limits.conf
    * soft noproc 11000
    * hard noproc 11000

vi /etc/profile
    ulimit -u 10000
    ulimit -n 4096

https://unix.stackexchange.com/questions/34334/how-to-create-a-user-with-limited-ram-usage

The limits imposed by ulimit and limits.conf is per process. I definitely wasn’t clear on that point.
If you want to limit the total amount of memory a users uses (which is what you asked). You want to use cgroups.

Limit memory usage of a user
https://unix.stackexchange.com/questions/305026/limit-memory-usage-of-a-user

限制某用户每个进程的内存使用上限

  • 直接使用 ulimit 命令,作用范围是当前会话
  • 修改 /etc/profile,作用范围是所有人
  • 修改 /etc/security/limits.conf,作用范围可以是所有人,也可以指定组或人

测试

# 限制进程最大使用 2000M 内存 
$ ulimit -v 2000000

# 启动一个进程,使用 1G 内存,保持 5 秒 
$ stress --vm 1 --vm-bytes 1024M --vm-keep -t 5
stress: info: [2889506] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [2889506] successful run completed in 5s

# 限制单进程最大使用 1000M 内存 
$ ulimit -v 1000000

# 启动一个进程,使用 1G(大于 1000M) 内存,预期运行失败 
$ stress --vm 1 --vm-bytes 1024M -t 5
stress: info: [2889759] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [2889760] (494) hogvm malloc failed: Cannot allocate memory
stress: FAIL: [2889759] (394) <-- worker 2889760 returned error 1
stress: WARN: [2889759] (396) now reaping child worker processes
stress: FAIL: [2889759] (451) failed run completed in 0s

# 启动 2 个进程,各使用 512M (小于 1000M) 内存,总共使用 1024 M,进程能够运行成功。
stress --vm 2 --vm-bytes 512M -t 5
stress: info: [2898454] dispatching hogs: 0 cpu, 0 io, 2 vm, 0 hdd
stress: info: [2898454] successful run completed in 5s

限制某个用户所有进程的总内存

创建一个资源限制组,限制最多使用 2 G 内存

$ cat /etc/cgconfig.conf
group memlimit2G {
    memory {
        memory.limit_in_bytes = 2000000000;
    }
}

设置 testuser 的内存只用上面定义的资源组

$ cat /etc/cgrules.conf
testuser   memory   memlimit2G/

安装和启动相关工具和服务

sudo apt install cgroup-tools
sudo cgconfigparser -l /etc/cgconfig.conf
sudo cgrulesengd

以 testuser 身份运行 2 个进程,每个进程使用 512M 内存,执行 5 秒,预期运行成功

$ sudo -u testuser stress --vm 2 --vm-bytes 512M -t 5
stress: info: [2946198] dispatching hogs: 0 cpu, 0 io, 2 vm, 0 hdd
stress: info: [2946198] successful run completed in 5s

以 testuser 身份运行 4 个进程,每个进程使用 512M 内存,执行 5 秒,预期运行失败

$ sudo -u testuser stress --vm 4 --vm-bytes 512M -t 5
stress: info: [2946363] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd
stress: FAIL: [2946363] (415) <-- worker 2946367 got signal 9
stress: WARN: [2946363] (417) now reaping child worker processes
stress: FAIL: [2946363] (421) kill error: No such process
stress: FAIL: [2946363] (451) failed run completed in 5s