Alex's profileAlex: the Early BirdPhotosBlogListsMore Tools Help

Blog


    脑残的故事

    刚才听到一个脑残的故事,我也讲一个脑残的故事。

    话说一脑残的电视收不到节目,给Comcast打电话。技术人员就来了。倒腾了半天,怎么不好;给Comcast总部打电话,也没法子;跑到外面扒土找电缆,似乎也没被耗子咬过;实在没招,换个modem吧,跑回去拿了个好的来;拿modem一看,原来没接在电视上。立刻要暴打这脑残……

    脑残的故事讲完了。

    PS:发生在一个小时前,脑残是我。

    //=========================脑残分割线=======================//

    上周没有写周记,这周早点写,改过自新表示一下。

    话说上周胃病犯了,这个没来找我三年的老朋友又来了。导火线是那天老板请客吃饭,偶点了很油很酸很腻的地中海羔羊肉,希腊人吃的真讲究。主要原因是这几个月来比较忙比较累,吃饭也不太规矩。三年不被折腾了,居然没有胃药;只好忍痛去CVS买。话说买好了也不怎么疼了,唉。现在开始要乖乖的,好好吃饭,按时睡觉。但愿跟它后会无期。

    昨天老板送了一瓶Vodka作为圣诞礼物。虽然我不喝酒,这瓶子倒还真是很pp,好好,养着。

    他也算是送的及时,我下午就给他了两个终极报告。耗时两个月的交易系统初步功能测试和效果评估都很好。两年来我们的交易系统总是被别人赚钱的对象,现在,我们的系统开始挣钱了,翻身了。恩,这就是个零和游戏。

    除了这个我的主业,还花了很多时间优化公司的服务器和交易软件。昨天统计了几天来的测试结果,处理时间从最大2秒平均300毫秒,缩短到最大70毫秒平均10毫秒。公司的光缆每隔大约15毫秒从各大交易所接收数M的数据。以前要300毫秒才能处理每个周期的数据,不仅仅失去95%的交易机会,而且,我们的决策比市场实际变动慢20个周期……现在终于实现了“实时”。周二下午两点半FED宣布降息,一分钟内交易量暴涨,没有优化的系统的延时立马爬上了4秒,死机了。优化过的系统坚挺在了50毫秒,公司的利润就来了。

    美国的经济冬天啊,还冒出来一个骗了500亿美元的牛人Madoff,就为了他这个案子,美国各大交易所指数坠毁了两天。三大汽车厂也才讨100多亿,美国政府都不肯给……看看情节,就是 国内已经很久不流行的“非法集资+诈骗”。不过他以前是NASDAQ的主席还是无数慈善基金的主席,这个身份忽悠谁拿下谁。公司的第一大股东在Madoff事发东窗前几天被忽悠进去了一笔钱,还好进的晚,损失的小。老板和我们也长吁一口气。

    Anyway了,老板给大家发定心丸,we're far far better than the majority of ppl。恩,下周再上一天班,偶就去加州happy咯;老板也去Colorado滑雪。最近整个加拿大和美国北部都是暴风雪,费城没下什么雪,但也暴冷。上帝保佑下周天气好,让我顺利的逃到温暖的天堂。

    特别安慰郁闷的Amy小朋友,做事没谱的人很无解,表难过了;特别鸣谢Cathy同学的SF & LA的travel tips;特别祝贺QQ小朋友生日快乐!

    The Big Bang Theory

    Amy推荐,讲学物理的小朋友们的故事,据说跟Friends有一比;正在down,顺便推荐同仁们~~~

    CFA终于考了。完了。没有具体意义。跟Lei说,the exam time was my most time-investment on CFA ... 考的时候感觉其实还好,除了冷:暖气显然不足,加上周六费城暴冷,考场里面喷嚏此起彼伏…… 大部分题目还是多少有点会做,毕竟修过MacroEcon,MicroEcon,CorpFin,FixedIncome,Portfolio和Deriv。FSA部分不懂没办法,但多少跟CorpFin很接近;Ethics部分没仔细看过,而且我无恶不作没法按照自己的操守来推测答案,这里最惨。很郁闷的居然在Derivatives那里有几题不会,我吃饭的家伙都不精……没有像牛人用答题卡画红心,但凡是不会的题目都是题号%4(C术语,不明白的读者直接绕过)。

    工作进展。第二个产品下线,如果上次的叫S,这次代号A。加上公司的网络总算基本进入正常状态,在A的指挥下,忙碌的交易又开始了。碰巧周五收盘时候二老板先走,就让我做。一天下来2000多笔交易,PnL里面,P多数都是4位数,L不多也基本是3位数。哦,老板开心了哈~~~ 不过这个还远没有到我们期望的平均水平,还要提升。下一个项目M,也基本设计完成。就剩下一个关键部分要做Decision Making Theory,比较复杂,希望下周能够测试prototype。总之,还是顺利的朝向在2009年之前完成新交易系统的目标前进。

    考试中午休息两个小时跑出去吃饭难。考场在Philly Convention Center,对面就是Reading Terminal Market,好玩的地方啊。里面好多各国各地的食品小店,中餐就有南北两家,就在Shanghai Gourmet吃的午饭。还有旧书店,可惜考场不能带书进去。5点多考完出来,又跑进去玩。几家农产品店超级超级的便宜,可惜我搬不动,就买了一个西瓜犒赏考试的辛苦。又馋Clam Chowder了,买了一碗。还看到了Granola和黑莓,喜欢的东西,据说特别长智力,哈。

    没有了CFA,终于有自己的时间了,要看clr要看volatility pricing提升实力;要看big bang要看Madagasca2娱乐生活。今天跑出去给沄沄找barbie,第一次逛大的Toy R US,真是那个大~~~原来玩具店是这么安排的,变形金刚一排货架,星球大战一排,蜘蛛人一排,乐高一排,Barbie一排……里面购物的家长都是一车一车的装满玩具买回去。超级羡慕美国小孩子啊~~~一车的玩具~~~我多少次梦见过~~~不过也安慰一下中国小朋友,美国玩具看起来真的很弱,我们不玩的才出口到美国哈。哼,我也来炫一下我的家当:

    All

    MatchBox集合哦~~~偶按图索骥几乎找全了国内出过的每一辆~~~老妈的肩膀也来友情出镜~~~

    说起来好想念它们~~~可惜他们公司现在新的产品都很粗糙了,远达不到“既是玩具又是收藏品”的口号了。顺便感激老妈的溺爱,这些家伙不便宜~~~

    还有好多废话,不写了,有意思的就这些了。

    PS:听《小手拉大手》好感动~~~

    在C里面调用Matlab(分享一点心得,并备忘)

    似乎有位朋友很受困扰,就做了玩玩。

    申明:不代表是最好的方案,更不代表没有错误。

    由于强调必须是C而不是C++,我的那套Managed CLR就不算了。.NET提供的功能很受用啊,用.NET这个东西5分钟就搞定。

    Anyway,回到古典C。在MS Visual Studio 2008 Express下调试通过,肯定不是标准C了,个别小差异我就懒得去管了。

    Matlab提供了其他语言程序调用Matlab的功能,称为Matlab Extern,具体可见Matlab下Extern文件夹,里面甚至都有C的例子。

    例子里都有源代码,我也把我的贴在最后,就不多废话了。有兴趣的读者自己看吧。

    主要提一下,除了源代码,链接时需要添加libmat.lib, libmx.lib,libmex.lib等库(看用到哪些功能加哪些库,这些库都在Matlab\Extern\Lib下面,具体根据平台选择)。在Visual Studio里面可以添加在project里面,gcc的话应该是gcc ... lib libeng.lib ...不记得了,错了表骂我。

    玩了半个小时弄的源代码(英文弱,大家可以无视注释语句),很久不写C了:

    // Matlab4C.cpp

    #include <iostream>
    #include <cmath>
    #include <cstdlib>
    // Matlab Engine. If you want to save the labor of inputing full directory,
    just add this direction to include for the project
    #include "D:\\Matlab\\extern\\include\\engine.h"   

    // Three libraries needed for this project
    #pragma comment( lib, "D:\\Matlab\\extern\\lib\\win32\\microsoft\\msvc70\\libeng.lib" )
    #pragma comment( lib, "D:\\Matlab\\extern\\lib\\win32\\microsoft\\msvc70\\libmex.lib" )
    #pragma comment( lib, "D:\\Matlab\\extern\\lib\\win32\\microsoft\\msvc70\\libmx.lib" )

    // Just found that this is a feature not in C, but C++.
    //It doesn't matter for a C compiler, just delete this line and select proper header files
    using namespace std;

    // Well, again, in C, use main()
    int _tmain(int argc, _TCHAR* argv[])
    {
        // Matlab computing engine
        Engine * pMatlab_Engine;

        // You can add an exception handle(for C++) or an error check if the Matlab is available for calculation
        // btw, my guess is that engOpen is a COM-interop as CreateInstance, so, with a server address, we can
        // actually run Matlab engine on server. This is tentative, no test.
        pMatlab_Engine = engOpen(NULL);

        // Two matrices to play with: parInput is input; parAnswer is the calculation
        mxArray *parInput, *parAnswer;

        // Totally non-sense-made input array
        double pInputData[9] = {4.5,-5,-1,
            5.0,7.3,2.3,
            0.0,2.5,-4.4};

        // Convert our lovely array into matrix
        // Attention! C uses the row-first rule while Matlab seems to have column-first
        // Be very careful that the input might become its transpose in Matlab!!!
        parInput = mxCreateDoubleMatrix(3,3, mxREAL);

        // Oh... the nortorious memcpy ...
        // Anyway, this is a very convenient way to set up the data we want ...
        // No guarantee that this line will not destroy your memory system ...
        memcpy((char *) mxGetPr(parInput), (char *)pInputData, 9*sizeof(double));

        // Let's do something like in Matlab
        engPutVariable(pMatlab_Engine, "data", parInput);

        engEvalString(pMatlab_Engine,"ans = det(data);");

        // Of course, we can use functions in C environment instead of passing these COMMANDS into Matlab
        // There are quite a few function as mlfMTimes to use in C
        // Ref to Matlab External manual

        // Actually the result is a real number, not a matrx
        // but we don't know, or the compiler doesn't know beforehand
        parAnswer = engGetVariable(pMatlab_Engine,"ans");

        // Passing the output back to C
        // We know it's a real number, so a double pointer suffices
        double *pOutput;

        pOutput = mxGetPr(parAnswer);

        // Output stuff
        fgetc(stdin);

        printf("%d",*pOutput);

        // Close and return the resource.
        // What if you don't have this line? you might not be able to use Matlab engine untill restart
        engClose(pMatlab_Engine);

        return 0;
    }

    最后结语:Matlab跟其他编程语言的合作方式很多,两个方向都可以。此外,工业级的工程应该要做成DLL互相调用。不管了都是,后话。

    ref:

    http://www.codeproject.com/KB/cpp/matlab_c_api.aspx

    http://www.mathworks.com.au/access/helpdesk/help/pdf_doc/matlab/apiext.pdf

    http://wibirama.com/dip/wp-content/uploads/2008/11/matlab-api-to-c.ppt