顯示具有 C#程式設計 標籤的文章。 顯示所有文章
顯示具有 C#程式設計 標籤的文章。 顯示所有文章

2009年12月7日 星期一

明年度在證券基金會開課的一些想法

十一月以來在證基會的三堂課裡, 學員們最多的問題竟然是: 有沒有 Excel 的進階課程?

其實這個問題經常有學員提出來. 我原本不傾向開 Excel 的進階課, 因為從 IT人員的角度來看, Excel 的功能即使發揮到極致, 仍有一些不足的地方. 並不是說  Excel 不適合財務或交易應用, 對一般使用者而言它仍是最容易上手的工具, 但它功能的限制還是讓我在推薦給我的學員時會有一些顧慮.

今年在證基會開了八門課, 除了一門 IRS 評價之外, Excel 幾乎都只是輔助工具, 並沒有成為真正的主角. 但是由於學員多是財務背景, 資料庫和程式設計課程的確對某些人而言有難度. 所以很多學員要求開 Excel 進階與 VBA 的課程, 其實在現在的金融業是很需要的.

這幾天在規劃明年度的課程, 目前的想法大致上分三個部份:
  1. Excel進階操作及設計: 主要目標在工作簿的設計和Excel基本功能的運用, 可能會包含一些簡單的VBA. 範例為投資組合管理.
  2. Excel VBA 設計: 主要目標為 VBA 程式設計. 範例為程式交易策略.
  3. Excel 財工應用: 利用 Excel 和 VBA 解決財務工程上的一些問題.
我會陸續將課程內容發表在 blog 上. 如果有任何建議歡迎 email 給我. 謝謝.

2009年12月1日 星期二

新的亂數產生器 Mersenne Twister for Graphic Processor

寫程式經常要用到亂數, 尤其是衍生性商品的評價和風險值計算. 其實在程式語言裡所附的亂數產生器並不夠亂, 在我們一般的PC要產生真正的亂數也很困難, 比較講究的程式通常會另外製作亂數產生器, 最常用的是由日本廣島大學兩位教授發明的 Mersenne Twister. 我自己實作的 RiskLib.NET也有將它改寫為C#的版本.

Mersenne Twister 新出了利用圖形處理器GPU的平行處理版本 MTGP, 可以利用顯示卡上的處理器來做向量資料的計算, 還包含了NVIDIA CUDA的範例. Mersenne Twister 應該是很適合利用GPU來做, 只不過最近比較沒時間. 過一陣子好好來研究一下.

2009年9月8日 星期二

Regex Pattern 自動產生的結果還算是令人滿意

今天一整天還是忙著做 Regex Pattern 的產生器, 令人興奮的是, 這個 idea 似乎可行性很高.

我修改了 Test 程式, 可以自動將產生的 pattern 自動套用到資料檔上, 看看結果是什麼. 這個版本所產生出來的 pattern 雖然又臭又長, 但是的確是可行的. 我相信這個程式應用到其他相對設計比較簡單的網頁一樣是可行的.

程式輸入的資料只有網頁的原始檔, 再選擇從程式自動產生的 pattern 之後就產出資料表, 並沒有其他的資料或是選項, 當然如果加上選項效果會更好.

在產生 pattern 的過程中, 需要注意的大概就是 .. 之間的 tag 需要想辦法過濾掉, 所以我在程式裡面利用資料找到資料前後最大和最小的 tag 數, 再設計進去 pattern 產生器之中. 如果資料裡面由 tag 分隔成幾段的話, 以現在的程式就沒辦法處理. 不過這應該不是問題, 我想明天就可以處理掉這個問題.

明天想要加入 spider 功能, 讓pattern產生器大展身手一下.

附上另外幾個檔案的測試結果:



2009年9月7日 星期一

開始實作 Regex Generator

今天花了一天的時間將Regex Pattern自動產生器的構想做一個測試的小程式.
初步結果還算滿意, 但是今天只是做最簡單的部份: 將 HTML 表格的標題列抓下來.

首先把HTML網頁中的 抓下來. 一般網頁都有很多層的表格, 在此我假設最內層的表格才有包含資料. 我很偷懶地利用 Regex 把 的資料內容抓下來, 再一層一層把外層的 table 給去掉, 最後保留最內層的 內容, 再把 第一排的 抓下來當做欄位標題. 測試幾個公開資訊觀測站的網頁, 還算正常:

公司基本資料
基金基本資料

權證基本資料

接下來的工作可能就沒有那麼簡單了, 要從網頁去產生 Regex Pattern. 今天先到此為止吧.

2009年9月5日 星期六

Regular Expression Pattern 產生器的構想

使用 Regular Expression 很多年了, 一直都是用人工的方式在設計 pattern, 在證基會所講授的課程也主要著重在 pattern 的設計. 當我們希望從一個網頁去找到有用的資訊並存入資料庫時, 免不了有幾個步驟:
  1. 利用Google找到適當的網站
  2. 分析網站上有用的資訊
  3. 找出網頁設計的邏輯
  4. 設計Regular Expression patterns
  5. 設計自動化下載的流程
  6. 執行下載
但程式寫久了總免不了要問: 有沒有更懶的方式來完成這項工作? 這些工作之中花最多時間的是設計pattern, 其他的步驟大多已經有自動化的工具. 目前的 spider 功能都是將整個網頁下載到硬碟之中成為一個複本, 只能做為離線瀏覽之用, 但如果要經由資料庫的方式來使用就沒有辦法了.能不能自動產生 pattern 成了重要的問題, 如果能夠有自動產生pattern的工具, 整項工作可以利用spider技術來完成大量資料的收集.

2009年4月13日 星期一

將網站從 mojoPortal 改為 DotNetNuke

這兩天將公司的網站從 mojoPortal 改為 DotNetNuke (DNN). 原本是想 mojoPortal 是 C# 做的, 雖然功能沒那麼多, 但是我比較喜歡用 C# 而不是 VB.NET. 後來用了這一陣子, 感覺還是沒有很好, 最主要的原因是, mojoPortal有以下幾個缺點:
  • 速度太慢
  • 無法多語言
  • Google Analytics 和 SiteMeter 等網站流量統計必須以修改 skin 來完成.
DNN的功能很強, 比較之後還是將網站改為DNN. 目前也將增加英文網頁的內容, 並且把 RightPairs 和 DerivativePower 的網站整合進來. 歡迎大家光臨新的巨傑資訊網站.

2009年4月1日 星期三

在 C# 使用 Excel 函數 - Black Scholes 選擇權公式的常態分配值

最簡單的Black-Scholes選擇權評價公式有五個參數, 分別為:
  • S: 標的現貨價格 Spot
  • K: Strike 選擇權履約價 Strike
  • Vol: 標的波動率 Volatility
  • r: 無風險利率 Risk-free Rate
  • T: 到期時間 Time to Maturity
這五個參數都可以很簡單地從資料庫取得或是計算得出, 但是 Black Scholes 公式中的常態分配值 N 比較複雜, 必須要用數值方式去近似出結果. 另一種方式是直接呼叫 Excel 的函數 NormSDist(z). 要在 C# 使用 Excel 函數, 首先建立一個 Excel 的實例:

Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass();

然後建立一個 Wrapper 函數 N:

private double N(double z)
{
return excel.WorksheetFunction.NormSDist(z);
}

這樣就可以直接在 C# 的程式裡呼叫 N(z) 這個函數. 以下是示範的 Black-Scholes 選擇權評價方法:
private void BlackScholesVanillaOption(double S, double K, double Vol, double r, double T, out double call, out double put)
{
double d1 = (Math.Log(S / K) + (r + Vol * Vol) * T) / Vol / Math.Sqrt(T);
double d2 = d1 - Vol * Math.Sqrt(T);

call = S * N(d1) - K * Math.Exp(-r * T) * N(d2);
put = K * Math.Exp(-r * T) * N(-d2) - S * N(-d1);
}

2009年3月31日 星期二

C# 連結 DDE 資訊源

雖然 DDE (Dynamic Data Exchange) 已經是過時的技術, 但不可否認它仍然是跨程式間溝通最簡便的方法. 即使 .NET 早就不支援 DDE 了, 還是有很多程式提供 DDE 的連線方式, 尤其是財務投資領域的應用, 大多數的看盤軟體都還支援 DDE.

要用 .NET 程式來做 DDE 的連結, 最簡單的方法是用 NDde這個程式庫. NDde雖然有點複雜, 但比起微軟提供的 DDEML (DDE Management Library) 要好用十倍以上. 以下簡單介紹 使用NDde連接 DDE 資訊源的方法.

首先宣告 DdeClient, 使用 Connect() 方法連線, 並指定 client.Advise 事件處理程式

NDde.Client.DdeClient client = new NDde.Client.DdeClient(service, topic);
client.Connect();
client.Advise += new EventHandler(client_Advise);

其中的 service 和 topic 看使用的資訊源而定. 如果你不確定 service 和 topic 是什麼, 只要能在 Excel 用 DDE 連結, 在 Excel 的公式中就是分三個部份 =serivce|topic!item.

client_Advise 方法就是用來接收動態更新的事件. 當 DDE 資訊源有更新資料時, client_Advise 就會立刻被執行. 更新的資料就以 string 儲存在參數 e.Item 之中

void client_Advise(object sender, NDde.Client.DdeAdviseEventArgs e)
{
string item = e.Item;
// 更新資料後的處理
}


只要這兩個簡單的步驟就可以開始動態連結資訊源了, 夠簡單了吧?