Install Manjaro From macOS

从 macOS 10.14 制作安装 U 盘

下载好 iso 之后,将 iso 改名为 ~/Downloads/manjaro-kde.iso,然后将 iso 转换成 dmg:

1
hdiutil convert -format UDRW -o ~/Downloads/manjaro ~/Downloads/manjaro-kde.iso

看一下 U 盘是 disk几:

1
diskutil list

假设 U 盘是 disk9,分区,unmount,再写入镜像:

1
2
3
diskutil partitionDisk disk9 1 GPT HFS+ newdisk R
diskutil unmountDisk /dev/disk9
sudo dd if=/Users/openthread/Downloads/manjaro.dmg of=/dev/rdisk9 bs=1m

U盘插到 pc,重启,安装

Read on →

JDK 和 Maven macOS 的安装与配置

JDK

下载安装

https://www.oracle.com/technetwork/java/javase/downloads/index.html 下载想用的 jdk 版本,需要登录。

下载好以后双击 dmg 安装。

命令行输入 java -version 查看版本。

配置 JAVA_HOME 环境变量

安装包没自动配置环境变量,可能是考虑宿主机多个不同 jdk 版本,没替用户做决定,需要手动配置一下。

Read on →

Python/Numpy 性能优化

Cython

将 Python 翻译成 c/c++ 再编译执行。
比原生 Python 快 1.5 倍左右。
缺点是要写个 makefile

pypy

优点是无需像 cython 一样需要修改代码,写 makefile 和 main,缺点是有些三方库不支持。

安装:

1
brew install pypy3

然后安装 pypy pip。注意 pypy pip 不支持 socks5 代理,可能需要关闭或指定 http 代理:

1
2
3
4
pypy3 -m ensurepip
export ALL_PROXY=
pypy3 -m pip install pip --upgrade
pypy3 -m pip install setuptools --upgrade

将 pypy3 path 加入 $PATH 不然安装 tables 的时候报 warning:

1
export PATH=$PATH:/usr/local/share/pypy3

安装依赖(举点例子):

1
2
3
4
5
6
7
8
pypy3 -m pip install numpy
pypy3 -m pip install TA-Lib
pypy3 -m pip install requests
pypy3 -m pip install ccxt
pypy3 -m pip install tables
pypy3 -m pip install matplotlib
pypy3 -m pip install coloredlogs
pypy3 -m pip install pandas

如果 macOS 遇到 pypy 安装 numpy 时提示:

1
2
3
4
Checking for cc... ld: library not found for -lgcc_s.10.4
clang: error: linker command failed with exit code 1 (use -v to see invocation)
...
RuntimeError: Broken toolchain: cannot link a simple C program

尝试下面命令后再次重试安装 numpy:

1
2
3
cd /usr/local/lib
sudo ln -s ../../lib/libSystem.B.dylib libgcc_s.10.4.dylib
cd -

Numpy

比原生 Python 快 10 倍左右。

numexpr

1
2
3
4
5
6
import numpy as np
import numexpr as ne
N = 10 ** 5
a = np.random.uniform(-1, 1, N)
b = np.random.uniform(-1, 1, N)
ne.evaluate('a ** 2 + b ** 2')

比 Numpy 快 2 到 10 倍。

Read on →

利用pandas进行数据分析第二版 笔记

先放书的链接: https://www.amazon.cn/dp/B07G2PK49V

Read on →

iPhone Popover Above iOS9

直接上图上代码。。。

OTPopoverMenuViewController.h:

1
2
3
4
5
6
7
8
9
10
@interface OTPopoverMenuViewController : UIViewController

- (void)presentInController:(UIViewController *)controller
                 sourceView:(UIView *)view;

- (void)presentInController:(UIViewController *)controller
              barButtonItem:(UIBarButtonItem *)barButtonItem;


@end
Read on →

评价基金性能的常用指标

最大回撤(Max Draw Down)

最大回撤为:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。

其计算的时间复杂度是O(n)的。有些O(n2)的写法比较业余。

python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_max_draw_down(in_list: list):
    dd_list = []
    max_so_far = in_list[0]
    for i in range(len(in_list)):
        if in_list[i] > max_so_far:
            dd = 0
            dd_list.append(dd)
            max_so_far = in_list[i]
        else:
            current = in_list[i]
            dd = (max_so_far - current) / max_so_far
            dd_list.append(dd)
    mdd = max(dd_list)
    return mdd

夏普比率(Sharpe Ratio)

评价单位承担的风险可以取得多少正向收益。在同种时间跨度下,越高越好。

计算方法:

  • 平均收益率超过无风险收益率的部分除以收益率的标准差。
  • 如果通过高频夏普率(比如1d)推测低频夏普率(一般是年),若每年有255个交易日,一般是再乘上根号下255。像币圈高频夏普率(4h)推导年,则是再乘上根号下 365 * 24 / 4。

    缺陷:

  • 由于标准差是正值,所以无法区分上行风险和下行风险。

    优点:

  • 国内外知名度高。

附两个知乎的讲解链接:
夏普率越高越好吗? - 石川的回答 - 知乎
求问基金风险指标的计算:夏普比率,索提诺比率,阿尔法系数等? - 财小鲸之秦岭的回答 - 知乎

1
2
3
4
5
import numpy

def sharpe_ratio(returns, risk_free_rate=0.0):
    mean = numpy.mean(returns)
    return (mean - risk_free_rate) / numpy.std(returns)

其中 returns 为每条 ohlc 的变化率,比如 [0.02, 0.03, -0.03, …]
risk_free_rate 为每条 ohlc 的无风险收益率。比如okex余币宝年化1%,传入的是4小时returns,这里应该传入 1% / (365 * 24 / 4)

可以通过历史净值列表(equity)生成 returns:

1
2
3
4
5
def returns_from_equity(in_equity: list):
    returns_np = numpy.array(in_equity)
    returns_np = returns_np[1:] / returns_np[:-1]
    returns_np = returns_np - 1
    return returns_np

然后把返回值代入下一步计算。

Read on →

Python Talib 的一些基础用法

首先还是导入一些业界标准库:

1
2
3
import pandas as pd
import numpy as np
import talib as ta

计算RSI

1
2
close = np.array(bars.close)
print(ta.RSI(close))  # 默认15根bars

计算MA

1
ta.MA(close)  # 默认 30 根 bars,即 MA30

设置计算用的时长,比如计算 MA5

1
ta.MA(close, timeperiod=5)

计算 EMA11 和 EMA22

1
2
ta.EMA(close, timeperiod=11)
ta.EMA(close, timeperiod=22)

全部指标和方法列表

http://mrjbq7.github.io/ta-lib/funcs.html

Pandas的一些基础用法

首先我们导入一些‘业界标准’库

1
2
3
4
import pandas as pd
import numpy as np
import talib as ta
import matplotlib.pyplot as plt

Pandas 里有两种常用的结构,一种叫DataFrame,作为二维的一张表格;另一种叫Series,是一维数组。
DataFrame取单行和单列得到的都是Series类型的对象。

追加数据

1
df = df.append(series, ignore_index=True)

获取最后一列数据

1
series = df.iloc[-1]

按行遍历

1
2
for i in df.index:
    print(df.iloc[i])

前十行组成子DataFrame

1
2
for i in df.index:
    print(df.iloc[0:10])  # 含下标0到9的元素,不含下标10的元素

获取名为 close 的 column

1
2
3
series = df.close
或者
series = df['close']
Read on →

Zsh中对cd命令的hook

zsh中预留了一个chpwd()用于hook各种cd命令,包括cd pushd popd等。

首先打开~/.zshrc,增加chpwd函数。作用是在ccproj或其子目录,使用全局代理,否则关闭代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
chpwd()
  case $PWD in
      (*/ccproj)
          echo using proxy
          allproxy
          ;;
      (*/ccproj/*)
          echo using proxy
          allproxy
          ;;
      (*)
          noproxy
          ;;
  esac

其中allproxynoproxy的定义如下:

Read on →

Messages Framework 开发文档(Sticker Packs 与 iMessage Apps)

概述

开发者可以为 iOS 10 的 Messages app 创建 extension。用户在其中可以发送文字、表情、媒体文件、交互式消息(交互式消息即 interactive messages,是一种允许被对话的参与者更新状态的消息)。

第三方软件可以使用 Messages framework 创建两种 app extension: 表情包(Sticker packs)和 iMessage apps。这两种 app extension 都可以作为现有主 app 的 extension 来发布,也可以单独发布。

为了方便理解后文内容,强烈建议先玩一下:
1. Sticker pack 比如知乎刘看山
2. GamePigeon中的台球
3. 大众点评的订电影票

Read on →