Week 13
本周学习主要内容包括Python爬虫、文本相关操作、金融量化交易、Pandas时间序列(基础)
量化交易
流程
量化交易的步骤和数据分析联系:
- 目标(确定目标):要交易的金融产品
- 股票:A股、港股、美股(交易商:IB盈透,老虎证券)
- 期货:国内商品期货、外盘期货、贵金属
- 外汇
- 期权:股票期权、商品期权、外汇期权
- 其他:债券、CFD(差价合约)
- 数据(数据搜集和规整):搜集和规整金融产品相关数据
- 实时行情:新浪、百度等各大门户都有股票期货数据接口可直接抓取
- 历史数据:tushare
- 在线量化平台:优矿、聚宽、掘金、米筐、Bigquant,真格、万矿、镭矿、量化云、点宽 等等
- 分析(策略研发):最重要
- 通过各种途径方式获得灵感思路,想出交易策略
- 编程复现策略,回测验证
- 反复迭代,直到策略达到标准
- 应用(实盘交易)
- 半自动量化:编程自动化分析,手动下单。可以降低难度和交易风险。中低频策略可用
- 全自动量化:量化交易所有步骤都编程全自动执行
- API接口调用:需交易商提供接口,这是开户机构允许的正规自动化交易方法
- 一般都是Web API接口,通过JSON交互数据
- 技术方案:Python:requests
- 国内股票不开放接口,期货有CTP
- 其他方式:下面的方法都是没API情况下的取巧方法,官方并不支持所以有风险。使用技术基本为Python爬虫和自动化测试技术
- 桌面客户端模拟:要求有桌面客户端
- 技术方案1(常用):软件:autoit,按键精灵
- 技术方案2:Python:pyautogui。操纵鼠标、键盘、截图等,类似外挂
- Web界面模拟:要求有Web交易页面,编程操纵交易商的Web交易页面完成自动交易
- 技术方案:Python:selenium
- 移动端模拟:要求有移动端APP
- 技术方案:Python:Appium(移动端UI自动化测试)
- 桌面客户端模拟:要求有桌面客户端
- API接口调用:需交易商提供接口,这是开户机构允许的正规自动化交易方法
策略性能
验证:
衡量交易策略的性能好坏有很多指标,最重要的是最大回撤和夏普比率,二者主要关注的都是风险,而不是收益
- 年化收益率
- 最大回撤
- 夏普比率
普遍指标
一般业内规矩,一个交易账户如果:
本金最低5万美元(或50万人民币),
实盘交易3年(最低1年),
5%最大回撤,20%以上年化收益率(最少15%)
无论去什么地方,找什么机构(个人)要资金、合作、代客理财,都没有任何问题了。
实际指标达不到上述指标,也不意味着不能找钱,就是说服力差些
例如:本金只有三五万人民币,实盘只有几个月甚至只有回测记录,回撤大但收益大等等情况,具体情况具体看待
注意:国际上特别注重最大回撤,别的还可以商量,如果最大回撤太大了,基本账户就废了只能重写开始再来一个
年化收益率
年化收益:(平均收益率,累计收益图,时间段一般都是年)
- 平均一年盈利百分之多少
- 年化收益率看起来重要,但只是相对外行而言,因为它没有考虑策略的波动性风险(不看你挣多少,看你赔多少)
- 大部分银行卖的基金3.x%年利率,大额存单4%年利率(百万级),大的信托8%年利率(千万级),这些投资标的风险都非常小,所以你的策略起码得超过他们,而且风险不能太大
年化收益率公式:
年化收益率 = ((策略最终价值 - 本金) / 本金) / 你交易的天数 * 正规交易天数 × 100%
或:
年化收益率 = (策略最终价值 / 本金 - 1) / 你交易的天数 * 正规交易天数 × 100%
注:正规交易天数一般为250天,365天除去周末和节假日等的大概天数,具体根据自己情况而定
最大回撤
最大回撤:(单位时间最大亏损)在特定时间段(通常是每年)内帐户净值曲线中最大的峰谷下降特征,通常以百分比形式引用
最大回撤公式:
最大回撤率 = (策略单位时间历史最高价值 - 策略单位时间最低价值) / 策略单位时间历史最高价值 * 100%
或:
最大回撤率 = max(1 - 策略当日价值 / 策略单位时间历史最高价值),注:每天的结果取最大值
夏普比率
夏普比率(Sharpe Ratio):收益风险比,是超额收益的均值和超额收益标准差的比
夏普比率公式:
(策略年化收益率 - 回测起始交易日的无风险利率) / 策略收益波动率
注:
策略收益波动率:用来测量资产的风险性,计算方式为:策略每日收益的年化标准差
无风险利率(超额收益):指的是无风险投资的回报率(本金的成本,默认3%),具体指的是某国固定利率国债收益率曲线上 10年期国债的年化到期收益率(或其他锚定对比的指标如标准普尔指数)。
中国 2.783:https://cn.investing.com/rates-bonds/china-10-year-bond-yield
美国 0.707:https://cn.investing.com/rates-bonds/u.s.-10-year-bond-yield
世界:https://cn.investing.com/rates-bonds/government-bond-spreads
无风险利率(超额收益)表示的意思有:
* 你资金的成本,某些情况下如果你的钱是自己的(不是借的没有利息)也不在乎机会成本,可以不减
* 你的年化收益率减去基本投资回报,剩下的才是你策略的超额回报(就像你用资金赚的钱得减去银行存钱的利息剩下才是你真赚的),必须减
-
夏普比率解释:
许多统计量被用来度量 调整风险收益,通常都是设法度量获得收益的成本(风险角度)。最典型的是 夏普比率
- 你的投资每承受1单位风险,会产生多少单位超额回报 - 例如夏普值为2的策略指每承担1个单位的风险,将会获得2个单位的高于无风险利率的收益率
让策略的夏普率增高的方法:收益要高,收益的波动要低
注意:
用调整交易时间频率的方法也可以算出高夏普率,但实际上是错误的,不要这么做
如计算 策略每日收益的年化标准差 时,作为时间频度的除数变大(如由250天/次变为高频的一百万次),夏普比率就会变大。所以高频策略的高夏普率是错算的。
不同时间频度的夏普比率不能直接比较,一般只看年化夏普率(以天为时间频度,一般250天),
如比较月收益和年收益的夏普比率,月度标准差需要乘以根号12(因为标准差随着时间的平方根等比例增长),而且这种算法只在特定情况下才有效,避免使用
- 当年化夏普率为 3 时,净值曲线(在对数坐标下)基本上是一条直线了;
- 当年化夏普率为 2 时,它的净值曲线也仅在局部有一些小的波动;
- 当年化夏普率为 1 时,它的净值曲线在全局范围内呈现出更大的波动;
- 即便如此它也是个靠谱的赚钱策略
私募基金市场上:如果夏普率小于1,这基金产品基本卖不出去
如果夏普率大于2,很多人会选择自己干
(很多对冲基金的要求,回测年化夏普率要高于2,甚至要求大于3(极少))
因此,绝大多数还行的发行产品夏普率都是1-2之间
文本挖掘
- 文本挖掘(Text Mining),又名文本分析、非格式化数据分析、非结构化数据分析
格式化数据:数据经过人为整理,提高了维度
- 0维,标量:a = 123
- 1维,向量:a = [1,2,3]
- 2维, 矩阵:a = [[1,2,3], [4,5,6]]
- 3维或以上,张量:a = [[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]
日常见到的格式化数据类型:
- 0维:单值变量
- 2维:Excel,CSV,MySQL数据表
- 3维或以上:彩色图像,JSON,MongoDB,HTML
非格式化数据:未经过整理的低维(0维)原始数据
- 除了少数格式化数据,绝大多数数据都是非格式化(一大坨文本数据)
从非结构化(非格式化)文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些知识更好地组织信息
- 现实世界中,可获取的信息绝大多数是以非结构化0维文本形式存储的,如新闻、论文、书籍、电子邮件和Web网页
- 这些数据都存在不同程度的非结构化问题,维度有低有高
- 结构化程度低的例如一篇纯文本文章,结构化程度高的例如一个精心设计的WEB网页,内含格式化的标题、标签、摘要、作者等等
中文文本挖掘信息的精确度、正确率是世界性难题,为保证信息最大限度的精确可用,实际工作中应以人工设置信息格式为主,文本挖掘技术手段为辅:
- 挖掘再牛,不如用户手动打标签
- 分析再牛,不如用户手动评分
文本分析常用库:
- 爬虫-requests,lxml,JSON
- 中文分词-Jieba
- 词云-WordCloud
- 中文情感分析-SnowNLP
- 语义结构分析-Gensim
Python爬虫入门
- 抓取:爬虫抓取网页图片和文本(绕过反扒措施)
- 解析:解析抓取数据
- 保存:保存和载入抓取数据
使用Python完成:
- 抓取:requests库,发送网络请求,返回响应数据
- 解析:lxml库,解析HTML文档标签,返回指定内容
- 保存:JSON库,(Python自带)转换Python列表或字典数据为字符串,保存至JSON文本,或读取JSON文本转为Python列表或字典数据
抓取:爬虫抓取网页图片和文本
- 二进制文件
- 文本文件
爬虫是实用程序自动化发送请求/获取响应的程序,主要用来抓取网页数据
抓取网页图片等二进制资源
img = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
requests.get(img) #返回http状态码
r = requests.get(img).content #返回抓取数据 - 二进制
r #注释输出,自己解除注释
#二进制数据保存为图片(二进制)文件
with open('baidu/baidu.png','wb') as f:
f.write(r)
抓取网页文本数据
抓取网页源代码