CFA笔记 Hypothesis Testing

Hypothesis testing:通过测试来确定一个sample statistic是不是来自于一个population with the hypothesized value of the population parameter。

flowchart TD A["State the hypotheses"] --> B[Identify the appropiate test statistic] B --> C[Specify the level of significance] C --> D[State the decision rule] D --> E[Collect data and calculate the test statistic] E --> F[Make a decision]

State the Hypotheses

每个hypothesis testing都有两个假设:null hypothesis($ H_0 $)和alternative hypothesis($ H_a $)。null是默认为真的,除非通过testing证明不是真,那么就采用alternate。目标就是证明null不是真。两个假设都是以population parameter来进行假设的,然后用sample statistics来验证。

Two-sided和one-sided假设:以mean举例,如果是假设“是否等于某个值”,那么就是two-sided(因为既可以大于也可以小于);如果假设“大于/小于等于”那就是单侧。

在金融中,one-side更加反映researcher的倾向性;而如果one-side也是reasonable的情况下采用了two-side,那就是想表达中立性。

常用Test Statistics

Alt text

Alt text

根据alternative来确定critical value是哪边:

Read More

20240312日志

下午把博客的syntax highlight和mathjax改了一遍,主要包括:切换PrismJS回rouge负责高亮;高亮相关的一些style调整;mathjax使用4.0beta4来支持换行。

另外还把之前尝试的gitlab runner(lxd executor)的相关内容记录了下来,感觉确实比virtualbox executor直观得多。

随后出门在后面的街吃了一顿饭,只花了15块。接着去对面坐桂16去万科把之前逛街的时候见到的那个公仔买下来,准备让爸爸带给妈妈做生日礼物。

Read More

gitlab-runner-lxc-executor

此前写过一篇文章介绍如何用Virtualbox Executor和Docker Executor来提供Gitlab Runner,但是这两个executor部署都比较繁琐复杂,特别是Virtualbox在同为AMD64 Linux的情况下可以用Linux Container来更加方便地进行配置。本文记录的是如何配置一个基于Linux Container的Gitlab Runner。

关于安装Linux Container,这篇文章已经介绍过这里就不重复了。

准备模板Container

为了节省时间,我们可以提前准备一个模板Container,这样就不用每次都安装dependency了。在接下来的步骤里我们创建一个名为grbase(gitlab runner base)的ubuntu 22.04 amd64容器:

1
2
3
4
# 使用清华镜像源,使用储存池pool1存储数据
lxc launch mirror-images:ubuntu/jammy/amd64 grbase -s pool1
# 连接容器
lxc exec grbase bash

在容器里面根据自己的需要安装各种依赖,比如常见的build-essentialruby-full,以及openssh-clientrsync等。其中作为Runner必须装的有gitgit-lfs和(直接野binary安装的)gitlab-runner

1
2
3
4
5
6
# git和git-lfs
curl -s "https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh" | sudo bash
apt install -y git git-lfs
# 野binary安装gitlab-runner
curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"
chmod +x /usr/local/bin/gitlab-runner

准备Runner所需的Script

在准备好模板Container之后就可以根据官方的docs来准备script了。我们按照官方的做法把base.shprepare.shrun.shcleanup.sh都放到/opt/lxd-driver里面,分别包含以下内容:

1
2
3
4
5
6
#!/usr/bin/bash

# /opt/lxd-driver/base.sh

CONTAINER_ID="runner-$CUSTOM_ENV_CI_RUNNER_ID-project-$CUSTOM_ENV_CI_PROJECT_ID-concurrent-$CUSTOM_ENV_CI_CONCURRENT_PROJECT_ID-$CUSTOM_ENV_CI_JOB_ID"

Read More

x86 兼职路由器 AP

由于之前买的中兴路由器没有办法完全关掉 DHCP 服务器,所以如果 x86 重启,它就会启动自己的 DHCP 服务器,自作主张为客户端分配另一个网段(192.168.5.x)的 IP ;即使 x86 重启之后 DHCP 服务器重新上线,由于 DHCP lease 的刷新时间还没到,客户端们不会询问新的 IP ;而中兴自己则在上游 DHCP 恢复之后抛下客户端们不管了、自己以 10.x.x.x 的 IP 重新回到下级路由的位置,直接导致网烂掉。

为了改善体验,在网上冲浪一番之后决定让中兴退休,x86 把这活也揽过来(真正的 All-in-One )。于是需要挑选能够做 AP 的无线网卡,并且对 x86 上的 Archlinux 进行配置来完成这个任务。

硬件

兼职路由器,很多极客前辈们都是用的 openwrt 。恩山论坛的这个帖子是我的起点: [openwrt(x86)] 2024-4-18—官方源码—史上最全驱动—支持无线AP模式—openwrt x86-64 23.05.3版

根据帖主的建议,第一张卡我没有买高通的,只是买了一个便宜大份的 MT7921E。需要注意的是, QCA9882 、 MT7921 等都是芯片,整个网卡还需要其他电路才能成型;MT7921E 我的是 AzureWave 的 AW-XB468NF ; QCA9882 则是拆机件 COMPEX 的 WLE600VX 7AA。由于 AW-XB468NF 设计之初是为了做客户端的,所以做 AP 有各种各样的问题,特别是PS5会断连,所以在使用了一段时间之后我买了2张 WLE600VX 7AA 分别发射 2.4GHz 和 5GHz 。两个卡的区别简单总结如下[1]

支持的特性 AW-XB468NF(MT7921) WLE600VX 7AA(QCA9882)
WiFi协议 最高 802.11ax 最高 802.11ac wave 1
频宽 80mhz(理论上支持160,没试过) 80mhz
DFS/ACS 不支持 支持
最高握手速率(5) 1201 Mbps 867 Mbps
最高握手速率(2.4) 574 Mbps 600 Mbps
通道 2T2R 2T2R
双频双待(DBDC) 不支持 不支持
接口 NGFF M.2 Mini PCIe

对于小白来说这些参数都很陌生,毕竟无线电也是一个很大的学科。根据这段时间的摸索,有以下的一些经验之谈:

  1. 两个卡都不支持DBDC,意味着一张卡只能发射 2.4 GHz 或者 5 GHz 其中之一,不能同时发射两个频段。像普通的路由器能够同时发射两个频段的,都是有两个甚至更多的芯片才能做到的;如果真能买到这样的网卡的话,通常会表现为内置两个 radio ,在系统里也会显示成两个 dev
  2. 2T2R 代表着网卡上有两个天线接口,所以转接板需要买至少有两根天线的;比如 WLE900VX 是3T3R 的,就是有三个接口,就需要买三天线的转接板了
  3. DFS 是很重要的,因为没有 DFS 的 MT7921 会无法扫描附近的军事、气象雷达占用了哪些频段,直接导致 5GHz 的低位频段被禁用;没有 DFS 也就同时不会有 ACS,虽然手动指定频道也不麻烦,但是毕竟能自动就自动
  4. WLE600VX 的 Mini PCIe 转接主板的全尺寸 PCIe 接口那是真的难买;相比之下 NGFF M.2 就随便一搜一堆

软件

(前置准备 - 配置网桥、网卡设备名)

Read More

cfa笔记se

Estimator和Estimate

Sample statistics 也就是“公式”是有不同计算结果的,也属于random variables;这些公式也被称为estimator,是有sampling distribution的。使用estimator根据某个sample计算出来的值叫做 (point) estimate。

在多个可用的estimator中选择一个的标准是:

  1. unbiasedness,mean of its sampling distribution 等于 parameter
  2. efficiency,也就是方差最小。Unbiased estimator会有很多,从中选择最好的那个,就是要选方差最小的那个。
    1. 这两个对于任何size的sample都是不变的
  3. consistency,随着sample size增加,estimate接近population parameter的可能性也增加。
    1. 如果对于小样本来说没办法找到理想的estimator,就只能选择consistent的了
    2. 换句话说,a consistent estimator is an estimator whose sampling distribution becomes concentrated on the value of the parameter it is intended to estimate as the sample size approaches infinity. Consistency可以跟efficiency同时成立,比如sample mean [1] [2]

Confidence Interval

由于sampling error,point estimate很难真的等于population parameter,所以就会用 confidence interval 来帮忙。

Confidence interval 就是有 $$ 1-\alpha $$ [3] 的可能性parameter落在这个range里面。Range的两头叫做lower and upper confidence limits.

用practical interpretation来理解(95%) confidence interval:我们有95%的把握,一个95% confidence interval包含了population parameter。

Confidence interval的组成:

Read More

cfa笔cpd

Probability function: P(X=x),对于discrete random variable可以写为p(x)。

对于continuous random variables,会写成f(x),称作probability density function.

Cumulative probability function:$$ F(x)=P(X\le x) $$

Uniform Distribution

所有结果的可能性相同就是uniform distribution。pdf是:

对于continous random variable来说,任意一个确定的值的probability是0。

CDF是:

其中积分过程是:

Read More

linux-container-与-lxd

之前一直使用docker来部署服务,但是docker的运作方式对于备份是不太方便的:如果不stop掉容器,那么备份的时候很可能会发生“对正在写入的数据库进行备份”这种灾难性的事情;其他次要原因包括大量的image占据的无效备份空间、坚持使用iptables导致不能用nftables等等。相对而言,linux container同样提供了application和host隔离的安全性,而且每个container都是一个独立的linux环境,配置起来更加直观;网络比docker更加灵活、host可以进行更深度的控制;最重要的是,可以用snapshot + zfs send的方式进行可靠备份。

安装

根据Archwiki的指导安装lxd包,然后system enable --now lxd来开机启动lxd daemon,这样才能通过后面的配置让容器也开机启动。如果报错提示端口已占用,那么需要排查主机上的DNS和DHCP(server)是不是监听得太广泛了——lxd使用dnsmasq监听它创建的网络(默认是lxdbr0)上的67端口以及53端口来为容器们分配IP和提供DNS解析,所以主机上特别是DNS服务不要配置成监听全部interface;可以改成只监听127.0.0.1以及LAN的gateway(比如10.0.0.1),这样就不冲突了。

在成功启动lxd.service之后,来做id mapping。为了安全性,通常会使用unprivileged containers,简单而言就是通过uid/gid mapping的方式让容器里的root到了主机上是一个没有权限的用户,从而保护主机不被篡改。参考archwikiusermod -v 1000000-1000999999 -w 1000000-1000999999 root来设置就好。

然后先做lxc init,但是跳过储存池的那个问题,我们稍后搞定。

搞定储存池的问题。lxd需要设置储存池来给容器们用,虽然官方提供了很多storage driver,但是最适合我的是ZFS。这里我是把某个SSD整个提供给ZFS管理了。执行以下几步创建pool并添加到lxc里面:

1
2
3
4
# 用zpool创建一个名为lxd1的储存池
zpool create lxd1 /dev/sda
# 将lxd1储存池添加到lxd(注意用的是lxc命令)并命名为pool1
lxc storage create pool1 zfs source=lxd1

之后就可以创建容器了。创建新的容器的命令格式是:

1
lxc launch 源:系统/版本/架构 容器名字 -s 储存池名字

例如在刚才创建的储存池pool1上创建一个ubuntu 22.04 LTS(代号jammy)的amd64架构的容器,名字叫ubuntu: lxc launch images:ubuntu/jammy/amd64 ubuntu -s pool1。说到源,众所周知在国内通常用清华的源,通过以下步骤添加并检查源、列出源中的镜像或特定镜像:

Read More

cfa笔记probability

概率

Random variable的一个结果就是outcome;event可以包括一个或多个outcome。

Mutually exclusive,互斥;exhaustive包含所有可能的outcomes。

odds for 某个event 就是 event发生的可能性 除以 event不发生的可能性。odds against就是分子分母反过来。

Joint probability 就是 $$ P(AB) $$ , conditional probability 就是 $$ P(A\vert B) $$

乘法:

当A和B是独立事件的时候才会简化成 $$ P(AB) = P(A)P(B) $$

加法:

Read More

cfa笔记data

归类方式:

  1. numerical 和 categorical
  2. cross-sectional 和 time-series 和 panel
  3. structured 和 unstructured

Numerical data 也叫 quantitative data,分成 continuous 和 discrete 两种。

Categorical data 也叫 qualitative data,通常来说各取值之间是 mutually exclusive 的;又根据取值能否进行rank或排列分成 nominal 和 ordinal。但是所有的categorical data都是无法进行有意义的数学运算的。


Cross-sectional data are a list of the observations of a specific variable from multiple observational units at a given point in time. The observational units can be individuals, groups, companies, trading markets, regions, etc.

Time-series data are a sequence of observations for a single observational unit of a specific variable collected over time and at discrete and typically equally spaced intervals of time.

Panel data are a mix of time-series and cross-sectional data.


Structured data are highly organized in a pre-defined manner, usually with repeating patterns. The typical forms of structured data are one-dimensional arrays or two-dimensional data tables.

Read More

cfa笔记interest-rates、pv、fv

Interest rate

有三个角度去理解:

  1. Required rates of return:使得投资者选择这项投资所需要的rate
  2. discount rate:使得FV折现后等于PV的rate
  3. opportunity costs:如果投资者现在consume了这笔钱(而不是invest的话)所损失的rate

有五个构成部分:

  1. Real risk-free interest rate
  2. Inflation premium, 加上第一个就是nominal risk-free interest rate。比如美国国债指的就是这种
  3. Default risk premium
  4. Liquidity premium,可以理解为“容不容易卖出去”,容易卖就低,难卖就高
  5. Maturity premium,期限越长market value对市场利率的变动的敏感性越高

对于公式 $$ FV_N=PV(1+r)^N $$, 需要注意r和N必须要是相同时间尺度(年对年,月对月);如果每年复利次数大于1(设为m),而年利率为 $$ r_s $$ :

如果m趋向于∞,就叫做continuous compounding,公式是:

EAR

Read More