2019独角兽企业重金招聘Python工程师标准>>>

作者:阿布?

未经本人允许禁止转载

ipython notebook git版本

目录章节地址: 自己动手写一个印钞机 第一章 自己动手写一个印钞机 第二章 自己动手写一个印钞机 第三章 自己动手写一个印钞机 第四章 自己动手写一个印钞机 第五章 自己动手写一个印钞机 第六章 自己动手写一个印钞机 第七章

简书目录章节地址: 自己动手写一个印钞机 第一章 自己动手写一个印钞机 第二章 自己动手写一个印钞机 第三章 自己动手写一个印钞机 第四章 自己动手写一个印钞机 第五章 自己动手写一个印钞机 第六章 自己动手写一个印钞机 第七章 自己动手写一个印钞机 附录章

股票量化专题地址,请关注,谢谢!


非均衡胜负收益带来的必然非均衡胜负比例,目标由因子的能力解决一部分,模式识别提升关键的一部分

上一章使用 深度学习卷积神经网络对印钞机之路进行了可行性分析,主要是基于tensorflow的alex_net模型和基于caffe使用google_lenet进行训练学习, 这一章我们将从另一个方向发展印钞机之路,这条路是我最推荐的做法,因为使用深度学习特别是卷积神经网络,它最后学习到的特征权重等等对我们都是一个黑盒,我们并不知道它到底学习到了什么特征,这些特征有什么特点,为什么它能指导我们的交易,而且训练时间与判定效率都不高,对密集型交易系不适用, 下面我们开始!

这章开始的主角就是gmm-hmm了,它的最普遍的用途是在语音识别上,我们这章使用它做stock模式识别

# 首先加载之前因子运行好的训练集与测试集数据
fn = ZEnv.g_project_root + '/data/cache/golden_n6_train_abu'
key = 'golden_n6_train_abu'
orders_pd_train = ZCommonUtil.load_hdf5(fn, key)
print orders_pd_train.shapefn = ZEnv.g_project_root +  '/data/cache/golden_n6_test_abu'
key = 'golden_n6_test_abu'
orders_pd_test = ZCommonUtil.load_hdf5(fn, key)
print orders_pd_test.shape# out(42538, 31)(4837, 31)

# 对训练集的度量
train_ump = UmpMainClass(orders_pd_train, MlFiterGoldenPdClass)
train_ump.show_general()# outall fit order = (40351, 31)win rate = 0.500681519665profit_cg.sum() = 249.617989344win mean = 0.0745965275755 loss_mean = -0.0625759181825

  • 使用gmm从一定范围分类默认40-85需要根据样本数量进行调整,寻找compoent中大于loss阀值的分类分类记做ind
  • 返回df index=compoent_ind 一个compoent中可能有多个ind

说的简单点就是使用gmm对数据聚类,比如你对所有数据聚类聚了20个分类,然后发现第19个分类里面70%以上都是赔钱的交易,那我就提取这个分类的的这个类别,作为之后的判定器的组成部份,如果新的交易被判定为这类那我们就对这个交易进行拦截,

实际运用会稍微复杂一下,下面会一一说明对马尔科夫链及隐形马尔科夫链的理解推荐阅读‘数学之美’这书写的真不错,很多知识点比如熵的概念等我从这本书上看到的解释最令我信服而且通俗

如下所示,默认分类从40-85,选择阀值大与65%的失败类别, 各个轴像代表

  • lcs: compoent_ind 中样本总数

  • lrs: compoent_ind 中样本loss比例

  • lps: compoent_ind 中样本profit sum

  • lms: compoent_ind 中样本profit mean

    train_ump.gmm_component_filter()


由于简书不支持html表格,所以完整表格请查询git上ipython notebook完整版本


train_ump.cprs.loc[train_ump.cprs.lrs.argmax()]# outlcs    49.000000lrs     0.755102lps    -4.565771lms    -0.093179Name: 70_66, dtype: float64

上面找出失败率最高的分类70_66,75%以上的交易都是失败的交易

下面随便找个分类可视化一下,你最终找出来的分类就是类似这个的第8分类还有第29分类

寻找全局最优

# 摘录部份代码,具体请查阅UmpBase.pydef brust_min(self):"""全局最优:return:"""cprs = self.cprsoptv = sco.brute(self.min_func_improved, ((round(cprs['lps'].min(), 2), 0, 0.5), (round(cprs['lms'].min(), 2),round(cprs['lms'].max(), 3),0.01),(round(cprs['lrs'].min(), 2), round(cprs['lrs'].max(), 2), 0.1)),finish=None)return optvdef sco_min(self, guess):"""局部最优借:param guess::return:"""cprs = self.cprsbnds = ((round(cprs['lps'].min(), 3), round(cprs['lps'].max(), 3)),(round(cprs['lms'].min(), 3), round(cprs['lms'].max(), 3)),(round(cprs['lrs'].min(), 3), round(cprs['lrs'].max(), 3)))optv = sco.minimize(self.min_func_improved, guess, method='BFGS',bounds=bnds)return optvdef min_func(self, lpmr):cprs = self.cprsnts = self.ntsllps = cprs[(cprs['lps'] <= lpmr[0]) & (cprs['lms'] <= lpmr[1]) & (cprs['lrs'] >= lpmr[2])]nts_pd = pd.DataFrame()for nk in llps.index:nts_pd = nts_pd.append(nts[nk])if nts_pd.empty:return np.array([0.0001, 0])nts_pd = nts_pd.drop_duplicates(subset='ind', keep='last')num = nts_pd.shape[0]loss_rate = nts_pd.result.value_counts()[0] / nts_pd.result.value_counts().sum()win_rate = nts_pd.result.value_counts()[1] / nts_pd.result.value_counts().sum()improved = (nts_pd.shape[0] / self.fiter.order_has_ret.shape[0]) * (loss_rate - win_rate)# print improvedreturn np.array([improved, num])def min_func_improved(self, lpmr):"""求最大提高,min负数"""return -self.min_func(lpmr)[0]

train_ump.brust_min()# outarray([-0.48,  0.  ,  0.65])

将全局结果-0.48, 0. 0.65带入sco_min求局部优化

guess = [-0.63,  0.  ,  0.65]
train_ump.sco_min(guess)# outfun: -0.012936482367227579hess_inv: array([[1, 0, 0],[0, 1, 0],[0, 0, 1]])jac: array([ 0.,  0.,  0.])message: 'Optimization terminated successfully.'nfev: 5nit: 0njev: 1status: 0success: Truex: array([-0.63,  0.  ,  0.65])

上面所有选择最优的目的就是筛选能达到最优化的类别子集,为什么呢?因为比如某个分类虽然65%以上的单子都是失败的,但是那35%盈利的单子收益巨大,很可能出现这种情况在你使用高风险因子的时候,所以解最优方程组使用凸优化技术选取最优子集


筛选出符合最优的llps

llps = train_ump.cprs[(train_ump.cprs['lps'] <= -0.63) & (train_ump.cprs['lms'] <= -0.00 )& (train_ump.cprs['lrs'] >=0.65)]
llps

由于简书不支持html表格,所以完整表格请查询git上ipython notebook完整版本


# 针对子集llps的对之前交易的负作用力的统计
def choose_cprs_component(self, llps):""":param llps: cprs[(so.cprs['lps'] < 0) & (so.cprs['lms'] < -0.0)]你所需要的符合筛选条件的cprs:return:"""if not hasattr(self, 'cprs'):raise ValueError('gmm_component_filter not exe!!!! ')nts_pd = pd.DataFrame()for nk in llps.index:nts_pd = nts_pd.append(self.nts[nk])nts_pd = nts_pd.drop_duplicates(subset='ind', keep='last')ZLog.info('nts_pd.shape = {0}'.format(nts_pd.shape))loss_rate = nts_pd.result.value_counts()[0] / nts_pd.result.value_counts().sum()win_rate = nts_pd.result.value_counts()[1] / nts_pd.result.value_counts().sum()ZLog.info('nts_pd loss rate = {0}'.format(loss_rate))improved = (nts_pd.shape[0] / self.fiter.order_has_ret.shape[0]) * (loss_rate - win_rate)ZLog.info('improved rate = {0}'.format(improved))xt = self.fiter.order_has_ret.result.value_counts()ZLog.info('predict win rate = ' + str(xt[1] / xt.sum() + improved))nts_pd.sort_index()['profit'].cumsum().plot()plt.show()

如下显现这些选取的子集llps的对之前交易的负作用力

  1. loss_rate稍小相对阀值0.65。

  2. 预期胜率提升0.0129

    train_ump.choose_cprs_component(llps) # out nts_pd.shape = (1920, 9) nts_pd loss rate = 0.6359375 improved rate = 0.0129364823672 predict win rate = 0.513618002032

如下表格所示看看这个61_50有72%失败的分类列,发现内在的隐含意义

deg_windowPd, deg_60WindowPd都是在-5--11的负数,wave_score1会在1.5-2, deg_hisWindowPd没有明显规律,看到了吗,我们能从gmm-hmm的分类中发现我们能理解的规律,这就保证了我们的交易信心,对比黑盒的深度学习方式,优点一目了然


如下所示测试集没有开启因子优化的结果0.497,模型预测能提高0.0129 根据数据显示可以优化到0.509吗?

test_ump = UmpMainClass(orders_pd_test, MlFiterGoldenPdClass)
test_ump.show_general()# outall fit order = (4588, 31)win rate = 0.497820401046profit_cg.sum() = 23.8727798282win mean = 0.0724627453005 loss_mean = -0.0615429338615

将整个优化好的模型序列话到本地

train_ump.dump_clf(llps)

使用切割测试集开启因子优化回测优化:

  • use_last_test=True

  • BuyGoldenFactor.g_enable_fiter = True

    BuyGoldenFactor.g_enable_fiter 指明使用优化分类器,对判断失败概率大的交易进行拦截

    import BuyGoldenFactor from BuyGoldenFactor import BuyGoldenFactorClass import MetricsManger from MetricsManger import metrics_rsc from FactorMetrics import METRICSTYPE

    BuyGoldenFactor.g_enable_fiter = True buy_factors = [{'XD': 42, 'class': BuyGoldenFactorClass, 'draw': True}] out, orders_pd_test_enable_fiter = MetricsManger.make_metrics_rsc_mul_symbol_grid(buy_factors, n_folds=6, score_type=METRICSTYPE.SYSMBOL_R_SCORES_GOLDEN.value, ret_cnt_need=0, train_test_split=False, use_last_test=True, force_one_process=False)


test_filter_ump = UmpMainClass(orders_pd_test_enable_fiter, MlFiterGoldenPdClass)
test_filter_ump.show_general()# outall fit order = (4335, 31)win rate = 0.504498269896profit_cg.sum() = 26.3090428828win mean = 0.0691880572237 loss_mean = -0.0582673178493

如上所示:4588 - 4335大概250个交易被组织拦截(实际会更多,all fit order只显示在截止时间已经成交的stock)

胜率优化:0.5044 - 0.4978 不到1个点,比预期要低

收益比值提升挺多:26.3 - 23.8


我们直观的看看都有哪些交易被阻拦了

import TradeProxy
unsame_order = TradeProxy.find_unsame_in_2orders(orders_pd_test, orders_pd_test_enable_fiter)
unsame_order = unsame_order[unsame_order.result <> 0]
unsame_order.shape# out(253, 32)

如下所示之前预测失败率0.635,实际筛出来的失败率是0.616 还不错

pd.options.display.max_columns = 100
unsame_order.sort_values('buy Date').profit_cg.cumsum().plot()xt = unsame_order.result.value_counts()
ZLog.info('unsame_order loss rate = ' + str(float(xt[-1]) / xt.sum()))# outunsame_order loss rate = 0.616600790514

如下图所示看下有很多收益超过20%的单子被block掉了,虽然也有很多损失超过20%的单子 解决方案:gmm分类中找损失超过多少阀值的类似优先筛选或者组合权重筛选 之后章节会引入边裁机制解决这个问题

import MarketDrawer
# 显示三个被拦截了的收益大于20%的单子
MarketDrawer.plot_candle_from_order(unsame_order[unsame_order.profit_cg > 0.20][:3])

# 显示2个被拦截了的损失大于20%的单子
MarketDrawer.plot_candle_from_order(unsame_order[unsame_order.profit_cg < -0.20][:2])

使用ipython notebook的交互式寻找是否提高原始rate就能得到更高的impove

lps_range = (round(train_ump.cprs['lps'].min(), 2), round(train_ump.cprs['lps'].max(), 2), 0.1)
lms_range = (round(train_ump.cprs['lms'].min(), 2), round(train_ump.cprs['lms'].max(), 2), 0.01)
lrs_range = (round(train_ump.cprs['lrs'].min(), 2), round(train_ump.cprs['lrs'].max(), 2), 0.01)
def interact_llps(lps, lms, lrs):it_llps = train_ump.cprs[(train_ump.cprs['lps'] <= lps) & (train_ump.cprs['lms'] <= lms)& (train_ump.cprs['lrs'] >=lrs)]if not it_llps.empty:train_ump.choose_cprs_component(it_llps)
from ipywidgets import interact
interact(interact_llps, lps=lps_range, lms=lms_range, lrs=lrs_range)

完整可交互请参阅git上完整版本

使用视觉上感觉更好的进行回测

llps = train_ump.cprs[(train_ump.cprs['lps'] <= -0.63) & (train_ump.cprs['lms'] <= -0.00 )& (train_ump.cprs['lrs'] >=0.68)]
train_ump.dump_clf(llps)
BuyGoldenFactor.g_enable_fiter = True
buy_factors = [{'XD': 42, 'class': BuyGoldenFactorClass, 'draw': True}]
out, orders_pd_test_enable_fiter2 = MetricsManger.make_metrics_rsc_mul_symbol_grid(buy_factors, n_folds=6, score_type=METRICSTYPE.SYSMBOL_R_SCORES_GOLDEN.value, ret_cnt_need=0, train_test_split=False, use_last_test=True, force_one_process=False)

如下所示结果还没之前的好呀,看来可以比较相信凸优化选择的最优参数

UmpMainClass(orders_pd_test_enable_fiter2, MlFiterGoldenPdClass).show_general()# outall fit order = (4477, 31)win rate = 0.50033504579profit_cg.sum() = 25.0138982168win mean = 0.0712054456398 loss_mean = -0.0601899144826

修改拦截规则试试,如下可视化找到0, 0, 0.65有2215个 修改需要命中分类列的数量, BuyGoldenFactor.g_fiter_ind_cnt = 3 看看效果,简单说就是找一个比较宽松的限制条件,但是类别以前命中一个就拦截了,现在要命中三次,你可以变化出无数个变种在具体应用上,这里只是提供基础思路

llps = train_ump.cprs[(train_ump.cprs['lps'] <= 0) & (train_ump.cprs['lms'] <= 0 )& (train_ump.cprs['lrs'] >=0.65)]
train_ump.dump_clf(llps)
BuyGoldenFactor.g_enable_fiter = True
BuyGoldenFactor.g_fiter_ind_cnt = 3
buy_factors = [{'XD': 42, 'class': BuyGoldenFactorClass, 'draw': True}]
out, orders_pd_test_enable_fiter_ = MetricsManger.make_metrics_rsc_mul_symbol_grid(buy_factors, n_folds=6, score_type=METRICSTYPE.SYSMBOL_R_SCORES_GOLDEN.value, ret_cnt_need=0, train_test_split=False, use_last_test=True, force_one_process=False)

怎么样, 看懂了吗?我衷心的希望你能看懂本章的所有内容,这章是关于这种方式的一个开始,本章内容比较多,下一章继续深入使用这种方式,提升识别效率,提升胜率,这一章节很重要,整篇文章最重要的部分在我看来就是这一章!

再次强调文章中心思想:‘非均衡胜负收益’带来的必然’非均衡胜负比例‘,目标由’因子‘的能力解决一部分,’模式识别‘提升关键的一部分


下一章地址 自己动手写一个印钞机 第五章


感谢?您能有耐心看到这里

如果有什么问题可以加阿布的微信

微信号:aaaabbbuu

转载于:https://my.oschina.net/u/577691/blog/776220

自己动手写一个印钞机 第四章相关推荐

  1. 印钞机 java c c vb_自己动手写一个印钞机 第六章

    作者:阿布

  2. 自己动手写一个印钞机 第二章

    2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...

  3. 自己动手写一个印钞机 第一章

    2019独角兽企业重金招聘Python工程师标准>>> 作者:阿布? 未经本人允许禁止转载 ipython notebook git版本 目录章节地址: 自己动手写一个印钞机 第一章 ...

  4. 一夜抢空880万!中国最狠印钞机,终于开始收割年轻人了

    本文来源:金错刀 ID:ijincuodao 作者:金错刀频道 张一弛 茅台还在疯狂涨价. 但越是涨价,抢的人越是疯狂,难度系数与春运抢火车票有一拼. 最近,500ml的53度飞天茅台,出现在了罗永浩 ...

  5. 【专栏独家】详解微信朋友圈广告:会不会成为腾讯的新印钞机?

    微信这一国内最火热的社交工具,在1月21日推出了类似Facebook.Twitter 类似的信息流广告.号称依据用户细分信息与大数据,为广告主提供精准的广告投放.目前收费标准也是比较高的,基本500万 ...

  6. 浪潮之巅 第十六章 印钞机——最佳的商业模式(吴军)

    2012-12-17 update1.1 : 调整格式.错别字 所有成功的大公司都有好的商业模式,很多大公司的兴起,不是靠技术的革新而是靠商业模式的转变. 当我们的社会进入文明时代后,商业总是伴随着生 ...

  7. 浪潮之巅第十六章 — 印钞机:最佳的商业模式

    转自:http://www.google.com.hk/ggblog/googlechinablog/2009/07/blog-post_8551.html 当我们的社会进入文明时代后,商业总是伴随着 ...

  8. 浪潮之巅第十六章 印钞机——最佳的商业模式

    发表者:Google(谷歌)研究员 吴军 当我们的社会进入文明时代后,商业总是伴随着生产力的进步而发展.挣钱原本不是人类活动目的而是生存的手段,但是社会发展到今天,它似乎越来越成为很多人.团体(比如公 ...

  9. 印钞机 V1.0(量化选基总结)

    今年的元旦,在家把之前手工的选基方法完全程序化了.这是我的"印钞机" V1.0. 为什么叫印钞机,详细情况可见下文及最后的总结. 量化选基成果 我的主要基金投资方法其实就是量化选基 ...

最新文章

  1. Java应用梯度下降求解线性SVM模型参考代码
  2. 创建第一个Django项目
  3. ceph13 快速编译 v13.2.4 --2019_8
  4. eclipse插件镜像改为国内镜像
  5. Lucene.Net(转)
  6. spring boot注释_Spring Boot中的@SpringBootConfiguration注释
  7. size - 列出段节大小和总共大小
  8. 牛客网暑期ACM多校训练营(第三场) E Sort String 哈希处理字符串(模板)
  9. 2017/08/03 工作日志
  10. Android系统信息获取 之五:系统语言信息(续)-语言地区和简写对照表
  11. 数据结构47:查找算法
  12. 自己动手写PHP MVC框架
  13. 利用qiskit实现量子门以及态的初始化
  14. Python实现Word文档翻译
  15. 论文阅读《Camera pose voting for largescale image-based localization》
  16. 「星火计划沙龙视频」腾讯自研图数据库核心研发思路揭秘
  17. Android事件分发简单介绍
  18. 【vue自定义指令】
  19. Flutter 可选参数方法构建
  20. 微信里的apk链接打不开,怎么让微信的扫一扫扫描二维码后安装apk?

热门文章

  1. RHEL6开机启动流程详解
  2. 程序猿生存指南-35 王旭新巢
  3. 聊聊storm的AggregateProcessor的execute及finishBatch方法
  4. npm 发布包填坑指南
  5. 英伟达Tesla P100超级计算机组件全面登陆PCIe总线
  6. PHP版本VC6与VC9/VC11/VC14、Thread Safe与None-Thread Safe等的区别
  7. 3个步骤,让你的手机上网速度飙升--转载
  8. JDBC高级特性3--JNDI,连接池,分布式事务
  9. 教程:从FLASH过渡到SILVERLIGHT.(实例+源码)
  10. ExecuteScalar()如何返回整数