当前位置: 华文问答 > 数码

金融专业学生如何从基础开始学习计算机?

2014-03-07数码

谢邀。

首先说一下熟练运用计算机的必要性和意义。

在这个时代,如果从事专业性较强的职业,计算机应用的熟练程度、开发水平能很大程度的影响你的思维方式的严谨性和工作生产力。

思维方式方面,直接的体现就是,分析一个项目,学习计算机编程和从事涉及编程的项目开发(例如金融中的程序化交易、量化交易或者其他涉及大量数据处理和分析的研究型项目)能培养较为严谨的系统性思维,在处理各种项目时都大有裨益。

工作生产力方面,同样是要处理几十个Excel表格,无法熟练运用的人可能在很小的问题上就卡一天解决不了,枯燥的手动操作各种复制粘贴、改来改去,上司的一个需求变动就要大动干戈重新做一遍,这样的生产力是极其低下的。目前国内据了解,可能大部分较为专业的金融从业人员都要和Excel等软件打交道,但很少能熟练运用,只知道一些最基本的功能,大部分能够通过编程或者聪明的操作方式完成的许多人还是手动完成。如果掌握了一定的编程技能,这些耗费大部分人一天甚至几周时间的琐碎的重复性工作(比如合并100个Excel表格、为2000人打印每份收信人名字都不一样但内容相同的邀请函、按照特定方式处理较大的金融数据,从400页的网页上抓取空气质量数据用来设计某种产品),到了懂编程的人手里就只要几分钟或几个小时就能完美的解决,并且遇到需求改变时也能从容淡定的换个参数重新执行即可。甚至在一些没有计算机可用的情况中,编程仍能帮你解决问题,例如让你按照名字字母顺序排序1000页文件,如果不懂任何排序算法,那么你可能会称为无头苍蝇;如果你懂得排序算法,那么你就可以手动地来模拟计算机排序算法,把这个任务按照比别人快很多倍的速度手动完成。

计算机在许多工作中都不是必要的,但很有可能帮助你大幅提升生产力。编程教会你如何思考(Programming teaches you how to think)和解决问题(problem solving)。

明确了非计算机专业的学生,尤其是金融专业的学好计算机的必要性和意义之后,我就主要讲讲我作为非计算机专业的金融学生学习计算机的经历和一些想法,希望对题主有帮助。(对故事没兴趣的直接略过,跳到最后)

我是第一批「90后」,6岁以前根本没有听说过「计算机」这种东西,或者任何相关的概念,6-7岁上小学时听说有个同学家有台「电脑」,但不知道那是什么。后来邻居家里有了台电脑,才终于见到了庐山真面目,一个笨重的显示器、主机箱、滑轮鼠标和键盘。于是我经常往隔壁家跑,和隔壁小孩在电脑上随便玩一切能玩的东西,似乎只有画图等等。那时觉得电脑是个很神奇的东西,觉得我们家里也应该有一台电脑,就跟父母说:「宁愿3个月不吃饭,也要买一台电脑」。感谢父母的远见卓识,攒了攒钱,在我9岁时家里买了一台电脑,上面装着 Windows 98,一个专业人员过来把电脑装好后我第一个做的事就是赶紧把画图打开,随便画了画,那种兴奋感无以言表。

后来,发现街上有一些卖盗版碟的小店,光盘密密麻麻的摆在两个分类中。一看光盘外包装上的画面就知道这是游戏,另一些画了一些抽象的图形的就是软件。一开始,我对软件没有什么太多概念,基本就是买点游戏盘随便装着玩。现在看起来值得庆幸的是,我没有陷入游戏世界无法自拔,处于一次偶然的想法,觉得游戏玩一玩也就那样,不如看看旁边那些「画着抽象图标的奇怪光盘」里面究竟是什么。不看不要紧,一看我就此进入了计算机和编程的世界。那时随便买了点软件光盘,里面有个叫VB6,不知道什么意思,回去电脑上装着看看。结果发现,装完打开后什么也没有,自己摸索着创建了一个「工程」,发现外面的大窗口里面居然有个小窗口,旁边的工具箱里面还有一大堆小图标。随便点了个画着按钮的小图标进去,发现居然小的窗口里面出现一个图标上画的按钮,又经过一阵摸索,发现修改Caption这个里面的内容按钮上的字就变成了修改后的内容。

双击那个按钮就切换到了另一个试图,里面是一些英文词,自己改了改都说写的错的,错误信息也不知道什么意思。后来发现这个按钮有一个属性叫作Name,胡乱实验后终于可以让点击按钮后按钮的文字变成另一串字了!这项发现对当时的我来说是个巨大的冲击,从未接触过编程的我发现,自己居然可以用代码来控制这台机器中的窗口和里面显示的东西。后来又拖了个进度条进去,想写一个跟「复制文件」窗口差不多的进度条不断增加的那样一种小程序。东凑西凑,终于把计时器(Timer)、按钮(Button)、进度条(ProgressBar)凑到一起,自己发现了 x = x + 1 这样的方式能让进度条的值增加。用Timer 0.1秒加一格进度条,终于实现了一个自动加进度条的小程序!那时还10岁的我,异常兴奋。后来就摸索的越来越多,看到微软发布了C#,觉得名字很酷,看样例代码发现跟以前用的VB代码差异很大,后来出于好奇和探索欲转换到了C#上,转换的过程很痛苦,本来VB弄得就是一知半解,大量从未听说过的概念,莫名其妙的错误。后来经常喜欢用C#做一些自己有兴趣的小东西,也逐渐开始看书,Beginner,Professional等等都看过,凡是在电脑上需要重复性工作的东西我都先考虑能不能用C#编个小程序解决。

初中一次学校比赛,每个班要制作自己的一个小网站。我用自己学得网页设计、制作、HTML, CSS用http:// ASP.NET 做了一个小网站,弄了个小空间和子域名,交给学校评比,获得了一等奖。看到其他班级做的,都还停留在FrontPage生成的、不经修饰的难看网页中,我非常得意,并且在不断地学习新东西。在这个过程中,我上了初中和高中。

后来上大学,选择了厦门大学金融系,那时并没有想读计算机专业,因为觉得计算机就像我的朋友,专门学计算机反而没意思了。上大学时,给学生机构做了个网站,给学院也做了几个网站,另外还接触到了平面设计、视频剪辑、特效等等东西,因为学院里面并没有多少这方面熟练的同学,于是得着一个计算机看起来不错的同学就拼命用,正所谓「能者多劳」,我也觉得是学点新东西的机会,于是就做了不少这方面的东西,简单地学了些Adobe Photoshop,Illustrator, After Effects, Premiere Pro等等,后来还下载了不少http:// Lynda.com 上的教学视频看看,受益颇丰。

大三时选专业,我选了金融工程专业。那时开始更多地使用Excel做财务数据的简单整理和分析(例如计算WACC, EVA,做财务预测等等),在完成课程案例项目的过程中逐渐探索和完善自己做的表格,最后形成了美观、易用、用户友好、冗余性低、灵活度高的财务分析表格。后来学习的东西涉及到了计量经济学和一些统计学模型,逐渐开始接触Matlab和R,发现国内许多老师都用Matlab,海归老师基本都用R。

在大学中,我主要的生产语言是C#,写了个基于本地网络的公司财务决策博弈的游戏,原理类似于MESE,就是服务器端程序开启一场游戏,定义经济体和多种资源数量,客户端连接到服务器端,每个客户端都代表一个公司,每一期内公司向市场买资源(实时的),可以决定借贷、建立工厂、部署生产线,每一期结束前在限定的时间内提交生产产品的数量和价格,以及推广、研发投入的决策,服务器端根据所有客户端提供的决策汇总起来根据一个自己想出来的市场模型决定下一期的劳工成本、借贷利率,并且根据需求和供给决定产品价格、各个公司售出多少,推广费用是否奏效,研发投入带来了技术提升有多少,等等,几乎给每个变量设计了内在的矛盾和博弈,例如大家推广费都很高那就没什么效果,一个公司市场份额变化与每期该公司出的推广费占所有公司推广费之和的比值成正比,等等。每期结束后服务器计算好各种数据,为每个公司形成一个财务报表发布给各个客户端,各个客户端根据这些信息再做下一期的决策。写好之后,找来一些同学测试,或者来玩。看着几个同学在绞尽脑汁设计自己的公司运营策略,我觉得很有成就感。

虽然一直紧跟着C#的发展,每出一个新版本就把新特性都学一下,比如匿名方法、Lambda expression,LINQ 等等,不断地更新自己的知识库和编程方法,逐渐形成了一套比较系统的写程序的方法。后来发现,整个计算机界还有那么多东西值得探索——算法、数据库、数据挖掘等等等等。除了 general-purpose的编程,我还使用 Mathematica 做符号运算,并且略知M的主要编程范式是函数式编程。后来看到一篇文章说C#的新特性多半来自于F#,于是出于好奇开始学F#语言,那是第一次正式接触到比较纯的「函数式编程」,觉得这个语言奇怪极了,完全不像是C/C++/Java这种体系的语言。从 imperative programming转换到functional programming是痛苦的,两者的基本方法和世界观就不太一样,一开始很不适应。后来逐渐发现函数式编程实在是妙极了,能够用简短的语言快速地解决我原来很麻烦才能解决的问题。在这些过程中,又做了些网站,但每次做都有新的进步,例如引入了MVC架构,尝试了AJAX,采用了HTML5,jQuery等等,并在这一过程中接触了更多的工具、编程语言,并且逐渐开始使用数据库来存储和调用数据,玩过SQL Server, MySQL, SQLite等等,甚至后来来自己部署了一个Hadoop(虽然没起到作用)。

===

到了现在在读的金融研究生阶段,由于更多地涉及建模和数量化的东西,更多地学习统计编程。我们时间序列分析的课程和非参数计量经济学的课程都要求用R来完成,写东西最好用LaTeX。虽然以前用R写过一点东西,不过是这些课程和一些研究项目逼得我逐渐开始使用R和学习R,并且更多地接触了背后的开源社区,逐渐发现世界上有这么一大批人,无偿的贡献自己的力量,解决各种各样的问题。开源社区的力量是无穷的。后来我也在GitHub上注册帐号,并且把自己使用一些开源项目时遇到的问题和bug用英文写成issue供大家讨论。后来在RProvider项目上(一个允许在F#中使用R函数的Type provider)发起的一个issue,项目所有者建议我改一下代码发送一个pull request,那时我还不了解Git版本控制系统的工作方式,赶紧导出找资料看什么是Git,什么是Fork, Branch, Merge, Pull, Push, Pull request等等,发现「原来这些开源项目都是这样组织起来的!」,终于明白了上百人如何同时投入一个项目的开发而不造成大量的重复劳动和冲突,明白了各种我们用的软件的项目周期是如何推进的。这些对我而言就是很有意思的。

后来,在做一些金融量化交易策略时就把这些全部都用上了。多人同时开发时用的Git版本控制和issue tracking等等大幅提高了整个团队的生产力,在R中写了很多代码,有的项目重构了很多次,慢慢积累了很多有用的扩展包,并且大量的看相关的文章和博客,还去stackoverflow提问等等,看到一个扩展包或者工具有问题或者需要改进的地方就去GitHub提出个issue建议改进并且参与讨论,或者直接自己fork发pull request。虽然这些东西更偏向计算机的东西,和我本专业并没有太大关系,但是这些东西都提供了生产力和效率。

===

故事讲了这么多,该做个总结了。

从我自己的经历来看,非计算机专业的学生想学好计算机,要么就要有很强的兴趣、探索欲,要么就要有非学好不可的压力(比如作业无法完成),两者都有是最好的,会快速提升你的技能。另外,需要有「专业化」(professionalism)的精神,就是想把事情做专业一些,做完美一些,这样你的一个项目从一开始的简陋不断完善成美观、易用、交互体验良好、背后的设计思维一致,才有动力实现,在不断追求专业化的过程中你的水平才能进步。

对于小孩而言,他们有大量的时间探索、试错、思考、查阅,这样积累起得经验是最原始的,最直觉的,我就基本属于这种情况,就是探索——学习——探索——学习的过程。对于一个成年人,可能就没有那么多精力探索自己领域以外的东西了,因此建立起直觉可能会非常耗时。想学好的唯一的秘诀就是 大量使用计算机和编程 ,所有东西都想想能不能用计算机来做,不会的东西多试验,或者多查资料,做的东西都不是做完就完了,多想想能不能改进——技术上、效率上、结构上等等,凡是能改进的全都改进,不断地改进,即使是一个Excel表格。在这个过程中,多激励自己,让自己有成就感。 只看书、只上课学而不去大量的实践做各种小项目,纯属浪费时间。

小项目从哪里来?到处都是。如果一开使做不了我本科做的那种企业经营模拟对战,可以从课本上简单的东西来。自己实现一套二叉树欧式期权定价、美式期权定价、蒙特卡罗方法欧式期权定价,美式期权定价,不断地完善并且一般化、参数化,直到能轻松地做亚式期权、百慕大期权、敲入敲出期权、障碍期权定价。写的过程自己分析、自己设计,做出来后自己调试、自己测试,千万别看别人怎么做的。完成之后,看看别人怎么做的,能吸取到哪些教训,学了哪些新东西。你的下一个小项目,水平就更高了一点。 不断地积累下去,是一切学习的秘诀。

那么,对于一个没有多少计算机基础的金融本科生,如何开始呢?我提供一些建议:

  1. 不要眼高手低,光看,不实践。把基本的办公软件学扎实,作为硕士生应该要掌握基本的LaTeX,不喜欢这套体系可以用LyX,总之文档排版系统是基本应该会用的。
  2. 开始学编程。R,Python等等都可以,把网上的简单教程看个遍,代码敲个遍,别偷懒,运行之前多预测会产生什么结果,多调整一下自己写的东西看看会产生什么不同,多思考为什么会这样。之后实现一些基本的算法,也可以实现你学的统计和计量模型,比如线性回归之类的,学一个实现一个,金融计算模型(二叉树、蒙特卡罗期权定价等等都实现一下),总之要大量写代码,遇到问题自己尝试解决,解决不了去社区看看。
  3. 学习一下数据库,推荐SQLite,免费轻量级,简单易用不用部署,在R和Python里面很方便调用。对你以后做数据密集型的研究和应用有好处,我现在做的股票数据、高频市场数据都放在SQLite数据库里面,学习一下SQL语言。
  4. 【此条仅为兴趣】如果涉及编程密集型的团队研究或者其他项目(例如设计和优化新的金融套利策略和相应的回测程序,或者开发一种最新论文中的非参数统计工具并检验),凡是有多人协作的项目,都建议学一下Git版本控制系统,开源用GitHub,闭源用Bitbucket托管你的项目,写文档、issue tracking,wiki,都让你的项目井井有条,用软件工程的方式管理各种项目,是现代项目管理基本都要涉及的。

我的其他回答已经涉及到了接下来的问题,一个金融专业的学生可能面临的和计算机相关的问题:

精于哪些软件能为求职增添优势?学习经济学需要熟悉哪些编程语言?
想从事数据分析工作,学什么软件或语言最好?
如何迅速成长成为一名数据分析师?
作为一名金融学的研究生,如果从零基础开始学量化投资,需要学哪些东西,做哪些东西?
该如何学习R语言?