时间:2023-08-03 15:47:50 点击次数:15
Python 量化交易工程师养成实战-金融高薪领域
下栽ke呈:https://www.ukoou.com/resource/1366
01、海龟交易策略
海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。
02、阿尔法策略
阿尔法的概念来自于二十世纪中叶,经过学者的统计,当时约75%的股票型基金经理构建的投资组合无法跑赢根据市值大小构建的简单组合或是指数,属于传统的基本面分析策略。
在期指市场上做空,在股票市场上构建拟合300指数的成份股,赚取其中的价差,这种被动型的套利就是贝塔套利。
03、多因子选股
多因子模型是量化选股中最重要的一类模型,基本思想是找到某些和收益率最相关的指标,并根据该指标,构建一个股票组合,期望该组合在未来的一段时间跑赢或跑输指数。如果跑赢,则可以做多该组合,同时做空期指,赚取正向阿尔法收益;如果是跑输,则可以组多期指,融券做空该组合,赚取反向阿尔法收益。多因子模型的关键是找到因子与收益率之间的关联性。
04、双均线策略
双均线策略,通过建立m天移动平均线,n天移动平均线,则两条均线必有交点。若m>n,n天平均线“上穿越”m天均线则为买入点,反之为卖出点。该策略基于不同天数均线的交叉点,抓住股票的强势和弱势时刻,进行交易。
双均线策略中,如果两根均线的周期接近,比如5日线,10日线,这种非常容易缠绕,不停的产生买点卖点,会有大量的无效交易,交易费用很高。如果两根均线的周期差距较大,比如5日线,60日线,这种交易周期很长,趋势性已经不明显了,趋势转变以后很长时间才会出现买卖点。也就是说可能会造成很大的亏损。所以两个参数选择的很重要,趋势性越强的品种,均线策略越有效。
05、行业轮动
行业轮动是利用市场趋势获利的一种主动交易策略其本质是利用不同投资品种强势时间的错位对行业品种进行切换以达到投资收益最大化的目的。
06、跨品种套利
跨品种套利指的是利用两种不同的、但相关联的指数期货产品之间的价差进行交易。这两种指数之间具有相互替代性或受同一供求因素制约。跨品种套利的交易形式是同时买进和卖出相同交割月份但不同种类的股指期货合约。主要有相关商品间套利和原料与成品之间套利。
跨品种套利的主要作用一是帮助扭曲的市场价格回复到正常水平;二是增强市场的流动性。
07、指数增强
增强型指数投资由于不同基金管理人描述其指数增强型产品的投资目的不尽相同,增强型指数投资并无统一模式,唯一共同点在于他们都希望能够提供高于标的指数回报水平的投资业绩。为使指数化投资名副其实,基金经理试图尽可能保持标的指数的各种特征。
08、网格交易
网格交易是利用市场震荡行情获利的一种主动交易策略,其本质是利用投资标的在一段震荡行情中价格在网格区间内的反复运动以进行加仓减仓的操作以达到投资收益最大化的目的。通俗点讲就是根据建立不同数量.不同大小的网格,在突破网格的时候建仓,回归网格的时候减仓,力求能够捕捉到价格的震荡变化趋势,达到盈利的目的。
09、跨期套利
跨期套利是套利交易中最普遍的一种,是股指期货的跨期套利(Calendar Spread Arbitrage)即为在同一交易所进行同一指数、但不同交割月份的套利活动。
10、高频交易策略
高频交易是指从那些人们无法利用的极为短暂的市场变化中寻求获利的计算机化交易,比如,某种证券买入价和卖出价差价的微小变化,或者某只股票在不同交易所之间的微小价差。这种交易的速度如此之快,以至于有些交易机构将自己的“服务器群组”安置到了离交易所的计算机很近的地方,以缩短交易指令通过光缆以光速旅行的距离。(该策略源码模板暂无)量化交易的涵盖范围很大,程序化交易,算法交易,高频交易,自动化交易平台等等都可以算作量化交易。
它最大的优点可以规避心理素质原因带来的交易风险,另外,计算机不睡觉,不需要人工实时操盘,满足人们躺着赚钱的愿景。当然实际情况下还是需要人适时干预,防止算法突然失效造成巨额交易亏损。
使用程序来做量化交易,底层就是将买卖请求发送至交易所实现交易,券商或者交易所,通常也会提供 API 接口给投资者。举个例子,Gemini 交易所的公开行情 API 就可以通过下面这种简单的 HTTP GET 请求,来获取最近的比特币对美元的价格和最近的成交量。
########## GEMINI 行情接口 ##########
## https://api.gemini.com/v1/pubticker/:symbol
import json
import requests
gemini_ticker = https://api.gemini.com/v1/pubticker/{}
symbol = btcusd
btc_data = requests.get(gemini_ticker.format(symbol)).json()
print(json.dumps(btc_data, indent=4))
########## 输出 ##########
{
"bid": "8825.88",
"ask": "8827.52",
"volume": {
"BTC": "910.0838782726",
"USD": "7972904.560901317851",
"timestamp": 1560643800000
},
"last": "8838.45"
}
复制
对算法交易系统来说,API 只是最下层的结构,通常而言,一个基本的交易系统应该包括:行情模块、策略模块、执行模块,为了辅助策略的开发,通常还有回测系统辅助,它们的分工示意图如下:
交易系统各模块分工
行情模块主要获取市场行情数据,通常也负责获取交易账户的状态。
策略模块主要订阅市场数据,根据设定的算法发出买、卖指令给执行模块。
执行模块的主要功能是接受并把策略模块发过来的买、卖指令封闭并转发到交易所,并监督策略买卖的完整执行。
Python 量化交易
算法交易一个基本需求,就是高效处理数据,数据处理是 Python 的强项,特别是 Numpy+Pandas 的组合,让算法交易开发者的效率直线上升。
这里提供一个爬取、格式化、绘制比特币在过去一个小时的价格曲线的 Python 代码。
import matplotlib.pyplot as plt
import pandas as pd
import requests
# 选择要获取的数据时间段
periods = 3600
# 通过 Http 抓取 btc 历史价格数据
resp = requests.get(https://api.cryptowat.ch/markets/gemini/btcusd/ohlc,
params={
periods: periods
})
data = resp.json()
# 转换成 pandas data frame
df = pd.DataFrame(
data[result][periods],
columns=[
CloseTime,
OpenPrice,
HighPrice,
LowPrice,
ClosePrice,
Volume,
NA])
# 输出 DataFrame 的头部几行
print(df.head())
# 绘制 btc 价格曲线
df[ClosePrice].plot(figsize=(14, 7))
########### 输出 ###############
CloseTime OpenPrice HighPrice ... ClosePrice Volume NA
0 1558843200 8030.55 8046.30 ... 8011.20 11.642968 93432.459964
1 1558846800 8002.76 8050.33 ... 8034.48 8.575682 68870.145895
2 1558850400 8031.61 8036.14 ... 8000.00 15.659680 125384.519063
3 1558854000 8000.00 8016.29 ... 8001.46 38.171420 304342.048892
4 1558857600 8002.69 8023.11 ... 8009.24 3.582830 28716.385009
复制
通过执行代码,我们便可能得到下图所示的曲线:
可以借助一些专有的库:
Zipline 策略回测
Pyfolio 投资组合分析
另外,有一些现有的便利交易平台可以执行自定义的 Python 策略,无需搭建量化交易框架。比如,Quantopian,就提供了基于 Zipline 的标准回测环境,国内也有诸如 BigQuant,果仁网等类似平台。
此外, Python 是各行各业广泛使用的编程语言,越来越多投资机构的交易部门,都开始使用 Python,因此对优秀的 Python 开发者产生了更多的需求,自然也让学习 Python 成了更有意义的投资。
量化交易必须了解什么是 REST
什么是 REST API,要理解 RESTful 架构,最好的方法就是去理解Representational State Transfer 这个词组到底是什么意思,它的每一个词代表了什么涵义。从其英文全称来看是表征状态转移,通过 url 定位资源,用 GET,POST,PUT,DELETE 等动词来描述操作。满足这种要求的 API ,就叫 REST API。
举几个例子吧:
1、Gemini 交易所 BTC 对 USD 的 ticker 接口:
GET https://api.gemini.com/v1/pubticker/btcusd
复制
这里的 GET 是动词,后边的 url 是 ticker 这个资源的地址,所以这是一个 REST API 接口。
2、下面这样的,就不是严格的 REST API 接口。
POST https://api.restful.cn/accounts/delete/:username
复制
因为 URI 中包含动词“delete”(删除),所以这个 URI 并不是指向一个资源。如果要修改成严格的 RESTful 接口,我们可以把它改成下面这样:
DELETE https://api.rest.cn/accounts/:username
复制
手把手教你使用 API 下单
手动挂单显然太慢,也不符合量化交易的初衷。我们就来看看如何用代码实现自动化下单吧。
第一步,你需要做的是,注册一个 Gemini Sandbox 账号。请放心,这个测试账号不需要你充值任何金额,注册后即送大量虚拟现金。这口吻是不是听着特像网游宣传语,接下来就是“快来贪玩蓝月里找我吧”?哈哈,不过这个设定确实如此,所以赶紧来注册一个吧。
注册后,为了满足好奇,你可以先尝试着使用 web 界面自行下单。不过,事实上,未解锁的情况下是无法正常下单的,因此这样尝试并没啥太大意义。
所以第二步,我们需要来配置 API Key。User Settings,API Settings,然后点 GENERATE A NEW ACCOUNT API KEY.,记下 Key 和 Secret 这两串字符。因为窗口一旦消失,这两个信息就再也找不到了,需要你重新生成。配置到此结束。接下来,我们来看具体实现。
先强调一点,在量化系统开发的时候,你的心中一定要有清晰的数据流图。下单逻辑是一个很简单的 RESTful 的过程,和你在网页操作的一样,构造你的请求订单、加密请求,然后 post 给 gemini 交易所即可。
不过,因为涉及到的知识点较多,带你一步一步从零来写代码显然不太现实。所以,我们采用“先读懂后记忆并使用”的方法来学,下面即为这段代码:
import requests
import json
import base64
import hmac
import hashlib
import datetime
import time
base_url = "https://api.sandbox.gemini.com"
endpoint = "/v1/order/new"
url = base_url + endpoint
gemini_api_key = "account-zmidXEwP72yLSSybXVvn"
gemini_api_secret = "375b97HfE7E4tL8YaP3SJ239Pky9".encode()
t = datetime.datetime.now()
payload_nonce = str(int(time.mktime(t.timetuple())*1000))
payload = {
"request": "/v1/order/new",
"nonce": payload_nonce,
"symbol": "btcusd",
"amount": "5",
"price": "3633.00",
"side": "buy",
"type": "exchange limit",
"options": ["maker-or-cancel"]
}
encoded_payload = json.dumps(payload).encode()
b64 = base64.b64encode(encoded_payload)
signature = hmac.new(gemini_api_secret, b64, hashlib.sha384).hexdigest()
request_headers = {
Content-Type: "text/plain",
Content-Length: "0",
X-GEMINI-APIKEY: gemini_api_key,
X-GEMINI-PAYLOAD: b64,
X-GEMINI-SIGNATURE: signature,
Cache-Control: "no-cache"
}
response = requests.post(url,
data=None,
headers=request_headers)
new_order = response.json()
print(new_order)
########## 输出 ##########
{order_id: 239088767, id: 239088767, symbol: btcusd, exchange: gemini, avg_execution_price: 0.00, side: buy, type: exchange limit, timestamp: 1561956976, timestampms: 1561956976535, is_live: True, is_cancelled: False, is_hidden: False, was_forced: False, executed_amount: 0, remaining_amount: 5, options: [maker-or-cancel], price: 3633.00, original_amount: 5}
复制
RESTful 的 POST 请求,通过 requests.post 来实现。post 接受三个参数,url、data 和 headers。这里的 url 等价于 https://api.sandbox.gemini.com/v1/order/new . ,但是在代码中分两部分写。第一部分是交易所 API 地址;第二部分,以斜杠开头,用来表示统一的 API endpoint。我们也可以在其他交易所的 API 中看到类似的写法,两者连接在一起,就构成了最终的 url。
而接下来大段命令的目的,是为了构造 request_headers。
另外,请注意 nonce,这是个很关键并且在网络通信中很常见的字段。因为网络通信是不可靠的,一个信息包有可能会丢失,也有可能重复发送,在金融操作中,这两者都会造成很严重的后果。丢包的话,我们重新发送就行了;但是重复的包,我们需要去重。虽然 TCP 在某种程度上可以保证,但为了在应用层面进一步减少错误发生的机会,Gemini 交易所要求所有的通信 payload 必须带有 nonce。
nonce 是个单调递增的整数。当某个后来的请求的 nonce,比上一个成功收到的请求的 nouce 小或者相等的时候,Gemini 便会拒绝这次请求。这样一来,重复的包就不会被执行两次了。另一方面,这样也可以在一定程度上防止中间人攻击:
一则是因为 nonce 的加入,使得加密后的同样订单的加密文本完全混乱;
二则是因为,这会使得中间人无法通过“发送同样的包来构造重复订单“进行攻击。
接下来的代码就很清晰了。我们要对 payload 进行 base64 和 sha384 算法非对称加密,其中 gemini_api_secret 为私钥;而交易所存储着公钥,可以对你发送的请求进行解密。最后,代码再将加密后的请求封装到 request_headers 中,发送给交易所,并收到 response,这个订单就完成了。举报/反馈