當前位置: 華文問答 > 數碼

金融專業學生如何從基礎開始學習電腦?

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語言?