Jokers's Blog

高尚是高尚者的墓志铭 卑鄙是卑鄙者的通行证


  • 首页

  • 分类

  • 归档

  • 标签

期权交易系统

发表于 2019-08-28 | 分类于 quant |

数字货币相关的期权交易系统

在国内进行期权交易门坎是比较高的,目前在数字货币相关的交易平台中,一些头部交易平台已经提供合约交易,但是提供期权交易平台的非常少,有兴趣的可以在deribit尝试一下。

期权交易系统的简单实现

  1. 平台要提供数字货币(例如ETH)充提币功能
  2. 假设将ETH作为资产标的,采集主流交易平台BTC的现货美元价格作为参考价,去除最大值和最小值,剩余取平均
  3. 平台生成不同到期日、不同资产标的、不同行权价、认购或认沽期权
  4. 买卖双方进行零和交易,平台撮合交易并收取手续费
  5. 到期后,买方选择是否行权

avatar

avatar

程序模拟实现

系统实现的核心是撮合交易,买单和卖单按下单价格和时间排序,买家和卖家子线程更新订单列表要保证线程安全。

模拟交易样例

认购期权:ETH-28AUG19-180,ETH作为资产标的,行权价格是$180。
买卖双方初始余额都是1000个ETH,平台初始是0个ETH。
买卖双方各随机下单一千次,每次撮合成交,平台收取0.0004个ETH。
期权到期,ETH现价是$200,买方行权。
平台无实物交割,买方从卖方赚取现价和行权价之间的价差。

avatar

买方最终余额是1199.9804个ETH,卖方最终余额是796.4004个ETH,平台最终余额是3.6192个ETH。

日内趋势策略

发表于 2019-08-07 | 分类于 quant |

面对8月2日开始的上涨趋势(大家都知道为什么会上涨,标准的政治驱动型趋势),难免会心动。
我决定开始研究日内策略。

数据准备

采集huobi分钟数据

看图说话

avatar

量化交易--如何建立自己的算法交易

发表于 2019-08-04 | 分类于 quant |

《量化交易–如何建立自己的算法交易》

当一个人决定投身于独立交易后,对孤立无助的害怕和对交易亏损的畏惧在所难免。因此对风险进行提前预判并有足够的存款是很有帮助的。同时,不需要用交易的收益来维持日常生活也是非常重要的前提,因为并不是很快就可以找到能够获得稳定收益率的策略。

迅速获利并不是量化交易的目的

理想的量化交易员应该是这样的人:之前有一定的金融或计算机编程经历,有足够的存款能够应对不可避免的亏损和收入空窗期,并且能够在贪婪和恐惧的情绪中找到适当的平衡

如何找到合适的策略?

很多现成的策略,都经不起严格的回测。要么只在有限时间内有效,要么只对特定股票有效,要么只在忽略交易成本条件下有效。真正的窍门是:对基础策略变形,并用于赚钱

avatar

交易成本

  • 佣金
  • 流动性成本–如果限价指令不能被执行,就要承担机会成本
  • 滑点

近一周小结

发表于 2019-08-03 | 分类于 quant |

时间线概览

  1. 接触数字货币交易,了解各个交易平台的行情接口和交易接口
  2. 看到平台之间的BTC存在价差,考虑现货搬砖,投入几百块买BTC在个平台间周转,熟悉流程
  3. 发现数字货币也有类似期货的合约交易,在两个平台提取KLine数据,分析数据验证套利可行性
  4. 开发全自动交易系统,较小买卖调试系统,达到24小时全天候稳定运行
  5. 处理下单不成功,下单未成交、下单部分成交等问题,保证两个平台完全下相同数量的对手单,避免行情损失
  6. 多线程同步下单,多线程同步订阅等
  7. 根据交易经验,估计交易成本(佣金+流动成本+滑点),重新设定价差
  8. 最后加杠杆运行稳定获利

为什么选择数字货币

  • 数字货币是7*24小时交易市场,人工或半自动交易不可行。我的优势是软件开发,弱势是金融从业经验,所以在数字货币行业可以最大化自己的优势并且避免被经验丰富的交易员或大机构套利(扬长避短)
  • 目前数字货币市场波动大,交易机会多

简单的Arbitrage

发表于 2019-07-26 | 分类于 quant |

数据准备

采集huobi、Binance、OKEx分钟数据

OKEx

  • 不论何种周期的candle data都只能采集到最近2000条左右的数据
  • 虽然吐槽一下OKEx的小气,不过客服是真不错的,金融加入互联网基因总会让人感觉舒服些
  • 接口Bug有点多,例如对手价下单会报价格错误,常见Bug需要处理一下
  • (说句无关的)传统金融圈子又小又排外,赚的不过是信息闭塞的钱
  • 有合约

huobi

  • huobi的采集历史数据要用到WebSocket
  • 要频繁的PING,否则服务器会断开连接
  • 不能保证每次请求的及时的响应和数据完整性
  • 每次300条,我从2000开始往下试,这个真的是干货
  • 循环逻辑写的好,以上问题都不是问题。嗯!
  • 有合约

Binance

  • 夸一下币安的接口,难怪用户规模增长快呢。
  • 请求的时间戳和返回时间戳是毫秒级的13位数字,Python要处理一下
  • 每分钟有请求次数限制,历史数据接口好像是每分钟1200次

数据存储

  • 每个平台分配一个Collection
  • 别忘了给加唯一索引,不然会很崩溃
  • 别问我为什么选MongoDB,可以看看我之前的blog

看图说话

  • 就选一天的数据看看吧,没什么代表性,仅供参考

avatar

avatar

套利

最终我选择huobi和OKEx合约作套利

  • 划重点

下单速度是关键,OKEx的服务器在香港。我最初用洛杉矶的VPS下单,OKEx的滑点吃掉了我绝大多数利润。
我在腾讯云买了一个香港云服务器,现在有秒杀活动,还是划算的。

Python3安装的坑

发表于 2019-07-25 | 分类于 Tools |

安装Python3前的必要准备工作

今天在自己的外网服务器安装Pandas后,尝试导入,报错:

/usr/local/lib/python3.7/site-packages/pandas/io/common.py in <module>
      7 from http.client import HTTPException  # noqa
      8 from io import BytesIO
----> 9 import lzma
     10 import mmap
     11 import os

/usr/local/lib/python3.7/lzma.py in <module>
     25 import io
     26 import os
---> 27 from _lzma import *
     28 from _lzma import _encode_filter_properties, _decode_filter_properties
     29 import _compression

ModuleNotFoundError: No module named '_lzma'

解决方法一

https://www.jianshu.com/p/198620bbc5a0

方法二

根本原因在于安装Python3前,系统缺少必要的环境

# 解决 _lzma 缺失提醒
yum install xz-devel

现摘抄https://segmentfault.com/a/1190000017313144如下:

# wget 用于下载源码包
# gcc 和 make 用于编译
yum install wget gcc make

#make报错,Python 有个很重要的内建模块 zipimport 用于从 Zip 压缩包中导入模块
#zipimport.ZipImportError: can't decompress data; zlib not available
yum install zlib-devel

#make install报错,
#ModuleNotFoundError: No module named ‘_ctypes’
yum install libffi-devel

# 解决 import ssl 报错 No module named '_ssl'
yum install openssl-devel

# 解决 import bz2 报错
yum install  bzip2-devel

# 解决 import curses 报错
yum install  ncurses-devel

# 解决 import sqlite3 报错
yum install sqlite-devel

# 解决 _dbm _gdbm 缺失提醒
yum install gdbm-devel

# 解决 _lzma 缺失提醒
yum install xz-devel

# 解决 _tkinter 缺失提醒
yum install tk-devel

# 解决 readline 缺失提醒及方向键行为非预期的问题
yum install readline-devel

最后重新编译安装Pytho3

Applied Machine Learning in Python

发表于 2019-07-18 | 分类于 machine learning |

Supervised Machine Learning

Overfitting and Underfitting

Applied Machine Learning in Python

发表于 2019-07-16 | 分类于 machine learning |

introduction

手工编写程序和一系列的规则并不能有效的解决所有我问题。例如精确的将人类对话转换成文本。
手写规则识别音频信号的一部分并决定那些单词出现在信号中是一项庞大的任务,识别不同语音时显得不够灵活和稳定。
如果我们要识别新的单词和特征,需要编写新的规则。
机器学习可以通过打标签的训练数据集自动学习复杂的规则,比起手动编写规则更加精确和灵活。
机器学习主要的目标是正确的预测或识别新的不在训练集中的对象。
搜索引擎利用机器学习对你的输入进行自动补全,还可以对查询结果进行排序。搜索引擎还通过你点击的页面和在页面停留的时间改善查询结果。
电影推荐系统使用机器学习和你过去的观看历史预测你的喜好以及和你喜好相似的其他人群。
图像和语音识别由于机器学习获得了巨大的发展。目前的识别技术已经足够可靠和快速,广泛的应用在语音控制等方面。
其他的应用还有,邮件分类、自动驾驶、医学应用等。

Key Concepts in Machine Learning

机器学习可以分为两种类型。
第一种是监督学习,目标是预测和输入相关的输出变量。
如果输出是有限的可能,例如语音信号对应的单词,我们称这种监督学习为分类。
如果输出是实数,例如预测一辆车从0km/h加速到100km/h所需要的时间,我们称为回归。
监督学习需要打标的对象作为训练集,而通常标签是人工判断。
第二种是非监督学习,将数据分为集群或组。例如购物网站将用户分组,可以向不同组的用户推荐不同的商品,使得用户获得更好的体验。
另外一种重要的非监督学习类型是异常值检测,例如检测出对网站的攻击。
使用分类有三个基本步骤,第一步是将数据表示为计算机可以理解的东西(特征值表示)和选择分类方法。例如将图片表示为像素数组。第二步是确定评估方法,用来比较不同分类方法对特定问题的表现。第三步是迭代的选择参数并执行分类,使用评估方法寻找最优解。

Python Tools for Machine Learning

Scikit-learn是我们用于机器学习最主要的库,它基于另外两个Python科学计算库,分别为Scipy和Numpy。
Scipy包含分布统计,方法优化,线性代数和数学方法。我们将使用Scipy的稀疏矩阵储存包含大量0的表。
Numpy包含许多基础数据结构,例如多维矩阵。
Pandas用于数据操作和分析,我们将使用DateFrame,不像Numpy一样,它的每一列可以是不同的数据类型。
Matplotlib是二维绘图工具。

An Example Machine Learning Problem

我们准备构建一个简单的水果识别系统。
首先加载数据集

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split

fruits = pd.read_csv('fruit_data_with_colors.txt', sep='\t')

将数据集分成训练集和测试集,Scikit-learn提供了一个简单方法去分割数据集,这个方法随机挑选一定比例的数据子集作为训练集,75-25%是比较好的分割标准。

x = fruits[['mass', 'width', 'height']]
y = fruits[['fruit_label']]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)

不同的random_state值会分割成不同的随机数据集。

Examining the Data

在训练之前,根据可视化的图例,我们可以知道每个特征值的取值范围,并发现异常值。通过观察不同类型对象在特征值空间表现的聚合和分离程度,我们可以大体了解机器学习预测的准确性。

下面我们将使用特征对图例的可视化工具,画出所有特征对的散点图,显示特征值的相关性。沿对角线的直方图显示特征值的分布。

from matplotlib import cm
cmap = cm.get_cmap('gnuplot')
scatter = pd.plotting.scatter_matrix(x_train, c=y_train.fruit_label, marker='o', s=40, hist_kwds={'bins':15}, figsize=(12, 12))

我们可以构建三维空间的特征值散点图

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x_train['width'], x_train['height'], x_train['mass'], c=y_train.fruit_label, marker='o', s=100)
ax.set_xlabel('width')
ax.set_ylabel('height')
ax.set_zlabel('mass')
plt.show()

K-Nearest Neighbors Classification

又称为为K-NN,查找和预测对象距离最近的训练集中K个元素。更具一定规则决定预测对象的label。
k=1,过拟合。
k=N(the number of points),所有新对象的预测结果都是训练集中数量最多的类型。

创建分类器对象

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)

lookup_fruit_name = dict(zip(fruits.fruit_label, fruits.fruit_name))

使用分类器fit方法训练数据集。

knn.fit(x_train, y_train.fruit_label)

在测试集上计算精确度,使用score方法

knn.score(x_test, y_test.fruit_label)

使用训练后的k-NN分类器模型去分类新的对象

fruit_prediction = knn.predict([[20, 4.3, 5.5]])
lookup_fruit_name[fruit_prediction[0]]

画出K-NN分类器的决策边界

plot_fruit_knn(x_train, y_train.fruit_label, 5, 'uniform')

可以改变K值观察k对决策边界的影响。’uniform’参数,代表平等的对待所有的邻近结点,可以使用’distance’或者自定义方法。

Comparison with Traditional Databases

发表于 2019-07-07 | 分类于 BigData |

译自 Hadoop-The Definitive Guide, 4th Edition p476

Schema on Read Versus Schema on Write

传统数据库在数据载入的时候会强制验证表的模式。
Hive只有在查询数据时才会验证。

Schema on Read 在数据初始载入时非常快,只是复制和移动数据不需要按照数据库的格式进行解析序列化。因此我们可以将两类模式应用在同一组数据。

Schema on Write 索引载入的数据使得查询更快,但是会耗费更长的时间载入

Updates, Transactions, and Indexes

Hive不支持就地更新,所以所有的增删该储存在临时表,然后定期合并到表

Hive支持分区级和表级锁

Hive的index可以提升查询速度,目前有两种索引:compact and bitmap
compact存储每个值对应block的标号
bitmap适用于索引低基数列(例如性别或国家)

SQL-on-Hadoop Alternatives

其他的SQL-on-Hadoop框架例如Impala、Presto、Drill、Spark SQL
Apache Phoenix 使用完全不同方法:将查询转换为HBase扫描,Metadata也存储在HBase。

HBase Versus RDBMS

发表于 2019-07-07 | 分类于 BigData |

HBase是分布式的面向列的数据存储系统,基于HDFS,提供Hadoop不具备的随即读写。
它的的设计专注于在横向和纵向的表扩展,可以达到数十亿行,数百万列的规模,可以水平分区并在数千个结点自动复制。
表的设计模式直接映射物理存储。

典型的RDMS是固定模式,面向行且具有复杂SQL查询的引擎,可以轻松建立索引,执行复杂的join和count、sum、sort、group等。
MySQL,innodb最大列数限制为1024,有些为4096

RDBMS适用于中小型的应用,如果需要扩展数据集或者并发读写,就会遇到巨大的性能问题和内在的分布式困难。
RDBMS的扩展需要涉及到打破Codd的规则和损失部分ACID限制,也就损失了那些使得RDBMS便利的特性。

RDBMS

ACID(数据库事务正确执行的四个基本要素的缩写)

  • 如果读的请求太多

    添加Redis

  • 如果写的请求过多

    购买服务器垂直扩展

  • 太多的JOIN

    Denormalize数据减少JOIN,比如增加冗余字段

  • 运算变慢

    停止作任何服务器端的计算

  • 一些查询依然很慢

    预先实现一些复杂的查询

  • 写入变慢

    删除二级索引

HBase

  • 没有真正的索引

    行和列按顺序存储,插入性能不受表的大小影响

  • 自动分区

    自动分成regions并distribute到可用结点

  • 容错能力

  • 批量操作

    MapReduce的集成允许对数据进行完全并行的分布式作业

12…5
Jokers

Jokers

hlxstc680@gmail.com

49 日志
13 分类
6 标签
© 2019 Jokers
由 Hexo 强力驱动
主题 - NexT.Muse