利用python 第二版解决微积分相关你 问题

&p&补充了几个数据分析的项目,目前是33个Python项目,会继续保持更新。Learn by doing才是正确的技术学习姿势。&/p&&p&更新:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/782& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NBA常规赛结果预测--利用Python进行比赛数据分析&/a&&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/780& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 气象数据分析&/a&&/p&&p&更新:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/677& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python基于共现提取《釜山行》人物关系&/a&&/p&&p&更新:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/623& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python3 实现火车票查询工具&/a&&/p&&p&更新:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/599& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 高德API+Python解决租房问题&/a&&/p&&p&更新:&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/589& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python3 色情图片识别&/a&&/p&&p&………………………………………………分隔线………………………………………………&/p&&p&最近几天刚好在整理Python项目,项目由易到难,代码量从几十行到几千行,在实验环境里保证可以全部完成。找到你认为有趣的去实现它,把项目做出来,知识才能变成自己的:)&/p&&p&(建议PC端访问,边看教程边在环境里动手实践,手机上仅可查看教程)&/p&&p&入门和进阶篇均为免费课程,可以免费使用在线练习环境。&/p&&p&&b&入门篇&/b&&/p&&p&1.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/370& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python 图片转字符画&/a&&/p&&p&50 行 Python 代码完成图片转字符画小工具。&/p&&figure&&img src=&https://pic3.zhimg.com/50/739f35ab6c535fcb83d16a0_b.jpg& class=&content_image&&&/figure&&p&2.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/368& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 200行Python代码实现2048&/a&&/p&&p&仅用200行的python代码完成2048小游戏的编写。&/p&&p&3.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/49& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - pygame开发打飞机游戏&/a&&/p&&p&使用Python快速开发一款PC端玩耍的微信打飞机游戏,基于pygame实现。&/p&&p&4. &a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/674& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 实现简单画板&/a&&/p&&p&要利用 Pygame 模块来自己实现一个功能更加简单的画板。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-0b75bbd1f7d8d45c182e3fdbdf740600_b.jpg& class=&content_image&&&/figure&&p&5.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/408& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 全面解析PythonChallenge&/a&&/p&&p&本课程带领大家一步一步攻克Python Challenge中的难题,在一个又一个脑洞大开的 Python 问题中提升自己的 Python 水平。 &/p&&p&6.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/729& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 使用 Python 解数学方程&/a&&/p&&p&介绍如何用python解决数学题。 说到数学题,相信大家都不陌生,从小学到大学都跟数学打交道。 其中初中的方程组,高中的二次曲线,大学的微积分最为头疼,今天我们将使用python 来解决方程组问题,微积分问题,矩阵化简。 &/p&&p&7.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/302& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 基于 Python 的文件备份&/a&&/p&&p&Python 做个简单的备份脚本程序,可以备份主目录和系统文件等。&/p&&p&8.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/357& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Kaggle入门:泰坦尼克号幸存者项目&/a&&/p&&p&Kaggle是一个线上数据科学竞赛类网站。本课程将使用python科学计算工具对Kaggle提供的泰坦尼克号上的人员数据进行分析建模。&/p&&p&9.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/70& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python文本解析器&/a&&br&使用Python来解析纯文本生成一个HTML页面的小程序。&/p&&p&10.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/725& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python3实现简单的FTP认证服务器 &/a&&/p&&p&日常生活中我们共享文件都是通过QQ,微信等软件来实现的,今天将通过本课程将教大家使用Python在自己的电脑上架设一个FTP服务器,用来管理自己日常生活中的文件。&/p&&p&11.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/708& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python 3 实现 Markdown 解析器 &/a&&/p&&p&本课程我们将使用 Python 3 打造 Markdown 文本解析器,并且程序支持输出 HTML 格式与 PDF 格式的文件。&/p&&p&12.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/364& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python 破解验证码&/a&&br&通过一个简单的例子来讲解破解验证码的原理。&/p&&p&13.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/427& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 用Python做2048游戏&/a&&br&通过GUI来体验编程的乐趣。&/p&&p&14.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/552& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python实现简单的Web服务器&/a&&br&使用 Python 语言实现一个 Web 服务器,探索 HTTP 协议和 Web 服务的基本原理。&br&&/p&&p&&b&进阶篇&/b&&/p&&p&15.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/589& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python3 色情图片识别&/a&&/p&&p&使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图像处理库,会编写算法来完成对划分图像的皮肤区域。&/p&&figure&&img src=&https://pic1.zhimg.com/50/770a3204c65abcc5276a6_b.jpg& class=&content_image&&&/figure&&p&16.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/561& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python实现3D建模工具&/a&&/p&&p&本课程将基于OpenGL实现一般CAD软件都会具备的基础功能:渲染显示3D空间的画面并可以操作3D空间中物体。&/p&&figure&&img src=&https://pic1.zhimg.com/50/c3ec1af504f0f_b.jpg& class=&content_image&&&/figure&&p&17.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/623& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python3 实现火车票查询工具&/a&&/p&&p&本课程使用 Python3 抓取 12306 网站信息提供一个命令行的火车票查询工具。通过该项目的实现,可以熟悉 Python3 基础及网络编程,以及 docopt,requests,prettytable 等库的使用。&/p&&p&18.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/574& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python实现基于协程的异步爬虫&/a&&/p&&p&探讨几种实现爬虫的方法,从传统的线程池到使用协程,每节课实现一个小爬虫。另外学习协程的时候,我们会从原理入手,以ayncio协程库为原型,实现一个简单的异步编程模型。&/p&&p&19. &a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/705& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PyQt 实现简易浏览器&/a&&/p&&p&基于 Python 3.4 和 PyQt 5 来学习 GUI 编程,课程分为两次实验,第一次实验先简单了解 Qt 各个组件的使用方法,第二次课程将尝试实现一个浏览器。&/p&&p&20. &a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/677& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python基于共现提取《釜山行》人物关系&/a&&/p&&p&针对《釜山行》剧本的文本,使用python编写代码分析文本中人物的共现关系,完成对《釜山行》文本的人物关系提取,并利用Gephi软件对提取的人物关系绘制人物关系图。&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-438fef09e3e9c512eacad5f_b.jpg& class=&content_image&&&/figure&&p&21.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 使用 Python 3 编写系列实用脚本&/a&&/p&&p&使用 Python 3 来编写一系列的实用脚本,实验的过程中能熟悉 Python 3 的使用,学习使用各种功能强大的模块。&/p&&p&22.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/554& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python实现Python解释器&/a&&/p&&p&从实现一个玩具解释器开始学习解释器基本知识,然后考察Python字节码进一步学习理解Python解释器的内部机制,最终实现一个500行以内的Python解释器。&/p&&p&23.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/599& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 高德API+Python解决租房问题&/a&&/p&&p&编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时。&/p&&figure&&img src=&https://pic2.zhimg.com/50/a54f90b5ac2_b.jpg& class=&content_image&&&/figure&&p&24.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/359& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 基于Flask/RethinkDB/Backbone.js实现TODO List&/a&&/p&&p&使用 RethinkDB,Flask 与 Backbone.js 制作一个简单的 todo list。&/p&&p&25.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/780& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 气象数据分析&/a&&/p&&p&对意大利北部沿海地区的气象数据进行分析与可视化。&/p&&p&26.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/782& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NBA常规赛结果预测--利用Python进行比赛数据分析&/a&&/p&&p&利用NBA在年的比赛统计数据进行回归模型建立,最终在今年的常规赛中预测每场比赛的输赢情况。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-bd4574255_b.jpg& data-rawwidth=&983& data-rawheight=&289& class=&origin_image zh-lightbox-thumb& width=&983& data-original=&https://pic3.zhimg.com/50/v2-bd4574255_r.jpg&&&/figure&&p&27.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/31& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Flask开发轻博客&/a&&/p&&p&使用Python Flask Web框架开发一个具备基本功能的轻博客平台,在其中学习Python的Web开发。&/p&&p&28.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/487& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Django 搭建简易博客&/a&&/p&&p&本教程介绍如何一步步使用 Django 开发一个简单的博客 Web应用,涉及 Django Web开发,MVC,Template等知识点,适用于有 Python 和 Django 基础的同学。&/p&&figure&&img src=&https://pic2.zhimg.com/50/c510d04d5e6cd7c37bbb54bf_b.jpg& class=&content_image&&&/figure&&p&&b&综合篇&/b&&/p&&p&已下项目对环境占用资源较大,属于会员及训练营项目。&/p&&p&29.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python3 实现淘女郎照片爬虫 &/a&&/p&&p&本实验通过使用 Python 实现一个淘宝女郎图片收集爬虫,学习并实践 BeautifulSoup、Selenium Webdriver 及正则表达式等知识。 &/p&&p&30.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/581& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 基于 Flask 及爬虫实现微信娱乐机器人&/a&&/p&&p&本次课程是基于 Flask Web 框架开发的娱乐级别的微信公众号后台,学习并实践 python 编程,Flask Web 开发以及微信公众平台开发机器人的基本步骤。&/p&&p&31.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/356& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - Python版设计模式实践&/a&&/p&&p&多种常见的设计模式的原理以及如何应用实践,涵盖工程模式,命令模式,外观模式,适配器模式,装饰模式,代理模式等。&/p&&p&32.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/354& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 仿OpenStack开发云计算管理软件&/a&&/p&&p&使用Python语言开发一套类似OpenStack的云计算管理平台LouCloud,具备基本的用户,服务器,镜像与虚拟机管理功能。&/p&&p&33.&a href=&//link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/355& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python - 仿StackOverflow开发在线问答系统&/a&&/p&&p&使用Python Flask Web开发框架实现一套类似StackOverflow的在线问答平台LouQA,具备提问,回答,评论点赞等功能。&/p&
补充了几个数据分析的项目,目前是33个Python项目,会继续保持更新。Learn by doing才是正确的技术学习姿势。更新:更新:…
&figure&&img src=&https://pic4.zhimg.com/341a07bca0e5d3988d5adc9_b.jpg& data-rawwidth=&665& data-rawheight=&1000& class=&origin_image zh-lightbox-thumb& width=&665& data-original=&https://pic4.zhimg.com/341a07bca0e5d3988d5adc9_r.jpg&&&/figure&&p&爱好博彩业和投资学的同学应该都对著名的凯利公式不陌生。这是一个通过计算edge和odds来选择最佳投注比例的公式,目的是长期获得最高的盈利。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/cc6e1dc8c807_b.jpg& data-rawwidth=&552& data-rawheight=&108& class=&origin_image zh-lightbox-thumb& width=&552& data-original=&https://pic2.zhimg.com/cc6e1dc8c807_r.jpg&&&/figure&公式中&/p&&p&f = 应该放入投注的资本比值&/p&&p&p = 获胜的概率&/p&&p&q = 失败的概率&/p&&p&b = 赔率&/p&&br&&p&其实公式的作者,John Larry Kelly,并不是一个资深赌徒,而是一位著名的物理学家,他发明这个公式的时候正是著名的AT&T的Bell Lab 中的一名研究科学家,研究方向是当时还算新兴前沿的电视信号传输协议。&/p&&figure&&img src=&https://pic2.zhimg.com/8e3ac86a5ffbe63d202ff_b.jpg& data-rawwidth=&620& data-rawheight=&358& class=&origin_image zh-lightbox-thumb& width=&620& data-original=&https://pic2.zhimg.com/8e3ac86a5ffbe63d202ff_r.jpg&&&/figure&&br&&br&&p&这样一个理论科学家是如何把名字和博彩联系在一起的呢?那就不能不看下这本书了。&/p&&figure&&img src=&https://pic1.zhimg.com/5f10f67bfc27ce_b.jpg& data-rawwidth=&333& data-rawheight=&499& class=&content_image& width=&333&&&/figure&&br&&p&William PoundStone, 把Kelly 公式和它发明者的故事写入了他的作品,Fortune’s Formula, the untold story of the scientific betting system that beat the casinos and Wall Street. &/p&&br&&figure&&img src=&https://pic3.zhimg.com/b2c53ec904addbf4323516_b.jpg& data-rawwidth=&409& data-rawheight=&296& class=&content_image& width=&409&&&/figure&&br&&p&1955年6月,美国出现了一个极其有名的电视节目,叫做64000 dollar question. 答题者通过不断答对题来累积奖金,一时风靡全美,黄金时段收视率达到85%,各路山寨节目不断。这样一个quiz show迅速吸引了场外下注来赌赢家的赌盘。这档节目的录制是在纽约,东海岸现场直播,而西海岸则有延时。当时的新闻爆出一些丑闻,有关西海岸的赌徒通过电话提前得知结果,赶在了西海岸直播前下注。&br&&/p&&p&John Kelly 看了新闻之后,他想到这个如何使具备一定内幕消息(private wire)但是同时有一部分杂音(noise)的赌徒最大化长期获益的问题,可以使用他们实验室关于咨询学和噪音传递研究的公式来解决。于是,他以一个赛马的模型,推出了凯利公式的雏形。&/p&&p&John Kelly的理论是这样的,对于有一定private wire的赛马人来说,第一个自然的想法当然是放入全部的资金,但是这样就会造成万一输掉血本无归的惨境。而在Kelly想要解决的这个问题中,在任何一个时刻输掉全部资金显然是不符合最大化累积收益的需求的。&/p&&p&真正应该关心的是长期累积的收入(compounding return),对于累积的收益来说,最后的结果只和输赢的局数有关,而和输赢的顺序无关。所以他推出了一个最佳的投入仓位比,来最大化长期的累积收益:&/p&&p&bet = edge / odds = 预期获益/获益回报&/p&&p&这里的edge 在赌博中可以理解为 获胜的概率*赔率 - 失败的概率,&b&当edge的数字为正的时候,这就是值得下注的比赛,而edge为0或者负数的情况说明赌徒不具备edge, 不应该下注(applies to most of games in casino) &/b&&/p&&p&而odds则是赔率,&b&我们更可以把它理解为一种公众对概率的估计,是公开的消息。&/b&&/p&&p&我们可以用kelly formula模拟这样一种情况:小明现在有100元的起始资金,他现在将要投硬币4次,每一次他投出硬币为正面的时候,将获得6倍资金回报(1陪5),当他投出硬币为反面,陪光。请问小明要如何分配每次下注资金,才能最大化他4次投币之后的收益 (maximize geometric mean)呢?&/p&&figure&&img src=&https://pic1.zhimg.com/4e37afe5a6eb53abf67cdd3_b.jpg& data-rawwidth=&896& data-rawheight=&630& class=&origin_image zh-lightbox-thumb& width=&896& data-original=&https://pic1.zhimg.com/4e37afe5a6eb53abf67cdd3_r.jpg&&&/figure&&p&根据Kelly 公式计算,我们可以建立起这样一个pascal triangle正反面的概率各为50%,edge = 0.5*5-0.5 = 2, odds为5,最佳仓位为40%,可以看到最终在16个可能出现的结果中(4次投掷),12.96和8100出现1次,64.8和1620出现4次,324出现6次,16次结果的geometric mean 为324 - Kelly 公式的目的正是最大化这些结果的geometric mean。&/p&&br&&p&由于Kelly 公式着眼于长期回报率和风险的控制,所以天然就吸引投资人想要把它应用在投资当中。比如著名的传奇数学家Edward Thorp读了John Kelly的论文之后,先是自学Fortran用IBM大型机开发了一套专门用于21点的算法(感兴趣的同学可以去看下电影21,电影里的card counting的方法正是获得edge的来源),带上John Kelly的导师在拉斯维加斯大把吸金。&/p&&p&(趁机放张帅帅的Jim Sturgess有木有 &.&
)&/p&&figure&&img src=&https://pic4.zhimg.com/eba6cfefca46_b.jpg& data-rawwidth=&248& data-rawheight=&346& class=&content_image& width=&248&&&/figure&&br&&p&之后又专门成立了一个hedge fund -
Princeton Newport Partners. 看看这个fund的表现吧&/p&&figure&&img src=&https://pic3.zhimg.com/2cfefdf9a6ca105ac5df2_b.jpg& data-rawwidth=&918& data-rawheight=&706& class=&origin_image zh-lightbox-thumb& width=&918& data-original=&https://pic3.zhimg.com/2cfefdf9a6ca105ac5df2_r.jpg&&&/figure&&br&&p&Kelly Formula到底在投资中起到了哪些作用,又有哪些可以研究发掘的领域呢? &/p&&p&&b&&u&Kelly Formula在仓位控制中的应用&/u&&/b&&/p&&p&在股票市场中,kelly formula的形式和赌博中稍有不同,因为失败之后有一个expected loss,
我们将公式修改为 f = (bp - cq) / (bc),来做一个简单的回测。&/p&&p&假定赚钱(p)赔钱概率(q = 1-p)一样,均为0.5,我们认为净赢率(b)为最高价/当前价-1,净损失率(c)为1-最低价/当前价。&/p&&p&如果当前价大于一年内最高价,满仓,如果当前价小于一年内最低价,空仓,其他情况使用之前得到的f计算出持仓比例(0-1之间),每周调仓。&/p&&p&我们挑选了单只股票作回测,回测的参照物是该股票的买入持有策略(即为价格曲线),看看使用Kelly 公式调节仓位有什么样的效果。&/p&&br&&figure&&img src=&https://pic4.zhimg.com/7176fadbe23a7d9bbf2a6da0_b.jpg& data-rawwidth=&2780& data-rawheight=&1210& class=&origin_image zh-lightbox-thumb& width=&2780& data-original=&https://pic4.zhimg.com/7176fadbe23a7d9bbf2a6da0_r.jpg&&&/figure&&br&&p&在此基础上,我们再尝试一些优化,&/p&&ol&&li&p=q=0.5 的假设太简单粗暴啦, 我们来根据历史数据统计过去一年中5个交易日内的涨跌概率。&/li&&li&加入新的标准,统计过去一年内该股票的一周最大涨跌幅,以此计算b和c,得到的f与之前f的求平均。&/li&&li&设定止损。如果一周内跌幅超过8%,则清仓。&/li&&/ol&&p&看看是不是优化以后的代码会有更好的表现呢? &/p&&br&&p&&figure&&img src=&https://pic2.zhimg.com/a133c3ddb4f557_b.jpg& data-rawwidth=&2778& data-rawheight=&1212& class=&origin_image zh-lightbox-thumb& width=&2778& data-original=&https://pic2.zhimg.com/a133c3ddb4f557_r.jpg&&&/figure&&br&有兴趣的同学可以在这里克隆代码 &a href=&https://link.zhihu.com/?target=https%3A//www.ricequant.com/community/topic/598/kelly-formula-%25E7%25AE%%258D%%25BA%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kelly Formula 的仓位控制&/a&&/p&&br&&br&&br&&p&&u&Kelly Formula在选股和建立投资组合方面的应用&/u&&/p&&br&&p&Kelly 公式在投资组合的应用中,也经常以 f = excess return/variance 的形式出现,f的数值越高也就是投资的价值越大 &br&&/p&&p&1.计算股票池中每只股票的Kelly leverages 作为排序score(这里过去一年内每日收益的mean/var)&br&2.从大到小进行排序,选出前10名的股票,价格在5日均线之上时才购买,平均购买,每月调仓。&/p&&p&&figure&&img src=&https://pic2.zhimg.com/fca41a5f4fce5c0aa2c37e_b.jpg& data-rawwidth=&2764& data-rawheight=&1196& class=&origin_image zh-lightbox-thumb& width=&2764& data-original=&https://pic2.zhimg.com/fca41a5f4fce5c0aa2c37e_r.jpg&&&/figure&&br&在此基础上仍然有进步的空间,因为我们通过kelly score选择股票的时候并未考虑之间的相关性,可以考虑在筛选出股票之后用 covariance matrix重新计算kelly 仓位并按照计算仓位比值来调仓。有兴趣的朋友可以自己克隆现在的策略&a href=&https://link.zhihu.com/?target=https%3A//www.ricequant.com/community/topic/611/kelly-criterion%25E8%25BF%259B%25E8%25A1%258C%25E9%E8%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kelly Formula选股&/a&来进一步优化。&/p&&br&&br&&br&&p&John Larry Kelly (1923 - 1965) 42岁的时候就不幸去世了,我猜想对于他个人来说,更希望被人铭记的不是拉斯维加斯赌场和hedge fund 之类的掘金工具,而是他作为科学家最骄傲的一个时刻 - 1961年,和同事Gertsman一起,在Bell Lab 用IBM704合成了人工声音(Synthesize Speech),Kelly 的 vocoder制作了歌曲&b&Daisy Bell&/b&. &b&史上第一首由电脑合成的音乐.&/b&&/p&&p&就在这一年,一个叫做Arthur Clarke的作家访问了Bell Lab, 被这个人工合成的声音和音乐震惊,将这一幕写入了他的科幻小说。&/p&&p&又过了七年,一个叫做Kubrike的导演让一台濒死的电脑HAL在科幻电影里把这首歌曲唱了出来,&b&这是对科学家Kelly最好的致敬和缅怀&/b&。&/p&&br&&p&&b&这部电影就是2001: A Space Odyssey &/b&&/p&&figure&&img src=&https://pic4.zhimg.com/abcbf9c244a_b.jpg& data-rawwidth=&720& data-rawheight=&291& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/abcbf9c244a_r.jpg&&&/figure&&p&行文到最后,献上Kelly的这首电脑合成的Daisy Bell &/p&&p&&a class=&video-box& href=&https://link.zhihu.com/?target=http%3A//v.youku.com/v_show/id_XNzA4NjExODcy.html& target=&_blank& data-video-id=&& data-video-playable=&& data-name=&daisy bell—在线播放—优酷网,视频高清在线观看& data-poster=&http://r4.ykimg.com/60FA6A0A410FBD6F3BBC& data-lens-id=&&&
&img class=&thumbnail& src=&http://r4.ykimg.com/60FA6A0A410FBD6F3BBC&&&span class=&content&&
&span class=&title&&daisy bell—在线播放—优酷网,视频高清在线观看&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&http://v.youku.com/v_show/id_XNzA4NjExODcy.html&/span&
爱好博彩业和投资学的同学应该都对著名的凯利公式不陌生。这是一个通过计算edge和odds来选择最佳投注比例的公式,目的是长期获得最高的盈利。公式中f = 应该放入投注的资本比值p = 获胜的概率q = 失败的概率b = 赔率 其实公式的作者,John Larry Kelly,并…
&figure&&img src=&https://pic1.zhimg.com/57b9b44be51a3a93f985_b.jpg& data-rawwidth=&1294& data-rawheight=&1028& class=&origin_image zh-lightbox-thumb& width=&1294& data-original=&https://pic1.zhimg.com/57b9b44be51a3a93f985_r.jpg&&&/figure&&p&如何构建一个量化策略或者从事较为微观市场的研究,扎实的交易、财务甚至舆情、大数据的理解是第一步,因此我也逐渐会发一些文章来说明这些数据的本质是什么,希望能有所帮助罢。&/p&从交易所的数据发出到你的电脑上能看到发生了很多事,如何判断数据的好坏是一个复杂的事情。&br&作为曾经写过不少交易所的tick数据的处理程序的人,可以解释下为啥复杂:)&br&&br&Tick Data本身并不神秘,就是交易所把每只股票(亦或是futures options)的active order book(就是你的order还存在在交易所里面,并且没有被撮合成交。)里面的买、卖的单的情况发给你,但是每个市场的规定都不同,举个栗子:&br&&br&最真实的order book是这样的,一天的市场一开始的时候苹果股票的order book清空(这里不进行auction period的探讨):&br&&figure&&img src=&https://pic4.zhimg.com/39cceef0e3cfc80f58fb6d8a_b.jpg& data-rawwidth=&394& data-rawheight=&57& class=&content_image& width=&394&&&/figure&&br&1. 接着来了第一个卖家: :&br&&figure&&img src=&https://pic1.zhimg.com/ad184fdaf541c608fa8939_b.jpg& data-rawwidth=&414& data-rawheight=&58& class=&content_image& width=&414&&&/figure&&br&&br&这时候交易所会发给你一个message,告诉你是苹果股票有人想以100块钱买1000股,那么这个order就先挂在了order book上。&br&&br&2. 第二个卖家来了,他想卖得更高: :&br&&figure&&img src=&https://pic3.zhimg.com/1c43ccf42c_b.jpg& data-rawwidth=&378& data-rawheight=&88& class=&content_image& width=&378&&&/figure&&br&这时候交易所会发给你另一个message,告诉你是苹果股票有人卖的价格比你差,于是排序在下面。&br&&br&3. 刚才的第一个卖家后悔了,cancel了他的order: 撤消了,那么交易所会有message告诉你,但是你需要自己编程处理这种remove掉一个tick的情况:&br&&figure&&img src=&https://pic1.zhimg.com/e0bd694b2e9cf7b33b3e43_b.jpg& data-rawwidth=&409& data-rawheight=&65& class=&content_image& width=&409&&&/figure&&br&4. 终于有买家来了... 500@90 , 这个价格是不会成交的,因为买家低于现在的最佳卖价:101,那么order book里面会继续存着这个order,同时会发送一个tick告诉市场上的其他人:有买单了:&br&&figure&&img src=&https://pic2.zhimg.com/cacac94d0d9694dacddf4e_b.jpg& data-rawwidth=&369& data-rawheight=&58& class=&content_image& width=&369&&&/figure&&br&5. 继续,接着有一位买家以101块钱买入1000股,等于要把目前的best offer 给match - 撮合了,那么你是不会收到这个最新的bid: 101@1000 的,因为它会进入matching engine的瞬间跟对面的best offer 撮合了,tick table的一个规则: bid offer 永远不会cross,否则要么是数据商的bug,要么是交易所的bug。现在,你只会收到一个告诉你delete the best offer的message,那么tick table长这样:&br&&figure&&img src=&https://pic4.zhimg.com/213ddce66a10ca4b518079febbf26904_b.jpg& data-rawwidth=&397& data-rawheight=&61& class=&content_image& width=&397&&&/figure&&br&Tick数据就是这么简单,市场上会重复这个过程。&br&但是比较麻烦的是:&br&&ol&&li&很多时候tick的数据会以UDP发送,想象股市上如果交易非常活跃,那么数据量会非常大,UDP会存在丢包情况,如何处理。曾经遇到过很疯狂的tick update但是还要保持在x micro second的更新cache,可能要排序(看交易所protocol),以及发送出去给前端。&/li&&li&如何更快的处理实时的tick数据,否则数据量如此大,一旦延迟,以后就再也跟不上“实时”的节奏了,直到你的程序挂掉。&/li&&li&如何避免一些特殊情况造成bug,一旦一个tick没有算对,那么后面的tick table全是错的:)&/li&&/ol&同样,还有对tick的理解问题:不同市场的tick还有不同点,上面所说的是发达国家的股票市场,以实时情况推送(有新的order并且在tick的发送level以内,比如东京交易所只发送8个tick level,那么你看不到整个full tick的,因为可能会有100多个level,如果很多人交易的话)。&br&&br&但是国内是多少个milli second截取一个快照(snapshot),然后发送给你,兴许是国内交易系统已经非常古老,跟不上IT的发展了。那么这个tick数据并不是“real time”的,你只知道“哦!在前100 millisecond和现在的tick 变化是这样的”,可能中间已经成交了数千单。&br&&p&最后的一个思考题,limit order-限价单提供了流动性,而market order-市价单吞噬流动性,为什么?(这个论点也未必成立?)&/p&
如何构建一个量化策略或者从事较为微观市场的研究,扎实的交易、财务甚至舆情、大数据的理解是第一步,因此我也逐渐会发一些文章来说明这些数据的本质是什么,希望能有所帮助罢。从交易所的数据发出到你的电脑上能看到发生了很多事,如何判断数据的好坏是一…
对题目中提到的“冰山算法”,我刚好有一些了解,可以给大家讲讲。很多人对“量化交易”的理解实在太过片面,基本上把它等同于生钱工具,我不赞同这种观点。交易首先是交易本身,有它自身的经济学意义,忽略这一点而单纯把它看成使钱增值的数字游戏,很容易就会迷失本心。&br&&br&我也不认为算法本身有什么稀奇,再好的算法也是死的,真正的核心价值一定是掌握和使用算法的人。实际上我讲的东西也都是公开的信息,但是即便了解了技术细节,能真正做好的人也寥寥无几。&br&&br&希望这个回答可以让你对量化和高频交易有一个更清醒的认识。&br&&br&~~~~~~~~~~~~~~~~~~&br&&br&首先我相信不少人概念里的高频交易还是这个样子的:&br&&figure&&img src=&https://pic4.zhimg.com/50/0320bbc08c1d67dc51c721e4fa400232_b.jpg& data-rawwidth=&400& data-rawheight=&284& class=&content_image& width=&400&&&/figure&&br&但对高频交易来说,这种信息是非常粗糙的。所以这里先要对不熟悉背景的同学介绍一下什么叫做Order Book。现在主流的交易所一般都使用Order Book进行交易,交易所在内部的Order Book上记录所有买家和卖家的报价,比如像这样:&br&&figure&&img src=&https://pic4.zhimg.com/50/e508ba3ad4d62e90f054d9_b.jpg& data-rawwidth=&387& data-rawheight=&204& class=&content_image& width=&387&&&/figure&&br&&br&Bid表示买家,Offer表示卖家,这张报价单表示买卖双方发出的所有报价单(Limit Order)。这张表才是高频交易最关心的信息。任意时刻,买家的出价总是低于卖家(比如这里的98对101)。所以报价虽然一直在变化,但是只有报价是不会有任何成交的。&br&&br&什么时候会产生交易呢?有两种情况,第一是任一方发出市价单(Market Order),比如一个买家发出一张单量为10的市价单,就可以买到卖方在101价格上挂的10份,这个交易成功之后,Order Book会变成这样:&br&&figure&&img src=&https://pic3.zhimg.com/50/fbcbb09cf0668_b.jpg& data-rawwidth=&387& data-rawheight=&204& class=&content_image& width=&387&&&/figure&&br&第二是发出一个价格等于对方最优报价的限价单,也会产生和上述情况相同的结果。&br&&br&需要强调的是,虽然真正的Order Book只存在于交易所内部,所有交易都在交易所内完成,但是交易所会把每笔报价和市价单都转发给所有人,所以所有的买家和卖家都可以自己维护一个同样的数据结构,相当于交易所Order Book的镜像。通过跟踪分析自己手里这份的镜像变化,来制定交易策略,是高频交易算法的核心思想。&br&&br&~~~~~~~~~~~~~~~~~~&br&&br&基础知识介绍完毕,下面为了方便大家理解,我采用一种更形象的方式来表示Order Book:&br&&figure&&img src=&https://pic3.zhimg.com/50/31dc04dbf4f52ca7af44b03c_b.jpg& data-rawwidth=&468& data-rawheight=&135& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic3.zhimg.com/50/31dc04dbf4f52ca7af44b03c_r.jpg&&&/figure&&br&这张图对应文章开始时的那个Order Book,应该可以明白地看出,横轴表示价格,纵轴表示订单量,绿色表示买家,红四表示卖家。这样做的目的是为了引出本篇讨论的主题:冰山订单。&br&&br&通过上述基本分析大家可以看出,交易所内的交易数据是完全公开的,市场上任意时刻,有谁想要买/卖多少,所有人一目了然,没有任何秘密。这样做本身是有经济学意义的,因为只有展示出买卖的需求,才会吸引潜在的商家来交易,所以&b&在市场上一定程度的公开自己的需求是必要的&/b&。但这样同时带来一个严重的后果,一旦有某个人想要大量买/卖,他所发出的巨额限价单会直接展示给所有人。比如一个买家挂出巨额买单后,Order Book会像这样:&br&&figure&&img src=&https://pic2.zhimg.com/50/ab980cdba9d438bfbfa57fc311f3efb2_b.jpg& data-rawwidth=&468& data-rawheight=&135& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic2.zhimg.com/50/ab980cdba9d438bfbfa57fc311f3efb2_r.jpg&&&/figure&&br&这对他非常不利,因为所有人都会利用这个信息来跟他做对。大家会判断,现在市场上存在大量的买压,于是会出现一大批为了赚钱而冲进来的人抢购,价格会快速上升,这样原来这个人可以在98这个价位买到的东西,很快就变得要在更高的价位上才能买到。这种情况,那些后来的人做的就是&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Front_running& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Front running&/a&,而原来的那个人则面对&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Adverse_selection& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&逆向选择风险&/a&。&br&&br&为了解决这个问题,交易所提供了一种针对性的工具,就是所谓的冰山订单(Iceberg Order)。这种订单可以很大,但只有一小部分是公开出来的,大部分则隐藏起来,除了交易所和发单者本人谁也看不到,真的像一座“冰山”一样。比如像这样:&br&&figure&&img src=&https://pic4.zhimg.com/50/898a440c4fccaa_b.jpg& data-rawwidth=&468& data-rawheight=&291& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic4.zhimg.com/50/898a440c4fccaa_r.jpg&&&/figure&&br&灰色的部分就是冰山订单隐藏的部分。这样,只有当有对应隐藏量的交易发生时,交易所才会通知其他人,就避免了别人利用显示订单的信息来做&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Front_running& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Front running&/a&。&br&&br&凡事有一利必有一弊。冰山订单虽然保护了发单者的利益,但是对于其他市场参与者来说却又变成了一种不公平的规则。那些有真实的交易需求的参与者,会因为对局势的误判而损失惨重。所以接下来的问题就变成,如何发现市场上的冰山订单?&br&&br&首先有一种最简单的方法。有的时候,冰山订单是挂在最优买价和卖价之间(spread),像这样:&br&&figure&&img src=&https://pic2.zhimg.com/50/b8e9efaf2e1fac55516f_b.jpg& data-rawwidth=&468& data-rawheight=&291& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic2.zhimg.com/50/b8e9efaf2e1fac55516f_r.jpg&&&/figure&&br&对于这种情况,有一个非常简单的探测方法,即发一个最小额度的限价单在spread里,紧跟着取消这个订单。比如这个例子中,发出一个卖价为99的限价单然后取消。因为这个价格本身对不上显式的买价(98),如果没有冰山单的存在,一定不会成交。但有冰山单的情况下,一旦交易所收到这个卖单,会立刻成交冰山单中对应的量,而之后的取消指令就无效了。这样,以一种微小的成本,就可以发现市场中隐藏着的订单。事实上,的确有人会做这种事情,频繁的发单然后取消,在最优价差之间形成一种高频扰动,用来探测隐藏单。&br&&br&为了应对这种扰动探测,大家一般都不会直接挂单在spread里。而是会像之前那样和普通的限价单挂在一起,这样发生交易之后,你就很难推测消耗掉的究竟是正常的限价单,还是冰山订单。那么应该怎么做呢?&br&&br&首先有一个直接的思路。冰山订单的存在,一定程度上反映了挂单人对市场情况的解读,认为有必要使用冰山订单而做出的判断。需要强调的是,使用冰山订单并不是没有代价的,因为你隐藏了真实的需求,在屏蔽掉潜在的攻击者的同时,也屏蔽掉了真正的交易者!而且会使得成交时间显著增加--因为没人知道你想买/卖这么多,你只能慢慢等待对手盘的出现。所以当有人下决定发出冰山订单的时候,也会有对市场情况的考虑,只有合适的时机才会做这种选择。&br&&br&什么是合适的时机?有一些数据应该是相关的,比如买卖价差spread,买单量对卖单量的比值等。对这些数据,你可以在历史数据上做回归分析,建立起他们和冰山订单之间的线性/非线性模型。通过历史数据训练出来的这个模型,就可以作为你在实时交易时使用的冰山订单探测器。这是 &a href=&//link.zhihu.com/?target=http%3A//www.tinbergen.nl/%7Esofie2012/papers/HautschHuang2012.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&On the Dark Side of the Market: Identifying and Analyzing Hidden Order Placements&/a& 这篇论文使用的方法。&br&&br&基本模型可以定义为:F(spread,bidSize/offerSize,……) = Probability(Iceberg)&br&&br&如果你想玩高深的,还可以在此基础上做HMM,SVM,神经网络之类的高级模型,但基本思路是一致的:通过盘口分析计算存在冰山订单的概率。&br&&br&~~~~~~~~~~~~~~~~~~&br&&br&上面说的这个方法,看起来很高级,实际效果如何呢?我想大家也看出来了,这种建模不是很精确。作为事后分析手段用来说明什么情况下可能会出现冰山订单还不错,但是作为实时交易的探测器就不是很放心。因为使用的信息太模糊了,而且说到底建模的对象只是一种相关性,没有什么保证冰山订单的发送者一定是按照这个逻辑出牌的。&br&&br&所以接下来介绍的,才是真正具有高频玩家神采的方法,来自 &a href=&//link.zhihu.com/?target=http%3A//www.iijournals.com/doi/abs/10.3905/jot..068%23sthash.rg6lIM8a.dpbs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Prediction of Hidden Liquidity in the Limit Order Book of GLOBEX Futures&/a& 这篇论文。&br&&br&~~~~~~~~~~~~~~~~~~&br&&br&高频世界里,有一条永恒的建模准则值得铭记:先看数据再建模。如果你看了上面的介绍就开始天马行空的思考数学模型,那基本上是死路一条。我见过很多年轻人,特别有热情,一上来就开始做数学定义,然后推导偏微分方程,数学公式写满一摞纸,最后一接触数据才发现模型根本行不通,这是非常遗憾的。&br&&br&而看了数据的人会怎么样呢?他很可能会发现,对于冰山订单的处理,交易所的规则是非常值得寻味的。有的交易所是这样做的:一个冰山订单包含两个参数,V表示订单总量,p表示公开显示的量。比如V=100,p=10的冰山单,实际上隐藏的量是90。如果有针对这个订单的交易发生,比如交易量10,交易所会顺序发出三条信息:&br&&ol&&li&成交10&/li&&li&Order Book的Top bid size -10&/li&&li&新Bid +10&/li&&/ol&这三条信息一定会连续出现,并且第三条和第一条的时差dt很小。这样做的原因是尽管冰山订单存在隐藏量,但是每次的交易只能对显示出的量(p)发生,p被消耗掉以后,才会从剩余的隐藏量中翻新出一分新的p量。这样,每个人从交易所收到的信息仍然可以在逻辑上正确的更新Order Book,就好像冰山订单并不存在一样。&br&&br&因此,一旦在数据中观察到这个规律,我们就可以非常有把握的判定市场中存在冰山订单,并且连p的值都可以确定!接下来的关键问题是,如何确定V的值,即判断这个冰山订单的剩余存量有多少?&br&&br&这个问题从本质上说没法精确求解,因为V和p都是由下单人自己决定的,可以是任意值。但可以从两点考虑:第一,两个值都是整数;第二,人类不是完美的随机数生成器,下决定会遵循一定规律。&br&&br&从这两点出发,可以对V和p建立概率模型,即计算一个给定的(V,p)值组合出现的概率是多少?这里不去深入探讨数学分析,感兴趣的朋友可以自己去看原文。简单说,可以在历史数据上通过kernel estimation技术来估算他们的概率密度函数的形状。顺带一提,如果你亲手编写过这种估算程序,就会理解我为什么在“&a href=&http://www.zhihu.com/question//answer/& class=&internal&&要想成为一名优秀的 Quant 需要什么样的编程水平?&/a&”这个答案中如此强调编程的重要性。在数据上估算出来的概率密度函数可能会是这样的:&br&&figure&&img src=&https://pic4.zhimg.com/50/fb5ec7fd15b695_b.jpg& data-rawwidth=&825& data-rawheight=&559& class=&origin_image zh-lightbox-thumb& width=&825& data-original=&https://pic4.zhimg.com/50/fb5ec7fd15b695_r.jpg&&&/figure&&br&这样,当你在实时数据中观测到一个p的值时,就可以得出对应的V值的条件概率密度函数,即上图的一个切面,比如(p = 8):&br&&figure&&img src=&https://pic4.zhimg.com/50/13e890f9cc1d8ecbd6a78ed8f38044e8_b.jpg& data-rawwidth=&468& data-rawheight=&293& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic4.zhimg.com/50/13e890f9cc1d8ecbd6a78ed8f38044e8_r.jpg&&&/figure&&br&接下来显然就很容易计算V最可能是什么值了。这条函数曲线还有一个重要的作用是帮助你动态评估剩余存量,比如当你观察到已经有5份p被消耗掉,即可推出V&=40,由上图即可推出新的V值和剩余存量(V-5p)。&br&&br&综上,算法的核心在于,通过在实时数据中监测短时间内连续出现的三条相关记录判断冰山订单的存在,而对冰山订单的量化则通过由历史数据训练出的概率模型来完成。&br&&br&相信你也会看出,这种算法并不是什么作弊神器。它只是利用市场上的公开数据所做的一种推测。而且这个推测也仅仅是基于概率的,更多的应该是作为一种参考。它对做市商这种流动性提供者很有意义,可以使他们避免因为对局势的误判而遭受损失。但如果你想用它来作为一种攻击手段,觉得自己能发现隐藏大单而去Front run,那实在是很不明智的选择。&br&&br&最后,这种算法也只是针对特定的交易所。其他的交易所也许不会采用同样的冰山订单处理方式。所以真正有价值的是这种从实际数据出发的建模思路,具体的算法并不值钱。&br&&br&~~~~~~~~~~~~~~~~~~&br&&br&这个小算法给你展示了高频交易领域的“冰山一角”。它看起来也许不算很复杂,但是我却很喜欢。因为它清晰地展示了什么叫做先有思路,再有量化。因为有“冰山订单”这样一个从经济学基本的供需关系出发的真实需求,通过分析实际数据找到一丝线索,最后通过数学模型刻画出定量的策略,这才是漂亮的策略研发。&br&&br&如果违背这个原则,一上来就去搬各种高级的模型去套数据,指望模型自动给你生成交易信号,这在我看来无异于痴人说梦。遗憾的是,这个梦的确太过诱人,而这个世界也从来不缺少莽夫。&br&&br&且行且珍惜。
对题目中提到的“冰山算法”,我刚好有一些了解,可以给大家讲讲。很多人对“量化交易”的理解实在太过片面,基本上把它等同于生钱工具,我不赞同这种观点。交易首先是交易本身,有它自身的经济学意义,忽略这一点而单纯把它看成使钱增值的数字游戏,很容易…
&h2&凯利公式志在解决的问题&/h2&&p&假设赌局1:你赢的概率是60%,输的概率是40%。赢时的净收益率是100%,输时的亏损率也是100%。也即,如果赢,那么你每赌1元可以赢得1元,如果输,则每赌1元将会输掉1元。赌局可以进行无限次,每次下的赌注由你自己任意定。问题:假设你的初始资金是100元,那么怎么样下注,即每次下注金额占本金的百分之多少,才能使得长期收益最大?&/p&&p&对于这个赌局,每次下注的期望收益是下注金额的60%*1-40%*1=20%,期望收益为正。也就是说这是一个对赌客占优的赌局,而且占得优势非常大。&br&&/p&&p&那么我们应该怎么样下注呢?&/p&&p&如果不进行严密的思考,粗略的想象一下,我们会觉得既然我每次赌的期望收益是20%,那么为了实现长期的最大收益,我应该在每次赌博中尽量放入更多比例的本金。这个比例的最大值是100%。&/p&&p&但是显然每一局赌博都放入100%的本金是不合理的,因为一旦哪一次赌博赌输了,那么所有的本金就会全部输光,再也不能参加下一局,只能黯然离场。而从长期来看,赌输一次这个事件必然发生,所以说长期来看必定破产。&/p&&p&所以这里就得出了一个结论:只要一个赌局存在一下子把本金全部输光的可能,哪怕这个可能非常的小,那么就永远不能满仓。因为长期来看,小概率事件必然发生,而且在现实生活中,小概率事件发生的实际概率要远远的大于它的理论概率。这就是金融学中的肥尾效应。&/p&&p&继续回到赌局1。&/p&&p&既然每次下注100%是不合理的,那么99%怎么样。如果每次下注99%,不但可以保证永远不会破产,而且运气好的话也许能实现很大的收益。&/p&&p&实际情况是不是这个样子呢?&/p&&p&我们先不从理论上来分析这个问题,我们可以来做个实验。我们模拟这个赌局,并且每次下注99%,看看结果会怎么样。&/p&&p&这个模拟实验非常的简单,用excel就能完成。请看下图:&figure&&img src=&https://pic4.zhimg.com/b67c9c393a25000dee37d8a23c8d088b_b.jpg& data-rawwidth=&374& data-rawheight=&219& class=&content_image& width=&374&&&/figure&&/p&&p&如上图,第一列表示局数。第二列为胜负,excel会按照60%的概率产生1,即60%的概率净收益率为1,40%的概率产生-1,即40%的概率净收益为-1。第三列为每局结束时赌客所有的资金。这个实验每次下注仓位是99%,初始本金是100,分别用黄色和绿色标出。&/p&&p&大家从图中可以看出,在进行了10局之后, 10局中赢的局数为8,比60%的概率还要大,仅仅输了两次。但即使是这样,最后的资金也只剩下了2.46元,基本上算是输光了。&/p&&p&当我把实验次数加大,变成1000次、2000次、3000次……的时候,结果可想而知了,到最后手中的资金基本上是趋向于0。&/p&&p&既然99%也不行,那么我们再拿其他几个比例来试试看,看下图:&figure&&img src=&https://pic4.zhimg.com/df24f593f4a3c88b78f3_b.jpg& data-rawwidth=&690& data-rawheight=&153& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&https://pic4.zhimg.com/df24f593f4a3c88b78f3_r.jpg&&&/figure&&/p&&p&从图中可以看出,当把仓位逐渐降低,从99%,变成90%,80%,70%,60%的时候,同样10局的结果就完全不一样了。从图中似乎可以看出随着仓位逐渐的变小,在10局之后的资金是逐渐变大的。&/p&&p&大家看到这里,就会渐渐的发现这个赌局的问题并不是那么简单的。就算是赌客占优如此之大的赌局,也不是随随便便都能赢钱的。&/p&&p&那么到底怎么下注才能使得长期收益最大呢?&/p&&p&是否就像上图所显示的那样,比例越小越好呢?应该不是,因为当比例变成0的时候显然也不能赚钱。&/p&&p&那么这个最优的比例到底是多少呢?&/p&&p&这就是著名的凯利公式所要解决的问题!&/p&&br&&h2&凯利公式介绍&figure&&img src=&https://pic4.zhimg.com/26657d7bdeaeba26ccc3_b.png& data-rawwidth=&569& data-rawheight=&190& class=&origin_image zh-lightbox-thumb& width=&569& data-original=&https://pic4.zhimg.com/26657d7bdeaeba26ccc3_r.jpg&&&/figure&&/h2&&p&其中f为最优的下注比例。p为赢的概率。rw是赢时的净收益率,例如在赌局1中rw=1。rl是输时的净损失率,例如在赌局1中rl=1。注意此处rl&0。&/p&&p&根据凯利公式,可以计算出在赌局1中的最有利的下注比例是20%。&/p&&p&我们可以进行一下实验,加深对这个结论的理解。&/p&&p& 如图,我们分别将仓位设定为10%,15%,20%,30%,40%。他们对应的列数分别是D、E、F、G、H。&/p&&p&当我把实验次数变成3000次的时候,如下图:&figure&&img src=&https://pic3.zhimg.com/956f8f6dabf02ad25d8b06c793d7e8ca_b.jpg& data-rawwidth=&690& data-rawheight=&178& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&https://pic3.zhimg.com/956f8f6dabf02ad25d8b06c793d7e8ca_r.jpg&&&/figure&&/p&&p&当我把实验次数变成5000次的时候,如下图:&figure&&img src=&https://pic4.zhimg.com/46c65fd4a18caa51d5d599e2de48db2f_b.jpg& data-rawwidth=&690& data-rawheight=&191& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&https://pic4.zhimg.com/46c65fd4a18caa51d5d599e2de48db2f_r.jpg&&&/figure&&/p&&p&大家从两幅图中可以看到F列对应的结果最大,和其它列相比压根就不是一个数量级的。而F列对应的仓位比例正是20%。&/p&&p&大家看到凯利公式的威力了吧。在上面的实验中,如果你不幸将比例选择为40%,也就是对应H列,那么在5000局赌博之后,你的本金虽然从100变成了,收益巨大。但是和20%比例的结果相比,那真是相当于没赚钱。&/p&&p&这就是知识的力量!&/p&&br&&br&&h2&凯利公式理解&/h2&&p&凯利公式的数学推导及其复杂,需要非常高深的数学知识,所以在这里讨论也没有什么意义。哎,说白了其实就是我也看不大懂。在这里我将通过一些实验,加深大家对凯利公式主观上的理解。&/p&&p&我们再来看一个赌局。赌局2:你输和赢的概率分别是50%,例如抛硬币。赢的时候净收益率为1,即rw=1,输的时候净损失率为0.5,即rl=0.5。也就是说当你每赌一元钱,赢的时候你能再赢1元,输的时候你只要付出去5毛。&/p&&p&容易看出赌局2的期望收益是0.25,又是一个赌客存在极大优势的赌局。&/p&&p&根据凯利公式,我们可以得到每局最佳的下注比例为:&figure&&img src=&https://pic3.zhimg.com/2eec8b2c8e003b78e286_b.png& data-rawwidth=&370& data-rawheight=&100& class=&content_image& width=&370&&&/figure&也就是说每次把一半的钱拿去下注,长期来看可以得到最大的收益。&/p&&p&下面我要根据实验得出平均增长率r的概念。首先来看实验2.1,如下两张图:&figure&&img src=&https://pic2.zhimg.com/80dfdf092802dbc4cc55_b.png& data-rawwidth=&608& data-rawheight=&186& class=&origin_image zh-lightbox-thumb& width=&608& data-original=&https://pic2.zhimg.com/80dfdf092802dbc4cc55_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/b1634badfe8a4d1b480f5_b.png& data-rawwidth=&611& data-rawheight=&190& class=&origin_image zh-lightbox-thumb& width=&611& data-original=&https://pic2.zhimg.com/b1634badfe8a4d1b480f5_r.jpg&&&/figure&&/p&&p&这两张图都是模拟赌局2做的实验,在第二列的胜负列中,实验会50%的概率产生1,表示盈利100%。50%的概率产生-0.5,表示亏损50%。第三第四列分别是在仓位为100%和50%下每次赌局之后所拥有的资金。&/p&&p&仔细对比两张图可以发现结论一,亦即在经过相同次的局数之后,最后的结果只与在这些局数中赢的局数的数量和输的局数的数量有关,而与在这些局数中赢的局和输的局的顺序无关。例如在上两幅图中,同样进行了4局,同样每幅图中赢了两局输了两局,但是第一张图的输赢顺序是赢输输赢,第二张图的输赢顺序是输赢赢输。它们最终的结果都是一样的。&/p&&p&当然这个结论非常容易证明(乘法交换律,小学生就会),这里就不证明了,上面举的两个例子足够大家很好的理解。&/p&&p&那么既然最终的结果和输赢的顺序无关,那么我们假设赌局2如实验2.2一样进行下去,看下图:&figure&&img src=&https://pic3.zhimg.com/e08c7b3b5a4b079e2d8da_b.png& data-rawwidth=&503& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&https://pic3.zhimg.com/e08c7b3b5a4b079e2d8da_r.jpg&&&/figure&&/p&&p&我们假设赌局的胜负是交替进行的,由于结论一,从长期来看这对结果资金没有任何影响。&/p&&p&在自己观察图片之前我们先做一个定义。假设将某几局赌局视为一个整体,这个整体中各种结果出现的频率正好等于其概率,并且这个整体的局数是所有满足条件整体当中局数最小的,那么我们称这个整体为一组赌局。例如在上图的实验中,一组赌局就代表着进行两局赌局,其中赢一次输一次。&/p&&p&仔细观察上图中蓝色标记的数字,它们是一组赌局的结尾。你会发现这些数字是保持着稳定的增长的。当仓位是100%时,蓝色标记数字的增长率是0%,即一组赌局之后本金的增长率为0%。这也解释了当每次都满仓下注的时候,在赌局2中长期来看是无法赚钱的。当仓位是50%(即凯利公式得出的最佳比例)时,蓝色标记数字的增长率是12.5%,即一组赌局之后本金的增长率为12.5%。&/p&&p&这是一个普遍的规律,每组赌局之后的增长率与仓位有关。且每组赌局之后的增长率越大,那么长期来看最终的收益也就越多。&/p&&p&根据每组赌局的增长率可以计算出每个赌局的平均增长率g。在上面的图中,每组赌局之中包含两个赌局,那么每个赌局的平均增长率&figure&&img src=&https://pic4.zhimg.com/67cd0cb8f20a82b24030bbb3c585caf3_b.png& data-rawwidth=&283& data-rawheight=&39& class=&content_image& width=&283&&&/figure&其实这个r是可以通过公式算出来的。&figure&&img src=&https://pic4.zhimg.com/a0d4426eab5a6277187dec_b.png& data-rawwidth=&676& data-rawheight=&123& class=&origin_image zh-lightbox-thumb& width=&676& data-original=&https://pic4.zhimg.com/a0d4426eab5a6277187dec_r.jpg&&&/figure&&/p&&p&从长期来看,想要让资本得到最大的增长,其实只要让r最大,也即让g最大化。而最佳下注比例f其实也是通过求解max(g)的出来的。&/p&&br&&h2&凯利公式其他结论——关于风险&figure&&img src=&https://pic4.zhimg.com/d42830ffd33bf71c0993_b.jpg& data-rawwidth=&690& data-rawheight=&162& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&https://pic4.zhimg.com/d42830ffd33bf71c0993_r.jpg&&&/figure&&/h2&&br&&h2&凯利传奇(本节内容来自互联网)&/h2&&p&凯利公式最初为 AT&T 贝尔实验室物理学家约翰·拉里·凯利根据他的同僚克劳德·艾尔伍德·夏农于长途电话线杂讯上的研究所建立。凯利解决了夏农的资讯理论要如何应用于一名拥有内线消息的赌徒在赌马时的问题。赌徒希望决定最佳的赌注金额,而他的内线消息不需完美(无杂讯),即可让他拥有有用的优势。凯利的公式随后被夏农的另一名同僚爱德华·索普应用于二十一点和股票市场中。&/p&&p&索普利用工作之余,通过数个月的艰苦演算,写了一篇题为《“二十一点”优选策略》的数学论文。他利用自己的知识,一夜之间“奇袭”了内华达雷诺市所有的赌场,并成功的从二十一点赌桌上赢得了上万美元。他还是美国华尔街量化交易对冲基金的鼻祖,70年代首创第一个量化交易对冲基金。1962年出版了他的专著《打败庄家》,成为金融学的经典著作之一。&/p&&br&&h2&运用展望&/h2&&p&如何利用凯利公式在现实生活中赚钱?那就是要去创造满足凯利公式运用条件的“赌局”。在我看来,这个“赌局”一定是来自金融市场。&/p&&p&近期我一直在做交易系统的研究,对于一个优秀的交易系统来说什么是最重要的?一个期望收益为正的买卖规则占到重要性的10%,而一个好的资金控制方法占到了重要性的40%,剩下的50%是操控人的心理控制力。&/p&&p&而凯利公式正是帮助我进行资金仓位控制的利器。&/p&&p&比如说之前我研究出的一个股票交易系统,该系统每周进行一次交易,每周交易成功的概率是0.8,失败的概率是0.2。当成功的时候可以赚取3%(扣掉佣金,印花税),每次失败时亏损5%。在不知道凯利公式之前,我都是盲目的满仓交易,也不知道我这个仓位设定的对不对,心理很虚。在运用凯利公式之后,计算的最佳的仓位应该是9.33,就是说如果借款利率是0的话想要得到最快的资金增长速度就要使用杠杆交易,通过公式计算得到每次交易的平均增长率r约等于7.44%,而满仓交易的平均资金增长率为r约等于 1.35(其实也就是期望收益)。通过实验模拟之后也发现确实杠杆交易比满仓交易资金增长的速度要快的多。这也让我更好的理解了为什么很多量化投资基金公司需要使用杠杆交易。&/p&&p&当然凯利公式在实际的运用中不可能这么的简单,还有很多的困难需要克服。比如说杠杆交易所需要的资金成本,比如说现实中资金并不是无限可分的,比如说在金融市场并不像上文提到的简单的赌局那么简单。&/p&&p&但是不管怎么样,凯利公式为我们指明了前进的道路。&/p&
凯利公式志在解决的问题假设赌局1:你赢的概率是60%,输的概率是40%。赢时的净收益率是100%,输时的亏损率也是100%。也即,如果赢,那么你每赌1元可以赢得1元,如果输,则每赌1元将会输掉1元。赌局可以进行无限次,每次下的赌注由你自己任意定。问题:假设你…
&p&作者:&a href=&https://www.zhihu.com/people/fd7c571a0ada1a72e42e8d& class=&internal&&@萧井陌&/a&, &a href=&https://www.zhihu.com/people/d2facf05b31ad4& class=&internal&&@Badger&/a&&/p&&ul&&li&自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0&/li&&li&&a href=&http://link.zhihu.com/?target=http%3A//cocode.cc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CoCode&/a&:一个让大家学习、成长、相聚并获得乐趣的技术社区&/li&&li&答疑邮箱: xiao. (&a href=&https://www.zhihu.com/people/fd7c571a0ada1a72e42e8d& class=&internal&&@萧井陌&/a&&/li&&li&编程入门指南学习群:&a href=&http://link.zhihu.com/?target=https%3A//jq.qq.com/%3F_wv%3DD4AoJu1a& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&/a&&/li&&/ul&&p&---&/p&&br&&p&日 v1.5 更新&/p&&p&日 v1.4 更新&/p&&p&日 v1.3 更新&/p&&p&日 v1.2 更新&/p&&p&日 v1.1 更新&/p&&p&日 v1.0 更新&/p&&p&---&/p&&br&&p&文章结构:&/p&&ul&&li&o 前言&/li&&li&o 心态调整&/li&&ul&&li&o 确定目标&/li&&li&o 不要浮躁&/li&&li&o 培养兴趣&/li&&li&o 开始学习&/li&&li&o 令人警醒的故事&/li&&li&o 警醒后的反思&/li&&li&o 启蒙&/li&&li&o 入门&/li&&ul&&li&? 计算机系统基础&/li&&li&? 数据结构与算法基础&/li&&li&? 编程语言基础&/li&&li&? 其他&/li&&/ul&&li&o 小结&/li&&li&o 后记&/li&&/ul&&br&&ul&&li&o 附录&/li&&li&o @萧井陌 的编程类回答汇总&/li&&li&o ...&/li&&/ul&&/ul&&p&---&/p&&br&&p&&b&前言&/b&&/p&&p&如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容;作为创业者,技术创始人的身份则会让你的很多工作显得更容易。而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始;入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步;你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目;你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么。&/p&&p&这篇文章的内容对此不仅会有一些方向性的建议,还会包含一个&b&基础核心向&/b&的编程入门导引。当然,Step by Step 的路线是不现实的,并且每个人都会有自己的特点,所以给出的这个编程入门导引更多的是为了引发读者的思考,最终帮助你形成适用于自己的学习路线。&/p&&p&但要注意:这篇文章是写给那些真心想学编程的人看的——那些憋着一股狠劲儿,一定要做出个什么真东西,不学好不罢休的人;而不是那些「听说编程好玩」的人,在我看来,这种人永远都入不了编程的门,更别提做出个像样的东西来了。&/p&&p&---&/p&&p&「Disclaimer」: 虽然整篇文章的基调都是所谓的「Strong Opinions, Weakly Held」,但读者还是应该像怀疑身边所有东西那样 怀疑我们所写内容的准确性。若有任何相关疑问欢迎在知乎或技术社区 &a href=&http://link.zhihu.com/?target=http%3A//cocode.cc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CoCode&/a& 公开讨论。&/p&&br&&p&&b&心态调整&/b&&/p&&p&&b&确定目标&/b&&/p&&p&在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏? iOS 或者 Android 应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。&/p&&p&这段视频也许能给你启发:&a href=&http://link.zhihu.com/?target=http%3A//v.youku.com/v_show/id_XNTIzNzE2NzQ4.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What Most Schools Don't Teach&/a&&/p&&p&&b&不要浮躁&/b&&/p&&p&Bad programming is easy. Even Dummies can learn it in 21 days. Good programming requires thought, but everyone can do it and everyone can experience the extreme satisfaction that comes with it.&/p&&p&不管是在线下还是线上的书店,满目都是《21天学通 X》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。Matthias Felleisen 在他的著作 &a href=&http://link.zhihu.com/?target=http%3A//www.ccs.neu.edu/home/matthi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How to Design Programs&/a& 一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。&/p&&p&所谓的「捷径」或者说「&a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/No_Silver_Bullet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&银弹&/a&」是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的「十年磨一剑」,所以不用着急,功不唐捐。&/p&&p&&b&培养兴趣&/b&&/p&&p&Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.&/p&&p&– &a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Linus_Torvalds& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linus Torvalds&/a&&/p&&p&沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。&/p&&br&&p&&b&开始学习&/b&&/p&&p&&b&令人警醒的故事&/b&&/p&&p&刚上初中时我便开始了编程学习,很不幸,我读完了好几本当时普遍存在的诸如《21天精通C++》这类的垃圾书,当时读完也无大碍,甚至还能写点小程序。但是软件出故障了我不知道为什么,稍显庞大的编程问题无从下手,碰到现有的库做不到的事也只能两手一摊。虽然我每天不停地编码,但我发现自己的编程能力却是提高的如此缓慢,对于「迭代」与「递归」的概念只有极其有限的了解,可以说只是把计算机当成了计算器来使用。&/p&&p&进入大学后,我主修了物理学,最初的一段时间里我一直在记忆背诵那些物理公式,却不理解她们是如何得出的,她们之间有什么联系,亦或是她们的意义。我不停地学习如何计算解答一些常见的物理问题,却对在这些 How 背后的 Why 一无所知。&/p&&p&而在我尝试做一些基于物理行为的电脑游戏时我再次遇到了之前的的困难:面对新问题时无从下手,面对新问题时的恐惧不断累积滋生,我开始主动逃避,不去真正地理解,而是幻想能通过Google搜索复制粘贴代码解决问题。幸运的是,大二时的一堂课完全改变了我的学习方法。那是第一次我有了「开天眼」的感觉,我痛苦地意识到,我对一些学科只有少的可怜的真正的理解,包括我主修的物理与辅修的计算机科学。&/p&&p&关于那堂课:那时我们刚刚学习完电学和狭义相对论的内容,教授在黑板上写下了这两个主题,并画了一根线将他们连了起来。「假设我们有一个电子沿导线以相对论级别的速度移动…」,一开始教授只是写下了那些我们所熟悉的电学与狭义相对论的常见公式,但在数个黑板的代数推导后,磁场的公式神奇的出现了。虽然几年前我早已知道这个公式,但那时我根本不知道这些现象间的有着这样潜在的联系。磁与电之间的差别只是「观察角度」的问题,我猛然醒悟,此后我不再仅仅追求怎么做 (How),我开始问为什么 (why),开始回过头来,拾起那些最基础的部分,学习那些我之前我本该好好学的知识。这个回头的过程是痛苦的,希望你们能就此警醒,永远不要做这种傻事。&/p&&p&&b&警醒后的反思&/b&&/p&&figure&&img data-rawheight=&326& src=&https://pic1.zhimg.com/c158c3a0fc25db6ce30774_b.png& data-rawwidth=&600& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/c158c3a0fc25db6ce30774_r.jpg&&&/figure&&br&&p&这幅图取自 Douglas Hofstadter 的著作 &a href=&http://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/G& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&G?del, Escher, Bach&/a&。图中的每一个字母都由其他更小的字母组成。在最高层级,我们看的是 &MU&,M 这个字母由三个 HOLISM (&a href=&http://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E6%%25E5%%25E8%25A7%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&整全观&/a&)构成,U则是由一个 REDUCTIONISM (&a href=&http://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%5BF%5E5%2525& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&还原论&/a&)构成,前者的每一个字母都包含后者的后者整个词,反之亦然。而在最低层级,你会发现最小的字母又是由重复的 &MU& 组成的。&/p&&p&每一层次的抽象都蕴含着信息,如果你只是幼稚地单一运用整体论在最高层级观察,或运用还原论观察最低层级,你所得到的只有 &MU& (在一些地区的方言中 mu 意味着什么都没有)。问题来了,怎样才能尽可能多的获取每个层级的信息?或者换句话说,该怎样学习复杂领域(诸如编程)包含的众多知识?&/p&&p&教育与学习过程中普遍存在一个关键问题:初学者们的目标经常过于倾向&a href=&http://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E6%%25E5%%25E8%25A7%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&整全观&/a&而忽略了基础,举个常见的例子,学生们非常想做一个机器人,却对背后的&/p&&p&理解物理模型 → 理解电子工程基础 → 理解伺服系统与传感器 → 让机器人动起来&/p&&p&这一过程完全提不起兴趣。&/p&&p&在这里对于初学者有两个大坑:&/p&&ol&&li&1 如果初学者们只与预先构建好的「发动机和组件」接触(没有理解和思考它们构造的原理),这会严重限制他们在将来构建这些东西的能力,并且在诊断解决问题时无从下手。&/li&&li&2 第二个坑没有第一个那么明显:幼稚的「整体论」方法有些时候会显得很有效,这有一定的隐蔽性与误导性,但是一两年过后(也许没那么长),当你在学习路上走远时,再想回过头来「补足基础」会有巨大的心理障碍,你得抛弃之前自己狭隘的观念,耐心地缓步前进,这比你初学时学习基础知识困难得多。&/li&&/ol&&p&但也不能矫枉过正,陷入还原论的大坑,初学时便一心试图做宏大的理论,这样不仅有一切流于理论的危险,枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。&/p&&p&为了更好理解,可以将学习编程类比为学习厨艺:你为了烧得一手好菜买了一些关于菜谱的书,如果你只是想为家人做菜,这会是一个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更大的野心,真的想在朋友面前露一手,做一些独一无二的美味佳肴,甚至成为「大厨」,你必须理解这些菜谱背后大师的想法,理解其中的理论,而不仅仅是一味地实践。但是如果你每天唯一的工作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为一个糟糕的厨子,甚至永远成为不了厨子,因为看了几天书后你就因为枯燥放弃了厨艺的学习。&/p&&p&总之,编程是连接理论与实践的纽带,是&a href=&http://link.zhihu.com/?target=http%3A//zh.wikip& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机科学&/a&与计算机应用技术相交融的领域。正确的编程学习方法应该是:通过自顶而下的探索与项目实践,获得编程直觉与推动力;从自底向上的打基础过程中,获得最重要的通用方法并巩固编程思想的理解。&/p&&p&作为初学者,应以后者为主,前者为辅。&/p&&p&&b&启蒙&/b&&/p&&p&「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?&/p&&p&编程知识的金字塔底部有三个关键的部分:&/p&&ol&&li&o 算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个 maxSoFar 变量,之后对于每个数…&/li&&li&o 语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。&/li&&li&o 系统基础:为什么 while(1) 时线程永远无法结束?为什么 int *foo() { int x = 0; return &x; } 是不可行的?&/li&&/ol&&p&启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。&/p&&p&因此,为了尽量最小化「语法」与「系统基础」这两部分,建议使用 Python 作为学习的第一门语言,虽然 Python 对初学者很友好,但这并不意味着它只是一个「玩具」,在大型项目中你也能见到它强大而灵活的身影。熟悉 Python 后,学习 C 语言是便是一个不错的选择了:学习 C 语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理。&/p&&p&下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整体框架,帮助你进行自顶向下的探索。下面的材料没有先后顺序,如果卡壳的话可以考虑换另一份材料。&/p&&ol&&li&o 完成 &a href=&%22&&MIT 6.00.1x&/a& (&a href=&http://link.zhihu.com/?target=http%3A//www.xuetangx.com/courses/course-v1%3AMITx%2B6_00_1x%2Bsp/about& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&麻省理工:计算机科学和 Python 编程导论&/a&)。虽然该课程的教学语言为 Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,Python 编程语言,一些简单的数据结构与算法,测试与调试。&/li&&li&o 完成 &a href=&http://link.zhihu.com/?target=https%3A//www.edx.org/course/introduction-computer-science-harvardx-cs50x& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Harvard CS50x&/a& (&a href=&http://link.zhihu.com/?target=http%3A//v.163.com/special/opencourse/cs50.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&哈佛大学:计算机科学&/a&)。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及 C, PHP, JavaScript + SQL, HTML + CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。支线任务:阅读《&a href=&http://link.zhihu.com/?target=https%3A//book.douban.com/subject//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&编码&/a&》&/li&&li&o 完成 &a href=&http://link.zhihu.com/?target=http%3A//www.liaoxuefeng.com/wiki/958fa6d3a2e542c000& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python 教程&/a&。&/li&&/ol&&br&&p&&b&入门&/b&&/p&&p&结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如 Web 开发, Android 开发,iOS 开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习&a href=&http://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E8%25AE%25A1%25E7%25AE%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机科学&/a&通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。&/p&&p&那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么 (Why) 要这样设计?,思考怎样 (How) 写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。&/p&&p&设想 :&/p&&p&X = 用于思考解决方案的时间,即「解决问题」 部分&/p&&p&Y = 用于实现代码的时间,即「利用计算机」部分」&/p&&p&编程能力 = F(X, Y) (X&Y)&/p&&p&要想提高编程能力,就得优化 X,Y 与函数 F(X, Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——&a href=&http://link.zhihu.com/?target=https%3A//github.com/sarabander/sicp-pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Structure and Interpretation of Computer Programs&/a& (SICP)《&a href=&http://link.zhihu.com/?target=https%3A//book.douban.com/subject/1148282/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机程序的构造和解释&/a&》,它为你指明了这三个变量的方向。在阅读 SICP 之前,你也许能通过调用几个函数解决一个简单问题。但阅读完 SICP 之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP 的教学语言为 Scheme,可以让你初步了解&a href=&http://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E5%2587%25BD%25E6%%25E7%25A8%258B%25E5%25BC%258F%25E8%25AA%259E%25E8%25A8%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&函数式编程&/a&。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E5%25BD%25BC%25E5%25BE%25B7%25C2%25B7%25E8%25AB%25BE%25E7%25B1%25B3%25E6%25A0%25BC& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Peter Norvig&/a& 曾经写过一篇非常精彩的 SICP &a href=&http://link.zhihu.com/?target=http%3A//www.amazon.com/review/R403HR4VL71K8/ref%3Dcm_cr_rdp_perm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&书评&/a&,其中有这样一段:&/p&&p&To use an analogy, if SICP were about automobiles, it would be for the person who wants to know how cars work, how they are built, and how one might design fuel-efficient, safe, reliable vehicles for the 21st century. The people who hate SICP are the ones who just want to know how to drive their car on the highway, just like everyone else.&/p&&p&如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点&/p&&p&虽然SICP是一本「入门书」,但对于初学者还是有一定的难度,以下是一些十分有用的辅助资源:&/p&&ol&&li&o &a href=&http://link.zhihu.com/?target=https%3A//www.udacity.com/course/cs212& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Udacity CS212 Design of Computer Program&/a&:由上文提到的Google 研究主管 Peter Norvig 主讲,教学语言为 Python,内容有一定难度。&/li&&li&o &a href=&http://link.zhihu.com/?target=http%3A//www.ccs.neu.edu/home/matthias/HtDP2e/Draft/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How to Design Programs, Second Edition&/a&:HtDP 的起点比SICP低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困难,可以考虑先读一读 HtDP。&/li&&li&o &a href=&%22ht&&UC Berkeley SICP 授课视频&/a&以及 SICP 的两位作者给 Hewlett-Packard 公司员工培训时的录像(&a href=&http://link.zhihu.com/?target=https%3A//github.com/DeathKing/Learning-SICP/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文化项目&/a&)&/li&&li&o &a href=&http://link.zhihu.com/?target=http%3A//composingprograms.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Composing Programs&/a&}

我要回帖

更多关于 python计算微积分 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信