评价基金性能的常用指标

最大回撤(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]

获取名为 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 →

Dispatch_once造成的死锁—-分析、解决与自动检测

现象

最近遇到了一个死锁crash,主线程在dispatch_once时卡住了:

1
2
3
4
5
6
7
8
9
10
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   __ulock_wait + 8
1   _dispatch_unfair_lock_wait + 48
2   _dispatch_gate_wait_slow + 56
3   dispatch_once_f + 124
4   +[OTPolicyCenter sharedInstance] (once.h:68)
7   +[OTWebViewUtil completeUrlScheme:] (OTWebViewUtil.m:26)
...
30  start + 4

卡死的代码很简单,世界上的单例基本上都是这么开的:

1
2
3
4
5
6
7
8
+ (OTPolicyCenter *)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        policyCenterInstance = [[OTPolicyCenter alloc] init];
    });
    return policyCenterInstance;
}
Read on →

检查iOS App是否支持IPv6-only Network

从2016年6月1号开始,苹果强制要求上架AppStore的应用支持IPv6-only network。
本文分为两部分:通过代码检查是否兼容IPv6-only网络,以及如何搭建IPv6-only网络的测试环境。旨在帮助快速检查app是否支持IPv6-only Network。可以当做Supporting IPv6 DNS64/NAT64 NetworksEnsuring IPv6 DNS64/NAT64 Compatibility一节的速成版本。

通过搭建IPv6-only网络的测试环境测试

最便捷的检查方式是:找一台Mac,共享Internet到IPv6 DNS64/NAT64网络,然后让待测试设备连接到此网络,并测试app功能是否正常。
需注意,OS X 10.11后才支持创建IPv6 DNS64/NAT64网络。如果待测试设备不是iOS或OS X或macOS设备(比如要测试Andr**d上的app是否兼容IPv6-only网络),请确保设备支持RFC6106

Read on →

Objective-c使用运行时dump Class的方法列表

最近需要对UIWebView内请求的静态文件做缓存,还要把Gif替换成静态图以节约CPU资源等,于是查了一下私有API可不可以抓取UIWebView内的请求打个标记,以便NSURLProtocol中可以准确判断是不是UIWebView发出的请求。
经调试发现hookwebThreadWebView:resource:willSendRequest:redirectResponse:fromDataSource:可以做这件事。调试过程就不细说了。

首先是dump类方法列表的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <objc/runtime.h>
void DumpObjcMethods(Class clz)
{
    unsigned int methodCount = 0;
    Method *methods = class_copyMethodList(clz, &methodCount);
    printf("Found %d methods on '%s'\n", methodCount, class_getName(clz));

    for (unsigned int i = 0; i < methodCount; i++)
    {
        Method method = methods[i];

        printf("\t'%s' has method named '%s' of encoding '%s'\n",
               class_getName(clz),
               sel_getName(method_getName(method)),
               method_getTypeEncoding(method));
        /**
         *  Or do whatever you need here...
         */
    }
    free(methods);
}
Read on →

iOS抓包(使用BurpSuite和tcpdump)

Introduce

开发过程中我们经常会需要对网络请求抓包,本次介绍的是使用BurpSuite抓取HTTP/HTTPS包,以及不越狱使用tcpdump抓取iPhone的网络包。

使用BurpSuite对HTTP/HTTPS抓包

开发中我们经常会需要对HTTP/HTTPS请求进行抓包。
抓包实际上是在中间机器开了一个代理服务,让需要抓包的请求经过代理,我们就可以看到这些请求了。本质上是中间人攻击。
BurpSuite是一个常用的调试工具。

1. 下载BurpSuite

BurpSuite官网下载jar包,右键点击,运行:

Read on →

在lldb中一键打开模拟器sandbox路径

打开~/.lldbinit,在里面加入一行:

1
command alias sb script from subprocess import call; call(["open", '{0:s}'.format(lldb.frame.EvaluateExpression("NSHomeDirectory()")).split("\"")[1]]);

然后中断时,在lldb里打sb回车,就能打开模拟器当前运行的app的沙箱路径了。

Read on →