Thursday, January 28, 2010

oZone3D.Net Tutorials - Vertex Buffer Objects - OpenGL VBO - Demo - GL_STREAM_DRAW GL_STATIC_DRAW GL_DYNAMIC_DRAW

oZone3D.Net Tutorials - Vertex Buffer Objects - OpenGL VBO - Demo - GL_STREAM_DRAW GL_STATIC_DRAW GL_DYNAMIC_DRAW

OpenGL Vertex Buffer Objects

By Christophe [Groove] Riccio - www.g-truc.net
And
Jerome [JeGX] Guinot - jegx[NO-SPAM-THANKS]@ozone3d.net

Initial draft: May 1, 2006

Last Update: January 7, 2007


[ Index ]

Intro | Page 1 | Page 2 | Page 3

»Next Page



2 - Practice

For each sub-part of the practice part, there is an associated class in the samples program of this document. Two other examples none described by this document show the use of VBOs with GLSL and Cg. The single goal of this class implementation is to make theses different method interchangeable.

2.1. VBO basic use as Vertex Array method (class CTest1)

To ease the understanding, let's start with an example that perfectly matches the vertex arrays features. VBOs have a similar API of texture objects for their management.

GLvoid glGenBuffers(GLsizei n, GLuint* buffers);
GLvoid glDeleteBuffers(GLsizei n, const GLuint* buffers);

buffers is an array created by the user in which the VBOs identifiers are store. n objects are created or deleted so take care of the buffers size.

Let's assume that we want to display a quad on screen using two triangles. Our sources could be for example:

static const GLsizeiptr PositionSize = 6 * 2 * sizeof(GLfloat);
static const GLfloat PositionData[] =
{
-1.0f,-1.0f,
1.0f,-1.0f,
1.0f, 1.0f,
1.0f, 1.0f,
-1.0f, 1.0f,
-1.0f,-1.0f,
};

static const GLsizeiptr ColorSize = 6 * 3 * sizeof(GLubyte);
static const GLubyte ColorData[] =
{
255, 0, 0,
255, 255, 0,
0, 255, 0,
0, 255, 0,
0, 0, 255,
255, 0, 0
};

We are using two VBOs to render this six vertices described by the previous array. Arrays are identified by POSITION_OBJECT and COLOR_OBJECT. Creation and destruction of VBOs are performed by the glGenBuffers and glDeleteBuffers functions. The function glBindBuffer allows selecting the active VBO.

static const int BufferSize = 2;
static GLuint BufferName[BufferSize];

static const GLsizei VertexCount = 6;

enum
{
POSITION_OBJECT = 0,
COLOR_OBJECT = 1
};

The C++ code to render this quad is:

glBindBuffer(GL_ARRAY_BUFFER, BufferName[COLOR_OBJECT]);
glBufferData(GL_ARRAY_BUFFER, ColorSize, ColorData, GL_STREAM_DRAW);
glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
glBufferData(GL_ARRAY_BUFFER, PositionSize, PositionData, GL_STREAM_DRAW);
glVertexPointer(2, GL_FLOAT, 0, 0);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLES, 0, VertexCount);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

glBufferData initialises data storage of VBOs. The last parameter specifies the VBO usage as it is detailed in section 1.2 and section 1.3. The list of all usages is available in section 3.1. Functions such as glColorPointer and glVertexPointer allow specifying the location where OpenGL will respectively find colours and spatial coordinates of the vertices.

The order of these three types of function is particularly important. It is intuitive that we must first select the active VBO for its setup. However, the order of glBufferData and gl*Pointer is important as well. Actually, gl*Pointer refers to the data sources of the active VBO, this source being described by glBufferData.

Remarks:

  • Often, it is better to separate the loading vertices data task and the data description task. This is for flexibility problems. The following solution is perfectly correct:
  • glBindBuffer(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
    glBufferData(GL_ARRAY_BUFFER, PositionSize, PositionData, GL_STREAM_DRAW);
    ...
    glBindBuffer(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
    glVertexPointer(3, GL_FLOAT, 0, 0);
  • When the function glBindBuffer is called with a valid VBO name, OpenGL toggle in VBO mode. To get back to the vertex array mode, we have to use glBindBuffer with the 0 value as object name.
  • The rendering is performed by one of the functions dedicated to array rendering: glDrawArrays or glMultiDrawArrays.

    In the specific case where the whole memory size of the graphic card is lower than the size we are asking to reserve for a single VBO, a GL_OUT_OF_MEMORY error is thrown and could be found with the common glGetError function.

    2.2. Indexed arrays (class CTest2)

    During the first example we have used the target GL_ARRAY_BUFFER. It is used for all types of data excepted index arrays witch have their dedicated target, GL_ELEMENT_ARRAY_BUFFER.

    Index array initialisation is done by the following code:

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[INDEX_OBJECT]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, IndexSize, IndexData, GL_STREAM_DRAW);

    It’s the part of VBO API that differs the most from vertex arrays. Essentially, it is useless to call glIndexPointer or to activate GL_INDEX_ARRAY state. If the per element rendering function is used with the null value, instead of a pointer to an index array, then the active VBO with the target GL_ELEMENT_ARRAY_BUFFER is used as an indexes source.

    The rendering is performed with one of the function dedicated to index arrays: glDrawElements, glDrawRangeElements or glMultiDrawElements.

    2.3. Interleaved arrays alternative (class CTest3)

    Update of the function glInterleavedArrays [3.4.2] has never been made since it has been included in OpenGL 1.1. This function has often been used for interleaved arrays but even if we still could use it with VBOs, there is a better option based on gl*Pointer functions. The principle is to specify for each attribute of the interleaved array the source of the data using the stride parameter.

    #pragma pack(push, 1)
    struct SVertex
    {
    GLubyte r;
    GLubyte g;
    GLubyte b;
    GLfloat x;
    GLfloat y;
    };
    #pragma pack(pop)

    glBindBuffer(GL_ARRAY_BUFFER, BufferName);
    glBufferData(GL_ARRAY_BUFFER, VertexSize, VertexData, GL_STREAM_DRAW);

    glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(SVertex), BUFFER_OFFSET(ColorOffset));
    glVertexPointer(2, GL_FLOAT, sizeof(SVertex), BUFFER_OFFSET(VertexOffset));

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_TRIANGLES, 0, VertexCount);

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    For this sample, we are using a structure which allows us to interleave vertex data. The structure previously defined is surrounded by the standard pre-processor instructions #pragma pack. In fact, if we get the size of this structure with the sizeof instruction, there are a lot of chances for the returned value to be equal to 12 or maybe 16 octets instead of 11 in this case. The common size of GLfloat is usually 4 bytes and the one of GLubyte is usually 1 byte, therefore a required size of 11 bytes. However, compilers align data in memory because processors are optimized for handling data of the same size as their registers: 4 bytes for 32 bits CPUs and 8 bytes for 64 bits CPUs. That’s a good initiative but when the memory space is expensive, it’s sometime better to forget this optimisation. Actually, in our case, the aligned structure costs 1/12 of extra memory but also 1/12 of extra data transfer to the graphic card. Finally, further problems could occur regarding the management of additional bytes, especially in this case. Where are those additional bytes?

    glColorPointer and glVertexPointer functions must always indicate the sources and the types of the data stored by the VBO. To proceed, the specifications suggest a macro called BUFFER_OFFSET:

    #define BUFFER_OFFSET(i) ((char*)NULL + (i))

    With VBOs, the purpose is not to give the address of the data source, because the source is stored somewhere by the VBO. Rather, an offset indicates where the OpenGL drivers should start reading the data in the VBO memory. In the sample, sizeof(SVertex) is the stride value. This indicates the number of bytes between two vertices for a same attribute. Usually, this value is null in order to simplify the OpenGL API. Null means that the values are adjoining, which means that the VBO contains only one single attribute per vertex and no empty room. Consequently, if we create an array that only contains the spatial 3D coordinates of the vertices, then the following function calls are equivalent:

    glVertexPointer(3, GL_FLOAT, 0, 0);
    glVertexPointer(3, GL_FLOAT, sizeof(float) * 3, 0);

    The BUFFER_OFFSET macro also allows preventing a warning about a conversion of an integer to a pointer.

    2.4. Serialized arrays (class CTest4)

    For many cases, data used to describe geometric primitives have no reason to be interleaved and it could even become a bad choice. It often happens that we just want to update a part of the data of each vertex. For example, with the case of animated meshes, like a human, texture coordinates never need to be updated but vertex positions and vertex normals have to.

    As a result, we just use one single VBO in which we insert several types of data using the glBufferSubData function.

    First, we have to reserve some memory room for the full data storage with the glBufferData function. We don’t have to pass the data source in the third parameter anymore; instead we use the 0 value.

    Then, we use the glBufferSubData function to fill the array. The second parameter is the VBO data offset. The third one indicates the size of the source data that we want to add and the last one is the data source itself.

    glBindBuffer(GL_ARRAY_BUFFER, BufferName);
    glBufferData(GL_ARRAY_BUFFER, ColorSize + PositionSize, 0, GL_STREAM_DRAW);

    glBufferSubData(GL_ARRAY_BUFFER, 0, ColorSize, ColorData);
    glBufferSubData(GL_ARRAY_BUFFER, ColorSize, PositionSize, PositionData);

    glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);
    glVertexPointer(2, GL_FLOAT, 0, BUFFER_OFFSET(ColorSize));

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_TRIANGLES, 0, VertexCount);

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    Finally, the glBufferSubData function could be used for updating just a part of the whole data, for example in case of partial animated models, or if more than one model is stored in the array, which could be very efficient.

    2.5. Vertex mapping (class CTest5)

    In some cases, we would like to avoid the use of an intermediate array to store geometry data. This could accelerate the rendering by avoiding a useless data copy. The vertex mapping uses the glMapBuffer function to access by a pointer to the memory room reserved by the VBO.

    glBindBuffer(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
    glBufferData(GL_ARRAY_BUFFER, PositionSize, NULL, GL_STREAM_DRAW);
    GLvoid* PositionBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    memcpy(PositionBuffer, PositionData, PositionSize);
    glUnmapBuffer(GL_ARRAY_BUFFER);
    glVertexPointer(2, GL_FLOAT, 0, 0);

    One more time, the glBufferData function is just used to reserve the memory room only, the initialisation is done by the programmer thank to the glMapBuffer function. There is three types of acces to VBO data: GL_WRITE_ONLY, GL_READ_ONLY and GL_READ_WRITE. Names are particularly explicit. Modes that allow reading are also very useful because they avoid data duplication for non graphical uses. The function glUnmapBuffer invalids the pointer. It’s better to call glUnmapBuffer as soon as possible because vertex mapping requires CPU and GPU synchronisation.

    When many VBOs are used, a good optimisation consists in parallel initialisation because this process decreases the number of CPU/GPU synchronisations. Here is an example:

    glBindBuffer(GL_ARRAY_BUFFER, BufferName[COLOR_OBJECT]);
    glBufferData(GL_ARRAY_BUFFER, ColorSize, NULL, GL_STREAM_DRAW);
    GLvoid* ColorBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

    glBindBuffer(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
    glBufferData(GL_ARRAY_BUFFER, PositionSize, NULL, GL_STREAM_DRAW);
    GLvoid* PositionBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

    memcpy(ColorBuffer, ColorData, ColorSize);
    memcpy(PositionBuffer, PositionData, PositionSize);

    glBindBuffer(GL_ARRAY_BUFFER, BufferName[COLOR_OBJECT]);
    glUnmapBuffer(GL_ARRAY_BUFFER);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, BufferName[POSITION_OBJECT]);
    glUnmapBuffer(GL_ARRAY_BUFFER);
    glVertexPointer(2, GL_FLOAT, 0, 0);


    2.6. Demo with a GLSL-based Animation

    This demo uses the deformation shader shown in the following tutorial:
    Mesh Deformers - Twister.


    The demo shows the use of VBOs with the GL_STATIC_DRAW mode and the box deformation is performed by a GLSL shader.

    Just for comparison, the demo is shipped in two versions: one using VBOs (XPGL_Demo_vbo.exe) and the other using regular Vertex Arrays (XPGL_Demo_va.exe).

    The following table shows us the difference of performance between VBO and Vertex Arrays (VA):

    Graphic CardXPGL_Demo_vbo.exeXPGL_Demo_va.exe
    ATI X1950XTX760 fps145 fps

    The demo uses a small library especially developped for OpenGL experimentation needs: XPGL (eXPerimental Graphics Library)

    Saturday, January 23, 2010

    OpenCL test on nVidia

    Test endian:
    typedef struct {
    uchar a,b,c,d;
    }Char4;

    Char4 y;
    y.a=1; y.b=2; y.c=3; y.d=4;
    vrState->dump[1] = *(uint *)&y;
    Output: 04030201



    char4 x=(char4)(1,2,3,4);
    vrState->dump[0] = *(uint *)&x;

    Output: 04030201
    ----
    Test structure permutation:
    typedef struct {
    unsigned char a,b,g,r;
    }Color;

    vrState->color.r = 1;
    vrState->color.g = 2;
    vrState->color.b = 3;
    vrState->color.a = 4;

    define the same structure in host. Output:
    Color rgba: 1 2 3 4

    Monday, January 18, 2010

    Words

    Tyleno - cold medicine
    sleet - be careful when driving

    Sunday, January 17, 2010

    Bootcamp PC key commands

    PC key command

    Apple external keyboard

    Built-in Mac keyboard/Apple Wireless Keyboard

    Control-Alt-Delete

    Control-Option-Fwd Delete (1)

    Control-Option-Delete

    Alt

    Option

    Option

    AltGr

    Control-Option

    Control-Option

    Backspace

    Delete

    Delete

    Delete

    Fwd Delete (1)

    Fn-Delete

    Enter

    Return

    Return

    Enter

    (numeric keypad)

    Enter

    Enter
    (with some built-in keyboards only) (2)

    Insert

    Fn-Enter or Help

    Fn-Enter

    Num lock

    Clear

    Fn-F6
    (with some built-in keyboards only) (2)

    Pause/Break

    F16

    Fn-Esc

    Print Screen

    F14

    Fn-Shift-F11

    Print active window

    Option-F14

    Fn-Shift-Option-F11

    Scroll/Lock

    F15

    Fn-Shift-F12

    Windows

    Command

    Command

    Friday, January 15, 2010

    使用 clCreateImage 需要注意的地方


    mem_volume = clCreateImage3D(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, &volume_format,
    vrParam.volSize[0], vrParam.volSize[1], vrParam.volSize[2], // unit in pixels
    vrParam.volSize[0]*sizeof tmpBlock, vrParam.volSize[0]* vrParam.volSize[1]*sizeof tmpBlock, // unit in bytes
    tmpBlock, &err);

    image_width , image_height , image_depth 的單位是 pixels
    但 image_row_pitch , image_slice_pitch 的單位是 bytes!

    此外 host_ptr 似乎要是 power of 2 in bytes. 實作中似乎並不需要

    host_ptr

    A pointer to the image data that may already be allocated by the application.
    The size of the buffer that host_ptr points to must be greater than or equal to
    image_slice_pitch * image_depth. The size of each element in bytes must be a power
    of 2. The image data specified by host_ptr is stored as a linear sequence of
    adjacent 2D slices. Each 2D slice is a linear sequence of adjacent scanlines. Each
    scanline is a linear sequence of image elements.

    Volume Rendering on OpenCL - 2

    OK I moved the same program to a PC with GF 8800 GTX
    It runs pretty fast!
    12.41 ms(80.51 fps) to render a skull ( 85x96x134 voxels) and
    29.19 ms(34.25 fps) with 169x192x268 voxels.
    The screen size is also 500x500.

    PS. the volume renderer has no lighting, no transfer function lookup.

    GPU info:
    CL_DEVICE_NAME: GeForce 8800 GTX
    CL_DEVICE_VENDOR: NVIDIA Corporation
    CL_DRIVER_VERSION: 195.62
    CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
    CL_DEVICE_MAX_COMPUTE_UNITS: 16
    CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: 3
    CL_DEVICE_MAX_WORK_ITEM_SIZES: 512 / 512 / 64
    CL_DEVICE_MAX_WORK_GROUP_SIZE: 512
    CL_DEVICE_MAX_CLOCK_FREQUENCY: 1350 MHz
    CL_DEVICE_ADDRESS_BITS: 32
    CL_DEVICE_MAX_MEM_ALLOC_SIZE: 192 MByte
    CL_DEVICE_GLOBAL_MEM_SIZE: 768 MByte
    CL_DEVICE_ERROR_CORRECTION_SUPPORT: no
    CL_DEVICE_LOCAL_MEM_TYPE: local
    CL_DEVICE_LOCAL_MEM_SIZE: 16 KByte
    CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
    CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
    CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_PROFILING_ENABLE
    CL_DEVICE_IMAGE_SUPPORT: 1
    CL_DEVICE_MAX_READ_IMAGE_ARGS: 128
    CL_DEVICE_MAX_WRITE_IMAGE_ARGS: 8
    CL_DEVICE_SINGLE_FP_CONFIG: INF-quietNaNs round-to-nearest round-to-zero round-to-inf fma

    CL_DEVICE_IMAGE 2D_MAX_WIDTH 8192
    2D_MAX_HEIGHT 8192
    3D_MAX_WIDTH 2048
    3D_MAX_HEIGHT 2048
    3D_MAX_DEPTH 2048

    CL_DEVICE_EXTENSIONS: cl_khr_byte_addressable_store
    cl_khr_gl_sharing
    cl_nv_compiler_options
    cl_nv_device_attribute_query


    CL_DEVICE_COMPUTE_CAPABILITY_NV: 1.0
    CL_DEVICE_REGISTERS_PER_BLOCK_NV: 8192
    CL_DEVICE_WARP_SIZE_NV: 32
    CL_DEVICE_GPU_OVERLAP_NV: CL_FALSE
    CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV: CL_FALSE
    CL_DEVICE_INTEGRATED_MEMORY_NV: CL_FALSE
    CL_DEVICE_PREFERRED_VECTOR_WIDTH_ CHAR 1, SHORT 1, INT 1, FLOAT 1, DOUBLE 1

    OpenCL & volume rendering

    -implemented a simple volume renderer by OpenCL, which can load the mouse dataset from the project.
    In WinXP system on my laptop (bootcamp, nVidia 9400M),
    it takes around 250ms(4fps) to render a skull ( 85x96x134 voxels) and
    . 500 ms(2fps) with 169x192x268 voxels.
    The screen size is 500x500.

    ----
    GPU info:

    CL_DEVICE_NAME: GeForce 9400M
    CL_DEVICE_VENDOR: NVIDIA Corporation
    CL_DRIVER_VERSION: 195.62
    CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
    CL_DEVICE_MAX_COMPUTE_UNITS: 2
    CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: 3
    CL_DEVICE_MAX_WORK_ITEM_SIZES: 512 / 512 / 64
    CL_DEVICE_MAX_WORK_GROUP_SIZE: 512
    CL_DEVICE_MAX_CLOCK_FREQUENCY: 1100 MHz
    CL_DEVICE_ADDRESS_BITS: 32
    CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MByte
    CL_DEVICE_GLOBAL_MEM_SIZE: 253 MByte
    CL_DEVICE_ERROR_CORRECTION_SUPPORT: no
    CL_DEVICE_LOCAL_MEM_TYPE: local
    CL_DEVICE_LOCAL_MEM_SIZE: 16 KByte
    CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
    CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
    CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_PROFILING_ENABLE
    CL_DEVICE_IMAGE_SUPPORT: 1
    CL_DEVICE_MAX_READ_IMAGE_ARGS: 128
    CL_DEVICE_MAX_WRITE_IMAGE_ARGS: 8
    CL_DEVICE_SINGLE_FP_CONFIG: INF-quietNaNs round-to-nearest round-to-zero round-to-inf fma

    CL_DEVICE_IMAGE 2D_MAX_WIDTH 8192
    2D_MAX_HEIGHT 8192
    3D_MAX_WIDTH 2048
    3D_MAX_HEIGHT 2048
    3D_MAX_DEPTH 2048

    CL_DEVICE_EXTENSIONS: cl_khr_byte_addressable_store
    cl_khr_gl_sharing
    cl_nv_compiler_options
    cl_nv_device_attribute_query
    cl_khr_global_int32_base_atomics
    cl_khr_global_int32_extended_atomics


    CL_DEVICE_COMPUTE_CAPABILITY_NV: 1.1
    CL_DEVICE_REGISTERS_PER_BLOCK_NV: 8192
    CL_DEVICE_WARP_SIZE_NV: 32
    CL_DEVICE_GPU_OVERLAP_NV: CL_FALSE
    CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV: CL_TRUE
    CL_DEVICE_INTEGRATED_MEMORY_NV: CL_TRUE
    CL_DEVICE_PREFERRED_VECTOR_WIDTH_ CHAR 1, SHORT 1, INT 1, FLOAT 1, DOUBLE 1

    Monday, January 11, 2010

    Windows輸入法切換鍵跑掉了?這樣設回來! | T客邦

    Windows輸入法切換鍵跑掉了?這樣設回來! | T客邦
    由左方找到路徑「HKEY_CURRENT_USER/Control Panel/Input Method/Hot Keys」,找到「00000070」這組號碼。
    將Key Modifi ers設定為「02 c0 00 00」,Virtual Key設定為20 00 00 00」,完成後即可關閉視窗。

    Saturday, January 09, 2010

    windows xp 資源分享

    每次都被開啟資源分享的設定搞到瘋掉
    以下一一列出checklist:
    1. check "file and printer sharing" in network settings
    2. check firewall
    3. 本機原則: local->network access->停用guest帳戶: classic
    4. Control -> Users : 停用guest帳戶
    http://system.cyut.edu.tw/tech/share1/share.html

    Tuesday, November 10, 2009

    Michigan State& U of Michgan生活記事 - 畢業證書認證

    Michigan State& U of Michgan生活記事 - 畢業證書認證: "畢業後要回台灣找工作的同學們, 尤其是回台灣後想任職公家機關,學校,升學,或參加國家考試的同學, 別忘了你們的畢業證書都要拿去經文辦事處做認證唷. 這些資訊不是新規定,而是怕有人拿的是非正規學校,以前有人拿野雞學校或假造的回國任教;於是後來就採駐外認証。


    雖然辦理的過程有點小複雜, 但是只要按照下面(辦事處領務組提供)的步驟做, 應該就沒問題

    準備:



    (1) 申請書 (表格請到這裡下載: http://www.taiwanembassy.org/public/Attachment/681820204971.pdf),

    (2) 一份護照影本,

    (3) 兩份畢業證書影本 (這樣認證的印章就不會蓋在正本的證書上).

    (4)規費每份十五美元。

    (5)在學證明:請繳交在學證明正、影本各乙份。

    (6)文憑或成績單證明:依所需份數提供文憑(或成績單)影本,及學生證(或社會安全卡)號碼、學校註冊組地址及電話,俾方便本處向學校查證。





    下列學校或發照機關規定需繳查證費,請申請人另開支票或Money Order支付查證費,抬頭請寫學校或發照機關之名稱: 支付查證費
    Ohio State University : $2
    Northern Illinois University : $3.5
    ** Case Western Reserve University 與 Ohio State University, Michigan State University不接受成績單查證,請向學校申請彌封成績單並在封口蓋印章
    ** Northwestern University 與 University of Illinois at Chicago 要求學生填寫學歷查證授權書給 TECO 才可查證。請下載 學歷查證授權書(pdf檔案) http://www.taiwanembassy.org/public/Attachment/681820203571.pdf (Authorization Letter)。

    (7)執照部份:依所需份數提供執照影本及發照機關之地址,俾向發照機關查證。

    (8)經歷證明、法規抄本及其他文件:請先送公證人(Notary Public)公證後,連同影本一份送本處驗證。

    查證學歷授權書表格下載: http://www.taiwanembassy.org/public/Attachment/681820203571.pdf



    公證、驗證申請表格下載 http://www.taiwanembassy.org/public/Attachment/681820204971.pdf

    ***注意事項:

    本處受理文件證明之轄區範圍為伊利諾州、密西根州、威斯康辛州、明尼蘇達州、愛荷華州、俄亥俄州及印地安那州。

    申請人請填具本表、附護照影本,並另就申辦之文件每種多提供影本一份,以供存查。

    規費繳納,請使用Money Order或支票,抬頭請寫TECO。

    如郵寄辦理,請附貼足郵票之Priority或Express之回郵信封(務請詳註姓名及地址,以免郵件遺失)。請勿使用逾期或他州之機器郵票。(Global Priority:$5 small/$10 large,Global Express: $17,FedEx/UPS/AirBorne/DHL 請填妥付費方式之airbill)

    各類文件經本處驗證後,不得擅自增刪塗改。倘因資料填寫錯誤或遺漏,須作增刪更正時,請依規定重新申辦。

    http://www.taiwanembassy.org/US/CHI/ct.asp?xItem=12595&ctNode=2491&mp=26"

    Tuesday, August 11, 2009

    MacOS X 的3種睡眠模式 « なんでも

    MacOS X 的3種睡眠模式 « なんでも: "相信大部份 Mac 的使用者,在不需要用 Mac 的時候都會以「睡眠」代替「關機」吧,因為速度實在是太快,「睡覺」和「起床」合共也不用花多過10秒(不同的機種和狀況下會有差異)。但大家又知不知道,OSX 中的「睡眠」是有三種不同的模式的呢?

    1. Sleep – 保持 RAM 的內容不變
    2. Safe Sleep – 保持 RAM 的內容不變,同時會將 RAM 的內容備份至硬碟
    3. Deep Sleep – 將 RAM 的內容儲存至硬碟

    如果轉換成 Windows 上的用語,Sleep 就是 Sleep (暫停),Deep Sleep 就是 Hibernate (休眠) 吧,至於 Safe Sleep,Windows 好像沒有 @.@a

    在一般的情況下,Mac 是會使用 Safe Sleep。由於要保持 RAM 的內容不變就必須供電給 RAM,所以在 Sleep 及 Safe Sleep 的情況下還是會耗電,而 Deep Sleep 則會在 RAM 的內容被儲存至硬碟後就不再需要供電。

    看上去 Deep Sleep 似乎很好嘛,幹嘛還要 Sleep 和 Safe Sleep 呢?這是因為速度的問題。

    Sleep 由於不用將資料寫至硬碟,所以入睡的速度很高,一至兩秒就可以了。但假如電源斷了或是電池用光了,就只能從新啟動一次系統,還有可能導致資料流失。而 Safe Sleep 將 RAM 內容備份至硬碟就是為了減低資料流失的可能,但就要花一點時間做備份。而 Deep Sleep 則與 Safe Sleep 使用時間相約,但由於 Safe Sleep 跟 Sleep 一樣在 RAM 內的資料沒有被消去,所以沒有 Deep Sleep 的賴床問題,很快就清醒。也因為這個原因,大家在 Safe Sleep/Deep Sleep 後,要確定硬碟已經停止活動才移動 Macbook,否則有機會導致硬碟出現問題。

    嗯,說了這麼久,你想轉用 Sleep 或者 Deep Sleep 嗎?如果不想的話,可以把瀏覽器關掉喇,因為以下的東西你應該沒興趣聽 XDD 不過如果想知多一點點的話還是可以繼續下去(拜託,不要關掉瀏覽器喇,剛剛只是說笑的啦 m>_<m)

    首先,要確定一下現在設定的是哪個睡眠模式,到 Terminal 輸入以下指令:

    pmset -g | grep hibernatemode

    它會給你一個像 “hibernatemode X” 的回應。而 X 會有幾個可能性:

    * 0 (數字零,不是英文字母 o) – Sleep
    * 1 – Deep Sleep
    * 3 – Safe Sleep
    * 以上皆非 – 送你的 Mac 去科研吧

    如果需要變更的話,就到 Terminal 輸入以下指令:

    sudo pmset -a hibernatemode X

    X 則跟上面的一樣,0是 Sleep,1是 Deep Sleep,3是 Safe Sleep。更改後,下一次睡眠就會以剛設定的模式進行。

    如果你鐵定不會用睡眠或者只會用 Sleep,你可以把睡眠的備份刪去。到 Terminal 輸入以下指令:

    sudo rm /var/vm/sleepimage"

    Sunday, June 28, 2009

    車子電瓶沒電,如何啟動車子?


    1. 先發動救援車, 以避免救援車電瓶內的電, 在接往被救援車電瓶後, 電力耗損導致救援車本身也發不動, 這通常發生在救援車本身的電瓶續電能力已不良, 但啟動自身尚可的情況.

    2. 先接被救援車正極, 再接救援車正極.

    3. 接被救援車負極, 再接救援車負極; 這麼做的主要目的是避免在接線過程中, 不小心短路造成失火; 因為汽車外殼是直接接負極, 若先接負極線, 再接正極線時, 一旦不小心(其實很容易), 正極夾頭接觸車身, 就會引起電瓶已接妥接線的那一方短路; 所以先接正極, 尤其要先接沒電的那一方, 那麼在接正極時, 就算碰到車身也沒事, 因為此時電氣的迴路還沒接通; 當沒電那一方正負極都接妥, 在接救援車這一方的負極時, 萬一不小心負極線碰觸到車身, 也只是建立起迴路, 不會有事; 若再更不小心, 負極線夾頭碰到正極, 因為被救援車本就沒電, 所引起的短路電流也會小得多. 

    4. 救援車要加油門, 以避免被救援車啟動時大量耗電的情況下, 導致救援車因電壓下降太大而熄火. 

    5. 被救援車啟動後, 反過來要先拆兩車的負極線, 再拆兩車的正極線, 原因同上述.

    安全第一!

    Friday, June 26, 2009

    美商高盛不會教你的事:如何在金融界出類拔粹?(下)

    Constrained Optimization

    剛上半 堂跟各位講的呢,是各位在這輩子,我是說如果你對金融有興趣的話,大概會是各位這輩子聽說過的最大的謊言。聽過的人就當作是在幫各位複習一下這個謊 言,沒有聽說過的,我保證你以後一定會一而再,再而三的聽到。我所謂謊言的部分就是,金融專業是無比的重要這檔事。這句話本身是一個謊言。但即使是要去學 習猶太銀行家或金融家成功的秘訣,這也是一種幻覺,或者說是誤會。

    因為,如果你現在還在學習他們的話,你一輩子只能追在猶太人的後面而 已。如果你想要跟他們並駕齊驅,或是超越他們的話,你要學習的是比他們更高竿的人。也 就是說在這個世界上,比猶太人更有影響力的人,包括日爾曼人和盎格魯薩克遜人,特別是有美國國籍的那些,這個才是你應該要效法的對象。

    問題的關鍵其實我已經寫在黑板上,其實大家會犯這種錯誤,其實都是犯了一種毛病,就是斜眼。所謂邪眼呢,就是飛影頭上那一顆,哦不行,講這種話,會洩露我的年齡。我十八歲,大家要記得喔:P好,不蓋了,接下來我們要講更嚴肅的部分。

    真正的秘訣就在Constrain(ed)

    很 多人看到這個字,就只看到他的形容詞型式,接下來,就從此constrained而萬劫不復,然後一頭栽進optimization的深井中,從此不可 自拔。然後誰跟他講其他意見,他都以為那是在唬爛的。其實你看到這個字的話,你應該就要想到它另外一種型式,constraint也可以是名詞呀。小錢跟 大錢,法金或消金,或者是上層或下層,最大的差別就是在:當牽涉到的利益非常、非常、非常巨大的時候,我們可以為此改變遊戲規則,不見得是單純的被遊戲規 則所限制。所謂的constraint有很多形態,大家第一個可以想到的就是法律。

    可是在法律裡面,如果你有看過法律的話,它裡面它會寫很多什麼什麼什麼由主管機關訂之,也就是說,行政規則或者是命令,或是主管機關的一個意見,也是constraint的一種。甚至很多時候都是油水出現在法律之前,當法令完備之後,利潤已經被一大堆競爭者分食完畢了。

    其 實constraint你再繼續講下去的話可以包括很多,比方說民族性其實也算是其中一種。或者說是你這個地方的地理條件也可以算是一種,還有很多很 多。在歷史上,真正在玩大錢的時候,這個才是重點。constraint就算沒有比optimization更重要,至少也一樣重要。大家一定要記得這句 話。如果你還有時間的話,應該用生命努力鑽研constraint更多一點。如果你真的想站在金字塔頂端的話,這才是你要追求的目標。

    在歷史上的金融創新能夠實現,大部分的狀況都是因為constraint的改變,而不是因為什麼偉大的財務專家發明了什麼東西。因為那些東西你發明出來,不能做還是沒有用。大家有興趣的話可以去看金融業的歷史,我在這邊簡單舉幾個例子。

    之 前辜仲瑩不是和陳敏薰在爭奪開發嗎,後來財政部做了一個關鍵性的決定,就是說,開發工銀持有的開發金的股票不能行使同意權。那結果就底定啦,陳敏薰就輸 定了,辜仲瑩就贏定了。可是為什麼財政部會做這樣子的決定呢?這裡面一個很關鍵的人物叫做劉紹樑,他以前是理律法律事務所的合夥律師,現在已經到中信金擔 任策略長的職務了。這個人你可以去網路上搜尋一下之前的新聞就可以看到了。

    我現在要講的是說,法律專業不是改變constraint的充要條件,其他的律師做不到和劉紹樑一樣的事情,劉紹樑做的事情是很巧妙的。

    劉紹樑以前就很有名,他看法律的觀點和其他人很不一樣。其他的律師看法律的方式是,把狀況拆解到現有的法條當中,然後把解答給他的客戶看。劉紹樑的看法是反過來的,他的看法是,要做某些生意的話,

    目前還少了哪一條法條?

    或者是少了哪一部法,然後他想辦法去製造這種東西出來。像那個企業併購法就是他做的。

    他在這個case就是要幫辜家嘛,他做了很多非常匪夷所思的事情。首先他先去投書,或去開記者會製造各種輿論,然後讓大家覺得說,子公司持有母公司股票行使同意權是不對的。然後他在一場關鍵性的記者會上,他大聲疾呼說子公司持母公司的股票然後行使同意權,是「大逆不道」。

    然後這個東西就被媒體大幅報導,接著這形成一股社會風氣,最後財政部就順水推舟,做出這樣的決定。這真的是運用各種管道達成改變constraint(在這裡是主管機關的意見)而達到自己的目的的一個絕妙例子。

    另外一個例子就是在亞洲金融風暴的時候,不是很多國家應聲倒地嗎?然後IMF就在鬼唱一堆狗屎屁,什麼「堅持市場自由化,從事金融改革,然後我們就會提供你一大堆貸款,讓你能應付投機客」(最近美國前財長魯賓出了一本「不確定的世界」,又在鼓吹這種論調)。

    可 是貸款再多也沒有用,全世界每天有上兆美元的熱錢在跑在跑去,更何況投機客的必殺技就是槓桿操作,一塊錢等於十塊二十塊,你政府有多少外匯存底和IMF 的貸款都沒用。也許你會問:政府也可以槓桿操作啊?不過史有明證,不靈活的公務員如果從事槓桿操作的話,只會以光速賠錢而已。

    這個時候 呢,就有某些國家誤信IMF那套,於是貨幣不斷狂貶。這個時候馬來西亞想要關閉外匯市場,可是被美國施壓,於是沒有立刻施行。這個時候投機客把腦 筋動到香港上頭,而偉大的阿共仔雖然不甩老美,可是還是宣稱要動用中國的外匯存底捍衛香港(這真的做了的話,就是送錢給投機客),結果到了對決的那 天......

    阿共仔宣佈調高期貨交易稅,也就等於是藉由行政手段墊高炒手的成本,索羅斯一夥人一聽到這個消息,馬上知道玩不下去了,閃得不見蹤影。而馬來西亞總理狂譙IMF和美國已經來不及了,他如果老早動用類似手段,也就是由constraint下手,馬來西亞受傷會輕很多。

    喂,你想想,連這麼自由,外匯存底這麼多的台灣,當年都把NDF關了呢!雖然也是受到各國很大壓力,動作慢了點。你今天政府拿錢去和投機客玩,
    比操盤(optimization)哪有可能會贏呢?當然是要用政府的強項,玩規定(constraint)啊,政府規定夠機車,投機客完全沒有施展空間。

    再來又講回金控。

    1933 的時候,因為經濟大恐慌,美國通過Glass-Steagall法,禁止商業銀行和投資銀行跨業經營。1956年時,又通過Bank Holding Company法,禁止商業銀行持有保險公司且降低銀行承銷保險之風險;但是1998年時對於citi及travelers的合併案給予兩年試用期。 1999年時,終於通過了Gramm-Leach-Bliley Act,廢除了Glass-Steagall and Bank holding Acts從此美國金融業才能成立金控。

    但是歐洲一直沒有這種限制。美國如果不是經過這幾關的話,全球金控排名絕不是你今天看到的這樣。應該美商金控的勢力會比今天大一點。喂,那些金融巨獸每差一名是相當於多少資產啊?

    問題是,跨業經營的各種道德風險一直都是所有人都知道啊,而金控的種種好處(如跨業銷售)也是大家都知道。為什麼在某些時刻才發生那些改變?那之前一到五年的歷程是什麼呢?政府為什麼在某些時候封閉,某些時候又開放了?大家好好研究研究吧。

    最 後就是因安隆案和世界通訊而生的Sarbanes-Oxley法案。這項法案使得美國上市公司董監事酬勞大幅增加,也限制了會計師-管理顧問-投顧跨業 經營的可能性。不然本來可能會出現會計/法律/管理顧問/資訊系統四合一的整合企業服務巨獸。此法並擴大了董監事責任險和企業風險管理的市場。不 過......英國沒有這樣的規定,也許有些公司因此就跑到英國上市,美國主管機關也不得不考量到接下來可能的後果。請大家密切注意後續發展。

    還 有之前不是華爾街十大投資銀行被罰款十四億美元嗎?他們之前的幹的壞事大概就是發佈不實的利多報告以招攬承銷生意,並且優先把報告給大客戶(資產管理) 看再公佈給一般投資人,藉此謀取不道德暴利。如果把研究部門和承銷部門/交易部門切割正式立法的話,金融界馬上就大洗牌,大家可以先預想一下。因為這可能 會影響到很多人未來的人生規劃。

    接下來的重點就是說,跟各位分享說,你怎麼樣培養有駕御constraint的能力。這種事情是需要天份 的……需要一分的天份加上九十九分的努力。這也是 比猶太人更有影響力的民族他真正成功的秘訣。因為猶太人在這個世界上影響力當然很大,可是你可以這樣講,就是說這個世界基本上不是他們在主宰的。主宰這個 世界的另有其人,就是那些繼承羅馬時代偉大的精神,祖先從英國或是德國渡過大西洋,現在住在美國東北角的那些人,也就是新英格蘭地區英裔和德裔美國人。

    接下來我要跟大家分享的是,我整理出來的,就是怎麼樣培養你能駕御constraint能力的幾個做法。那我會分成:
    要做什麼?
    什麼時候要做?
    為什麼要這麼做?
    然後,做了對你有什麼好處?
    幾個部份加以敘述。

    一、深入參與期貨社
    二、大三或以後去上李錫錕一年共六學分的政治學
    三、練好經濟、會計、統計、數學和程式這五種財務學基本功
    四、雙修文學士和理學士
    五、儘量少修商管課程、少看商管書報雜誌
    六、研究羅馬史
    七、鑽研演化心理學和決策科學
    八、學習領導藝術和策略
    九、實踐生命哲學,特別是「某些」存在主義哲學

    一、深入參與期貨社

    第一個你要做的事情,就是加入期貨社。這不是我老王賣瓜,我相信各位今天來這邊之前,沒有人去想過這個問題(constraint才是最大的關鍵),你在其他的金融社團,也沒有人在討論這個問題。現在國內其他的社團,你大概也沒有聽說過有誰是專門在搞這些事情的。

    所 謂參與,不是指你每個禮拜在這邊聽課就好了。你在這邊聽再多的課,也只是被動接受而已,況且,在這邊聽得再多,一個學期也不過二十個小時,還不如一個財 金系教授開的一門課一半的時數,幹部上課的經驗也不會有教授好,是吧?我所謂「深入參與」的意思是,你對這個社團有足夠的投入和付出,包括熱烈參與討論, 加入社團運作,投入時間、心力和熱情,上台講課,出任幹部和社長等等,最後你總算變期貨社傑出老骨頭之一,並走出自己的一片天,但還一直找時間和學弟妹心 得分享。

    期貨社「骨灰團」聚會的時候,除了閒嗑牙、八卦之外,在聊、在研究、在討論的就是怎樣去駕御constraint。那如果你能夠 和期貨社社友變成好友的 話,你的進步會比較快,因為很少人在研究constraint,而且獨樂樂不如眾樂樂,三個臭皮匠勝過一個諸葛亮,那什麼時候來做呢,

    快加入期貨社吧!

    期貨社是國內研究constraint最頂尖的社團喔!

    二、大三或以後去上李錫錕一年共六學分的政治學

    第二件你要做的事情,就是去上李錫錕的政治學。你要聽清楚,是政治學不是政治概論哦!他大概是國內研究所謂比猶太人更具影響力的民族,或者說是在影響力背後的機制最深刻的教授了。

    到底有哪些人?這些人、這些比猶太人更屌的民族從那裡來?他們是怎麼樣培育他們的下一代,他們到底做了什麼事情?他們到底在現代的社會中,隱身在那裡?他們還有什麼樣的影響力?還有他們怎麼樣把他們的影響力延續下去?

    這 些東西就是他政治學裡面的內容。雖然他叫政治學,但是他教的是這種東西,而不是你在一般教科書上看到的那種東西。你去上他的課,可以說是對培養駕馭 constraint做最好的準備。因為他的課你一年上一上應該有九十到一百個小時吧,這一百個小時可以說是你這輩子打底最重要的工夫。

    在 NTUcourse版上對他的課當然有很多好壞不一的評語,不過我只能跟你講,如果你要研究constraint的話,在台大裡面沒有一門課比這門課更 重要。至於什麼時候要上呢,我比較建議各位大三以後再去上,大四也不嫌晚,如果你是研究所的話,最理想的時間應該是在你大三以後到你離開學校前的一年。如 果你在大一去上的話,它對你只有零學分的價值。那大二的話就是上下學期各三學分就是六學分了。那大三你去上李錫錕政治學的話,對你來講會有「六十學分」的 價值。

    我這樣講一點都不誇張,你自己想想看你在大學裡投資多少時間,多少學分是在optimization上?說不定有破百,是吧?而constraint位於結構的上層,比optimization還要更重要。

    至 於上他的課,有人會說他給分都亂給嘛?你只要記住一件事情,上他的不是要專心聽的,是等到你生命的經驗夠了,看到的事情多了,上他課的時候,突然聽到他 一句話,然後開始跟你的生命經驗做結合,然後你就開始陷入自己的沉思中,然後神遊一段時間後回來,又聽到一句話,又開始思考......

    這 樣子大概過一個學期之後,你好像是拿了他的筆記,就是那些條列的重點大綱,可是配合上你的經驗和你的體會去對他……你就想像李錫錕是你的學生好了,去對 他講述這個故事,這樣我保證你的分數在八十五分以上。可是如果你只是背筆記的話,那分數應該會蠻慘的。他那門課只有期末考,一試定終身嘛,這是風險。可是 我是真的覺得,就算你有被當的可能性,你還是應該要去上。

    因為真的沒有人上的比他還要好,可是你一定要在「對的時間」抱持著正確的心態去上。他在上的時候他也會告訴你說,他這些東西是從那邊濃縮而來的,你也可以得到很多進階閱讀的材料,知道以後要看什麼樣的書,要怎樣精進。總之,「大學的時候沒有比李錫錕政治學更重要的課」,

    你 一定要記得這句話。千萬不要為了什麼某某數學某某統計某某經濟或是某某金融商品而放棄修這門課的機會,這些optimization面的枝微末節以後再 學都還來得及,而且能學的地方多的是,可是李錫錕的政治學,離開大學這個環境,你的機會真的就不在了,而且我不知道他會繼續上多久,所以請大家一定要把握 時機。不過如果你還是大一大二的話就算了,再等等吧,反正他是不敢隨便退休的,不然我去他家把他架來上課:P

    接下來我要講跟財金基本功唯一有關的部分了。大學修課的重點不應該放在學習以後會用到的應用知識上,或是修一大堆的商管課程;而是假設以後的東西都要自學的話,

    那些課程是基本功中的基本功?

    能夠幫助你以後在自學時候的迅速掌握那些應用知識,不管那些應用知識是什麼?(所以小弟以前寫的財金/財工/精算課程基本上是垃圾,給大家當笑話看吧)

    三、練好經濟、會計、統計、數學和程式這五種財務學基本功

    所謂財金基本功大約分為五大類:經濟、會計、統計、數學跟電腦這五部分,都有分基礎跟進階,依你的天分和興趣決定修讀的深度。

    分類 基礎 進階
    經濟 經濟學原理 個體經濟學
    (經濟學甲) 總體經濟學

    會計 會計學甲 中級會計學

    統計 統計學 數理(或高等)統計學

    數學 微積分 微分方程
    線性代數 高等微積分

    程式 程式設計 資料結構
    物件導向程式設計 演算法

    經 濟的部分,基礎的當然就是大一的經濟學,經濟學原理或經濟學甲;比較進階的部分就是經濟系開的,大二的個體經濟學跟總體經濟學。會計的話就是會計學跟中 級會計學。統計學部分的話,在初階的部分就是不需要微積分的統計,就是你們一般學的課名叫統計學的那種課;進階的話就是需要以微積分為基礎的統計,像數理 統計學和高等統計學這個部分。數學的話比較基礎的就是微積分和線性代數,比較深的話就是微分方程和高等微積分;程式......一開始的話,你可以學程式 設計和物件導向程式設計(C++或Java),這樣子的話你就會寫程式了,但如果你想要寫出好的、有品質的、不是土法鍊鋼的那種程式,你就要學資料結構和 演算法。

    不過我這裏雖然列出五大類,還包括初級跟中級,不是要你全部都學會。比方說,你微積分就修到快要被當了,你幹麻去修高微?而是說在修這些課程的時候,你慢慢可以發現,你自己比較需要哪方面的知識,或者是說個性和天份比較適合哪方面。

    像是反過來說,有些人就是看到高微他覺得就像在看小說,也許他就比較適合往財工這邊鑽下去。我這樣講還不夠誇張,像我以前的室友,他的娛樂就是打電動和看數學,

    量子力學跟泛函分析,天啊!他是當休閒用書在看的。

    所謂泛函分析就是,你微積分學完學高等微積分,高等微積分學完可能會學複變吧!複變學完了,你要學研究所的實分析跟複分析,就是實數函數的分析,複數函數的分析,最後一個對所有各種類型函數的討論那就叫泛函分析,也就是說從微積分開始算,可以算是第四層了。

    有 人可以把這種東西當作是在看小說,而那種人就住在我房間,後來我就對自己說:「我這輩子玩數學沒有比較利益!」學這種東西是幫助你認識自己在財金領域要 走哪一塊,那如果是一般財金的話,會計和經濟學到中級會比較好;那如果你要玩保險精算的話,數理統計學是必要的,中級的經濟學最好也修一下,那財務工程的 話,你數學、程式當然得比較強。

    那接下來我們還是把重點回到constraint的這個部分:第一個就是加入期貨社,第二個就是修政治學,第三個是如果還來的及的話,我請你慎重考慮雙主修或輔系這檔事。

    四、雙修文學士和理學士

    文理雙主修(最佳) > 跨學院雙主修(也不錯) > 修其他學系專業必修課(起碼)

    在 國外先進的大學裡面,他們把大學定位成一種全人的教育,大二開始他們才會開始分系,比較慢找到方向的人,甚至在大三的時候才決定主修,也就是說基本上他 們在之前學的東西都是通識課(core curriculum),所謂通識教育的目的是在幫助你探索知識的各個學門或取向,英文叫approach或discipline。

    在國 內的話,對不起,這一切都是教育部的錯!各位大概在高二開始就分組了吧,在分組之後,所有的人就分成理組和文組這兩個部分,理組的這個部分他們講究的 是實驗,然後他們講的話和思考的方式會比較精確,然後他們掌握的是這個世界的一些技術。而文組的人他們做研究的方法是比較偏向論述方面的,那他們面對模糊 的能力是比較好,像學理工的人他在這個環境就不是這麼舒適,然後他掌握這個世界的制度,然後台灣的高級知識份子就分為兩個世界,這兩邊的人永遠無法去理解 對方到底在幹麻,互相歧視。

    可是,如果這個時候你剛好橫跨兩邊,你有辦法和兩邊的人溝通的話,你的眼界就比他們大一倍囉!這個也算是兩種不同的世界觀,所以如果只有一種世界觀的時候,你眼中所看到的世界只有一半,一半的意思是說不只你解決問題的方法只有一半而已,你連問問題的方法都只剩下一半。

    問問題其實比解決問題重要多了,一但你問出了對的問題,你就知道要去找哪些專家學者組成專案小組來研究。

    有 些問題是用理的方式,也就是科學的方式去問是比較好的,你不得不用人文的方法去問,效果就差多了,或者是如果你是理工類組的你的狀況就相反,明明是一個 人文問題你硬要把他搞成科學問題,就是用錯辦法。理組這邊他們的專長是找出問題之間的規則時比較有效率,而且比較精確,然後這個結論也是比較有效度 (validity),你把他講成比較強有力好了,效度是什麼東西各位以後去修研究法的時候就會學到,你也可以用google大概找一下。

    文 組的專長就是在模糊的環境裡面他會覺得很舒適,很多連定義都很難作的問題,文組的人仍然有辦法可以處理。這個世界本來就是模糊的,而理組的人碰到模糊的 狀況,不是覺得渾身不對勁就是完全乎略這些無法精確定義的問題。台灣受過高等教育一群人之間最大的問題就是,這兩種人彼此沒有辦法溝通,或是說這兩種人之 中能做為溝通媒介的那群人實在是太少了,如果你就是這些溝通媒界之一的話,兩邊的人都可以為你所用,因為只有你可以跟兩邊的人溝通。我真的是這樣子強烈的 建議大家,就是說你修的那個系頒發的是bachelor of art,你就去選修bachelor of science的這種系,反之亦然。

    那 在選的時候,如果你是文組的,你能夠選數學或資訊以外的系是最好,因為數學跟資訊並不包含太多的實驗在裡面,也就是說你要做一些邏輯論證或推導的時候, 其實你是根據某些假設,那些假設不一定是真的,只有實驗才能去驗證這樣子的假設,所以最好的狀況當然是去修物理之類的基礎科學,可是對於高二就沒有讀物 理、化學、生物的人來說,痛苦應該蠻大的。當然我這樣講的文理互跨雙主修是最好的,不然也可以跨學院雙主修,最起碼你要去修一些外系大二、大三的必修課。

    不 過跨學院至少有一種例外,就是管理學院修經濟系,就是這兩種東西你可以說理論和實務相結合,可是他的世界觀是非常非常接近的,或者你可以這樣講,根本就 是一樣的,那你就沒有辦法達到我剛講的那種跨領域學習,開拓自己的世界觀的效果。修的時候你也不用去想說另外一個系熱不熱門,好不好找工作?最主要是要開 你的眼界用的。

    大學是奠定你一輩子世界觀最重要的時光。

    如果你不在大學的時候建立好自己追求智慧開闊而堅實的基礎,

    離 開大學之後再做會非常痛苦,應該講說不可能,因為大學是型塑你下半輩子價值觀最重要的期間,像是研究方法大致可分為實驗、計量分析和質性研究這三塊,那 什麼東西都可以做質性研究,能夠做實驗的東西很少,但只有實驗能斷定因果關係,其他方法都不能,量化研究他的研究速度和導出結論的速度會比質性研究好。

    只有你大學所學知識是三種並重,你才知道面臨什麼情境時要怎樣問問題,在大學的時候你要盡量追求人文和科學並進的教育,既然教育部提供給你的制度不是這樣子,你就要自力救濟。

    人文教育能夠幫助你面對混沌,
    科學教育可以幫助你克服複雜,
    文理雙修的話,你才能發現別人看不到的,連結在兩者之中的美麗小世界,
    沒有反應的人,代表你書店逛的太少囉。

    五、儘量少修商管課程、少看商管書報雜誌

    接 下來就是請大家在學校盡量少修管理學院的課。唸到管理學院的系的同學比較幸運的一點就是,你的同學相對於文組的其他學生是比教聰明的,你的想法比起法律 系的學生又比較靈活。可是大學部的商學教育並不算是基本功當中的基本功,那對於建立你比較完整的世界觀也沒有太大的幫助,在國外的經驗更是會和你強調說, 有工作經驗之後你去學管理,你才會知道這修東西到底該怎麼用,少修的意思不是叫你不要修,如果你基於各種考量,譬如想接近心儀對象的話,我求你修!真的!

    不過沒有工作經驗下的管理學教育沒有意義,甚至於大學部的管理學教育對研究管理學(如讀商博)也沒有幫助,大學該做的事情是築基,而商學的三門基本功是數量方法、經濟學和決策科學。

    這可不是我亂蓋的,Stanford和Insead商學院博士班有所謂的院定必修,是不管你主修什麼都應該要會的,網址如下:
    https://wmail6.cc.ntu.edu.tw/horde/services/go.php?url=http%3A%2F%2Fwww.gsb.stanford.edu%2Fphd%2Foverview%2Fcoursework.html
    https://wmail6.cc.ntu.edu.tw/horde/services/go.php?url=http%3A%2F%2Fwww.insead.edu%2Fphd%2Fprogram%2Fprogram_structure.htm

    大學時應該好好學習的是管理學的根本,就是
    個體經濟學
    線性代數、數理統計學、計量方法
    社會心理學、決策心理學
    而不是一大堆亂七八xx管理。

    商管學院的特別注意到啦:given你已經有一大堆必修課都是管理/金融課程了,你再選修自己院系裡面課程的邊際效用又再更低,所以,千萬別執迷呀!算我求你。

    至於管院某系雙修管院另一系更是頭殼壞去(你不要對我辯說會計和資管差很多)。醒來吧,同志們!外面的花花世界正在等著你們。

    然後,跟少修管理學院的課一樣重要的事情,就是要少看商管類型的雜誌跟書。商管類書報雜誌依內容99%可以分成三類:

    第一類一天之後就是垃圾,
    第二類一週之後就是垃圾,
    第三類一季之後就是垃圾。

    如果你把寶貴的生命花在這些事情上,連續數十年,你怎麼能期待自己能夠脫穎而出,進而出類拔萃?

    今 天高手和平凡人會有差異,不在於吃喝玩樂或是做一些庶務性工作的時候,你吃飯高手也要吃飯啊,你睡覺高手也要睡覺,你嗑牙高手一樣也會,你玩MSN高手 照玩啊。會有差距是在高手和平凡人自以為在精進的時候,做了不同的選擇。而這些時間,一年可能只有五百小時,一天只有一小時多一點。

    五百小時/年能夠製造多大的差異呢?平凡人選的是書店裡最暢銷的管理大師新作品,精讀之後覺得很有道理,

    而高手選的是經過十年、百年、千年歲月洗鍊後人類智慧的精華。久而久之,高手全身上下掛滿千年神器,信手拈來就是上古神兵。然而,平凡人永遠不知道,讀那些死人骨頭到底有什麼用?

    (商管類的書也不是全部都爛啦,杜拉克、科特勒或是巴菲特這些老鬼早就通過不知道多少個十年的考驗了。不過你一定要讀足夠人類的經典並且有深刻體會,你才能去預測,哪些商管類新書裡面寫的東西十年之後依然很有用。)

    最後我要講高級班,分歷史、科學、藝術、哲學四層次

    六、研究羅馬史

    接 下來最後的部分是基於上面的基礎之上,你去培養駕馭constraint的能力,第一個你要學的東西就是歷史。有句話說:「愚者以自己的經驗學習、智者 由別人的經驗中學習。」自己的經驗當然是無法取代的,問題是你每次跌倒受傷能成長多少,和你從別人的經驗中學到多少非常有關。讀歷史有點像是做大量的 case study,從當中去歸納出一些道理出來,建立自己的史觀,以做為日後決策的基礎。那你要學怎麼樣的歷史呢?最重要就是羅馬史。理由有三:

    (一)羅馬時代是現代(西方)社會的原形
    (二)羅馬人在智力、體力和商業能力都不如對手,卻能一一打敗他們
    (三)羅馬史是現代西方國家上流社會教養子弟的必備課程


    (一)羅馬時代是現代(西方)社會的原形

    比 方說是法律vs.神的戒律、共和制vs.帝制(比較接近現代的總統制vs.內閣制)、同化敗者或是強化勝敗者之間的差異、男女地位的轉變、各種稅制等 等,全部都在羅馬時代上演過,也一一顯現出結果。讀羅馬史可以讓你了解在現代社會裡,如果施行某些制度(constraint)會有什麼結果。

    (二)羅馬人在智力、體力和商業能力都不如對手,卻能一一打敗他們

    如 果今天羅馬人比對手聰明、強壯而且更具經營管理的本事,最後能在地中海四週稱霸,那……我們也沒什麼好研究的啦。但真是太神奇了!今天羅馬人智力不如希 臘人、體力不如高盧人、經商的本事不如迦太基人,(羅馬人optimization的天賦比對手差多了)卻能一一打敗這些部族,

    為什麼?
    為什麼?
    到底是為什麼呢?

    關鍵就在他們選擇奉行某些和他們對手不一樣的遊戲規則(constraint),使得他們和其他民族的命運大不相同。到底是哪些呢?比方說「同化敗者」就是很重要的其中一項,其他的……各位用心鑽研吧。

    (三)羅馬史是現代西方國家上流社會教養子弟的必備課程

    之前我在看許多大頭,不管是公領域的或是私部門的,傳記、報導文學的時候發現一件事,就是有讓人吃驚的高比例都說愛德華、吉朋的「羅馬帝國衰亡史」是影響他們最深,也是他們一生不斷重讀的書。

    世界上的書有多少本啊?一些在不同領域的翹楚都讀過同一套書的機率有多少呢?這是不是應該好好追究呢?這到底是什麼武林密笈可以讓一堆大俠推崇至此?為什麼真強者都是吃這個長大的呢?

    那......要怎麼學習羅馬史呢?

    第一就是書店找一本薄薄的小書,叫做「關於羅馬人的二十個問題」鹽野七生著、三民出版。這本小冊可以讓你對羅馬史能夠有一個最迅速而全面的鳥瞰。

    第 二呢:上機實習。由三國志經驗我們可以發現,打電動是學習歷史最快的方式。這個遊戲的名稱是「羅馬:全軍破敵」松崗出品。請大家支持原版啊,啊,一千多 很便宜啦。藉由本遊戲加深你對羅馬史的了解與興趣,對你人生的加值最少從一千萬起跳,不蓋你,真的。最起碼玩個一遍之後,你對地中海週遭的地圖會倒背如 流,這對你以後研讀羅馬史有極大的幫助。

    第三,把鹽野七生著的「羅馬人的故事」(一樣是三民出版)全部精讀。現在中譯本已經出到十一集了,預計出滿十五集。聽名字就知道這作者是日本人。她寫的羅馬人的故事有幾個特點:

    一、夠新。換句話說她可以綜合、比較前人所寫羅馬史的優點,並加入一些最新的史料,彙整到她的著作中。

    二、她不是基督徒。基督徒認為他們被羅馬「迫害」過,所以在面對羅馬史時帶有一種特殊的情緒,比方說,基督徒史學家可能會認為迫害基督徒比較用力的那幾個羅馬皇帝有關的一切都是不好的,其實也許根本沒這回事。也就是說鹽野七生能從比較超然的角度看羅馬史。

    三、以往的羅馬相關歷史、小說或是影集處理的不好的部份,在她手下一樣精采。像是奧古斯都(屋大維)或是幾個有名的昏君在她手下一樣精采。

    四、她雖然是哲學系畢業的,可是寫出來的作品卻帶有經濟學的味道,處處帶有機
    會成本和資源分配的觀念。

    五、她的文筆非常好,寫出來的東西已經有經典的條件,經常能寫出讓人震撼許久的句子和段落。

    不過呢,你不見得要照順序看。你可以先看最精采第四、五、六三集,講的是凱撒和奧古斯都的故事。

    最後當然是把愛德華,吉朋所寫的羅馬帝國衰亡史好好地讀一讀。各位實在太幸運了,萬眾期待的繁體中文完整譯本竟然有人翻出來了,我那天在誠品看到的時候,興奮地立刻打電話通知期貨社的骨灰哩!聯經出版。一共有六卷,目前已經出到第三卷了。

    七、鑽研演化心理學和決策科學

    現在歷史學完了,下一個東西你要學的東西就是科學。科學的部分我在這邊列出兩個東西,第一個是演化心理學。第二個是決策科學。要學演化心理學的。原因是「幫助你了解constraint optimization最基本的形式」。

    在沒有文化、沒有文字、沒有任何法規制度之前,之前只有一個最鬆的、鬆到不行的constraint,就叫做自然資源,氣候之類的天然環境。然後你要optimizatize的也很簡單,就是生存跟繁殖,完全不像現在這麼累,除了名利權之外還要健康、幸福。

    甚 至於你在人跟動物的一個比較當中,你可以發現到這種constraint optimization簡單到不用人的大腦去做,動物(甚至是沒有大腦的那些)也是在做一樣的事情,你可以從演化心理學學到說,由其他動物的觀點來反思 人類constraint optimization行為。也可以從狩獵採集社會中學到人類行為的最基本形式。

    事實上我覺得演化心理學是現有的心理學和各種社會科學中,對人類行為最具解釋
    力的一種。

    這 裡面推薦大家的是兩本書:第一個是蠻有名的「自私的基因」,天下出版,那第二本是「心智探奇」(How the Mind Works, 有興趣的可以上Amazon去讀讀review),一個哈佛教授Steven Pinker寫的,他以前在MIT教書,現在已經被挖到哈佛去了,這本書中文版由CMU CS PhD student 韓定中翻譯中,2005年時應該會由台灣商務印書館出版;大家把這個東西記下來,到時候上市就可以找來看。至於其他號稱演化心理學的書有的已經寫到社會生 物學去了,(甚至還是心理學教授寫的呢!)不推薦。

    第二個你要學的科學就是決策科學,決策科學探討的是為什麼人類作決策沒辦法像數學家或 經濟學家描述地那樣完美。在生命當中每一個轉折你做了什麼決擇,最後 就會決定你的命運,而決策科學是幫助你做更好決策的一門,最重要的學問。這個主題得到了2002年的諾貝爾經濟學獎,大家如果有在注意這方面消息的話應該 知道。

    另外決策科學可以幫助你去解釋,人腦如何去處理機率這個部分,事實上如果你只學會數學家、統計學家所會的那種機率,而不知到人腦是怎麼對機率做出反應的話,你不能說你了解機率。

    You will never know probability until you learned decision sciences.

    我推薦大家的書是「思維與決策」第三版,四川人民出版社出版
    https://wmail6.cc.ntu.edu.tw/horde/services/go.php?url=http%3A%2F%2Fwww.sas.upenn.edu%2F%7Ebaron%2Ftdc1s.png
    這本書是2002年諾貝爾經濟學獎得主Daniel Kahneman在普林斯頓大學心理系講授The Psychology of Decision Making and Judgme

    美商高盛不會教你的事:如何在金融界出類拔粹(上)

    口述、修訂:arbitrageur
    記錄、整理:台大期貨社2004~2005幹部群。社長eikichiyu

    我們第一件要做的事,就是清場

    你們為什麼要來這邊呢?我跟各位講老實話,這是一個非常非常非常無聊的社團。
    在所有類型的社團裡面,學術性社團是最無聊的,而期貨社又是學術性社團裡面最
    無聊的社團之一。所以如果你想要有一個溫馨美好的社團經驗,或是想要找男女朋
    友,結成社對啊什麼的,我誠心的建議你:馬上離開這裡!這個晚上你可以有更寶
    貴的用途。現在想離開的人呢現在就可以背起你的包包,從後門走出去了。

    期貨社誤我一生啊啊啊!!!

    我今天要講的東西前半部分可能大家在或多或少聽說過,後半部分呢,可說是第一
    次發表,請大家多多指教。我今天要講的題目是:

    美商高盛不會教你的事:如何在金融界出類拔萃‧

    Why are You BEING Here?

    所謂出類拔萃的意思是做到CEO之類的等級,首先我希望大家想一想一件事情:
    「為什麼你今天晚上要在這個地方?」這是你這輩子唯一一次的2004年9月29日的
    晚上,你這輩子不會有第二次這個時刻。這個時刻你決定要在這個地方或是在其他
    的地方,再加上以後你也要決定如何消費你的時間,你的生命就因此慢慢變的不一
    樣。

    一開始先跟各位報告一下那個在金融界最核心的三種產業。哪三種呢?大概分成投
    資銀行(Investment Banking, 以下簡稱IB)、資產管理(Asset Management, 以下
    簡稱AM)跟再保險集團(Reinsurance Group, 以下簡稱Re)這個三部分,投資銀行我
    想大家或多或少在那個報章雜誌上聽說過,電視電影裡面也很多。投資銀行基本上
    是這個市場上大部份金融商品和金融服務的生產者,那相對的資產管理公司就變成
    是使用者,也就是說它有多很多到處向投資人募集來的錢,再決定要購買投資銀
    行,或者是他金融服務的生產者提供給他的各種服務。

    迷思之一:投資銀行部是投資銀行的核心。

    投資銀行一般來講會分成三大部門,第一部門是銷售和交易部,那第二個部門是投
    資銀行部,那第三個部門的話是資產管理部。

    https://wmail6.cc.ntu.edu.tw/horde/services/go.php?url=http%3A%2F%2Fwww.gs.com%2Fclient_services%2Findex.html
    https://wmail6.cc.ntu.edu.tw/horde/services/go.php?url=http%3A%2F%2Fwww.morganstanley.com%2Fabout%2Finside%2Forgchart.html%3Fpage%3Dabout

    而銷售跟交易部門才是投資銀行最核心的一個部門。這個跟大家的認知可能不太一
    樣,一般人可能會認為投資銀行部就是銀行最核心的部門,其實不管從哪方面來看
    都不是。從歷史來看,一開始這些投資銀行家在幹麻呢?他們是在頭上戴一個高帽
    子,帽子裡面裝的是什麼呢?是票據。他今天可能用比較低的價錢去買到票券,然
    後他再用比較高的價錢再去把他賣掉,然後他是這個樣子戴著帽子到處服務。慢慢
    演變到後來,我們就把投資銀行叫sale side(低買高賣的銷售業),那資產管理叫
    buy side。投資銀行賣的服務就像是,比方說假設我是投資銀行的sales and
    trading division的人,我就去到處拉客戶說:「你好,要不要來我們公司下單
    啊?」就跟證券商的那些營業員是很像的,只是他銷售的對象是投信(即資產管理
    公司)而已。

    在華爾街和許多金融中心的交易所,交易的方式並不是電腦程式化交易,而是由一
    堆交易員在場內那進行喊價的動作。事實上他在裡面交易的時候,他到底喊到多少
    其實是沒有外人知道。這也是投資銀行他銷售和交易部門的獲利來源(當然現在又
    有越來越複雜的賺錢方式)。比方說假設買方是某間投信公司好了,賣方是sales
    and trading division的人,今天賣方向買方報價時,絕對會跟他講說:手續費幫
    他砍到最低0.01%,那賣方到底要賺什麼?因為就算交易量再大,手續費還是很
    低。乍看之下好像IB還是賺不到什麼錢,其實他賺的錢就是在場內喊的價格和給客
    戶價格之間的價差。因為最後IB到底喊到多少AM沒有人知道?事實上AM也不關心,
    反正你IB就是我AM下什麼單,你IB就負責成交就對了。各位不要小看這件事,當交
    易量極大的時候,要以螢幕上的「市價」成交是很難辦到的事。以上講的是最簡單
    的故事,後來還發展出如風險套利等比較複雜的作法。

    長此演變下來sales and trading division也產出了最多投資銀行業的CEO,只有
    在併購比較興盛的那幾年或是那幾個時期,如1980年代和2000年左右投資銀行部會
    有一些人佔據投資銀行高位,不然其他時候投資銀行的董事會成員,其實大部分還
    是由sales and trading division的人來出任的。(所以各位有志於投資銀行業的
    人請慎重考慮一下要不要去做一下這些sales and trading division的工作。)而
    且sales and trading division他有另外一個好處,就是這個工作和你的家世背景
    相關性會比較小一點。

    相對的,如果是投資銀行部或者是私人銀行部(Private Banking)的話這跟你家世
    背景的關係就很大。就是說進去是靠關係拉生意。所謂關係就是你前人累積的成
    果。請大家不要把關係看成是一個負面的東西,那就好像家族累積下來的資產一
    樣。我要跟大家講的是:如果你沒有關係的話,從哪邊開始起步會比較好。像其實
    承銷之類的投資銀行服務,給幾家大的投資銀行作都是差不多的,不管給誰做,他
    們背後都是整個部門在support。那,到底要給誰做?當然是看交情囉!啊,這個
    是朋友的小孩,就給他做好了。私人銀行服務也類似,如果我家的資產就是從一開
    始到現在通通是給這個人操盤,就繼續給他做下去好了。如果幫我服務的這個人跳
    到另外一家公司,我通常也會跟他過去。

    投資銀行部業務、私人銀行部業務比較和特定員工人脈相關。和公司信譽較無關。

    可是在sales and trading division就不是那麼一回事了,因為從去拉客戶的那個
    叫sales,然後那就下指令交易的這個trader分成好幾關,從在交易室裡面按按鍵
    的人,到交易所交易廳的pool裡面比手勢的那些人,那是一整組人馬啊!哪一家公
    司能夠喊到最好的價格,就是各家公司真正的功夫。所以通常一個人跳了,也就是
    sales and trader如果在公司間跳動的話,他的客戶比較不會跟著他跑。也就是說
    這是一個跟公司的reputation比較有關的部門。

    在Sales and Trading部門你最需要的就是機率思考(probabilistic thinking)的
    能力,和高度抗壓性的人格特質。最近美國前財政部長、也是前高盛董事長的魯賓
    寫的「不確定的世界」(時報出版)裡面對於機率思考的益處有詳細介紹。值得一提
    的是:魯賓以前也是交易員。

    接下來再講的就是投資銀行部,那投資銀行部大家就比較熟悉投資銀行部就是做併
    購、承銷股票,海外公司債這些。在生意很好的時候,比方說在2000年左右或是說
    在1980年那個時候,每一筆案子他們抽的錢大概是交易金額,聽清楚,是交易金
    額,的6%。就是說我要發行100億的公司債,交易金額就100億,那投資銀行部門一
    個team大概是六個人左右,這六個人就去分這當中的佣金,大概會在6%左右,也就
    是六億六億就六個人分。這只是一個case而已,你在報章雜誌上甚至電視電影裡面
    看到有關投資銀行可以賺很多錢的故事幾乎都是這一種的。不過基本上這些大的
    case就這麼多而已,不見得每個人都可以做到那樣子的生意,更何況是之前在網路
    上有一篇新聞,說荷蘭式拍賣逐漸取代傳統IPO做法,傳統投銀的獲利空間變小,
    有興趣的人你可以去網路上看。

    再談談那第三個部門。投資銀行也會做一些資產管理的服務,當然投銀的資產管理
    部人員也很專業,不過或多或少會有利益衝突的問題。比方說雖然其他券商的手續
    費較低,可是這些人還是選擇自家當做經紀商。或者說是當有非常好的交易標的
    時,是投資銀行的自營部利益優先呢?還是這些請投銀代操的客戶優先?客戶不免
    有此懷疑,因此獨立的基金管理公司仍然佔據廣大市場。

    接下來我們要講投資銀行需要什麼樣的人材。大概在前年吧,各家投銀慢慢開始在
    台灣招收比較多的大學畢業生,以財金系的居多,如果你認識這方面的人的話,你
    可以去問一下。那另外一個資訊來源就是他的網站上面他會有一些列出「本公司一
    些代表性的人物」,那代表性的人物你去整理一下,你會發現幾個現象:第一個是
    成員非常的廣泛,然後MBA的比例比你想像中的低很多,不到百分之五十。可是基
    本上他們都是他們那個國家排名前幾名大學畢業的,不管他是什麼主修或者是有沒
    有商科背景都是一樣的。換句話說呢,投資銀行完全不掩飾自己的名校情節。各位
    如果你是讀台大的話呢或者是政大的話你是蠻幸運的,可是如果你是其他學校的
    話,你可能需要歷練一段時間,然後去國外讀個MBA(當然得是名校)再看有沒有機
    會。

    不過他網站上資訊也可能會誤導你,因為這個世界上會跑去唸MBA的兩種最多的人,
    一種是大學畢業就跑去當管理顧問的人,另一種是大學畢業跑去投資銀行工作的
    人,然後讀完MBA之後也是有一大票人再跑去投資銀行工作。這說明什麼?已經進
    去投銀工作過的人會去讀MBA,讀完MBA他們還是想要進去投銀工作,這個是說國際
    名校的MBA學位對於你在投資銀行的謀職跟升遷,其實還是有關鍵的影響力的。不
    過投資銀行說老實話沒有各位想像說的難進,但是進了也不要太高興,因為那一行
    的淘汰率非常非常非常的高。比方說所謂的高盛人,他這輩子當高盛人的日子不會
    超過兩年,這是一個平均數字。那這是不是你喜歡的工作型態?或是你要不要說找
    一家公司、一種產業別說是「從一而終」,至少可以做個五年十年的?你要怎樣生
    活就看你自己。

    再來再談談資產管理公司(Asset Management),又稱投信,避險基金也屬於這一
    類。關於投信是怎樣的公司,我就不再多做解釋了。在這個社會上,資產管理公司
    已經變成很多公司實質上的股東了,可是這筆錢也就是那最後持股的人,已經要算
    到誰頭上已經不知道了,而且大部份受益人的金額都不會太大。換句話說,這個時
    候基金經理人就好像是大股東一樣,雖然那些資金是客戶的錢,不是他的錢,但是
    因為是基金經理人在決定要買者是要賣某一家公司的股票,於是乎他就被奉為座上
    賓,然後投資銀行和各個基金所持服的公司成員,就得定期專門去向這些資產管理
    公司的經營階層和基金經理人報告,也就是說,buy side因為持股多,是被服侍的
    老大。世界最有名的資產管理公司是富達,富達最有名的人大概是Peter Lynch吧,
    不過他已經退休很久了。

    在資產管理公司裡面它也有分很多部門,不過他每個部門拿到的pay跟投資銀行比
    起來,差距就比較大。投資銀行裡面,只有少數的部門拿到的錢是明顯比其他人少
    一節的。資產管理公司裡面,只有基金經理人跟比較大牌的分析師可以拿到很多
    錢。其他的像是行政人員總機小姐或者說是客服人員,這些人拿到的薪水都是比較
    低的。比方說,今天你向大家說:「我在高盛工作。」大家就會「哇!」如果你說
    在富達工作的話,他們就會先問你在什麼部門。至於資產管理公司他要什麼樣的
    人,其實他講的滿明確的,就是要MBA跟CFA兩種都具備的人,那這當然是包括你已
    經有幾年的工作經驗了,可是並不是說只要你有這兩項資格就進得去,因為資產管
    理公司相對於投資銀行而言,他是一種比較穩定的工作,也就是說離開的人比較
    少,那進去的人當然就不可能多。不過你進資產管理公司的話,你的生命會比較有
    品質一點。

    不過也別小看這些起薪低的人。在資產管理公司裡面,升上高階管理職的人,很多
    都是客服部門出身的,這其中原由其實大家可以好好推敲,因為,我自己是猜想,
    他們比較了解、比較貼近客戶的需求,就是說比起基金經理人,他們們了解客戶。

    接著我要講的第三種公司就是再保險集團。真正超大的那種再保險集團是很恐怖
    的,我大概給各位幾個數字。比方說幕尼黑再保集團,可以在一年裡面收40億歐元
    的保費,你可以換算成台幣,現在的話大概是1600多億,那他的員工人數不多,只
    有40000人而已。像911這種事件的話,他一次可以賠掉20億美金。不是說他整年賠
    的,而是說光是因為911事件就可以賠掉20億美金……的這種大集團。這些再保險
    集團、很多名字,各位在國內可能很多連聽都沒聽過。

    保險公司,不論是產險、壽險或是再保險,最大的特點是在於:他是唯一一種可以
    固定收到成本為零甚至為負的資金的一種行業。那如果你不知道什麼叫做成本為零
    或是成本為負的話,你可以把市場上的定存利率想成成本為零的那條線,假設這市
    場上的無風險利率就是3%,那代價是3%的錢就是叫做沒有成本,如果你能用2.5%的
    代價就能借到錢的話,或是收到錢,那就叫做你可以收到成本為負的資金。保險公
    司正是這樣的一個行業。各位應該沒有人不知道華倫巴菲特的吧!華倫巴菲特他手
    下大概有幾十家公司,那其中保險事業對他每年貢獻的現金,我講的是現金,就占
    了他整個集團的一半。那他就是拿這些成本很低甚至是負的錢,再去投資其他公
    司。保險公司投資其他行業的法令已經慢慢地要鬆綁了。你們大概也知道,新光金
    和台新金,就是吳家嘛,吳家是從保險集團開始壯大,光是吳家就已經產生兩家金
    控,那蔡家也是兩家,富邦跟國泰其實一開始也是靠這種保險業,那他們再慢慢從
    保險那邊收到資金去擴及到其他各行各業。

    可是因為保險公司的薪水比較低、升遷比較慢(相對於證券業和銀行業),所以他吸
    收到人才的素質一直不如資產管理公司及投資銀行。可是如果法規繼續鬆綁,我的
    意思是說,因為保險公司他的資金成本極低,股本和現金又多的一個特性,只要法
    令鬆綁,他在併購的時候他反而會取得一個主導的位置。你可以想像一個最極端的
    情形,假設今天法令鬆到我們可以從保戶身上收來的錢去進行惡意併購的話,那會
    是一個怎麼樣的世界?

    結論就是呢,在法令慢慢鬆綁的同時,保險公司在未來的金融界甚至各行各業,影
    響力會越來越大。那最明顯的一個例子就是柏克夏哈薩威集團,就是保險公司很容
    易變成一個跨領域的控股公司的一個核心,這就是保險公司在未來世界的一個價值。

    接下來再跟各位分享一下保險公司它裡面工作的人大概有哪幾種。第一種人就是數
    學跟統計專家,一般來講我們都會用精算人員去稱他。那精算人員做的事情就是
    「決定某一種風險值多少價格」。至於算法當然千奇百怪,不過這是一個非常非常
    古老的行業,大概已經有上百年了吧。你要做這種工作的話,其實很簡單。第一個
    就是你要通過精算考試,如果你是在美國、英國跟亞洲大部分地區都是這樣子。雖
    然在歐陸有一些地方他們是用學位跟工作經驗,就是說某些學校的學位跟工作經驗
    去培養精算人員。不過我想以大家未來發展可能性來講的話,考試還是比較快的方
    法,不然你要去歐洲唸那些學校成本也是很高,而且你不能從現在就開始做準備。
    除了通過精算考試之外,你還要有基本的程式寫作能力,你的程式寫作能力不需要
    像IT人員一樣的高深,可是基本的程式寫作能力是必要的。最後你還需要有那種生
    意人的特質。應該這樣講好了,有人說混得不太好的精算人員,美國有一種名詞去
    形容他們,叫"number crunching people",就是在咀嚼數字的那種人。比較好的
    精算人員或最後能夠晉升高階管理階層的,其實是具有生意人特質跟個性的那種
    人。如果你不知道什麼是生意人特質跟個性,你就想像業務員就對了。不過同時具
    備這兩種特質的人很少,如果剛好就是你,可以好好考慮一下保險公司。

    另外就是需要科學家跟工程師。這兩種人到底在幹麻?仔細想想,什麼是最難的或
    最有趣的保險,我在這邊可以跟大家報告一下:比方說是恐怖攻擊險,或者是類似
    瘟疫的那種險,就是重大傳染病的那種保險,而且是一次就會死很多人﹔或者說是
    氣候變遷險,比方說是如果海水溫度還再上升個一度的話,那會怎麼樣?怎樣的產
    業在怎樣的國家會有怎麼樣的損失,或臭氧層的破洞再變大一倍的話會怎麼樣?然
    後還有就是……像是什麼藥如果你長期使用之後或大範圍使用之後會有什麼副作
    用?比方說如果這些抗生素你再拼命用,那到最後所有細菌都不怕抗生素了,那怎
    麼辦?這些風險到底該怎麼樣轉換成保險用語?那種國際再保險集團他們會雇用科
    學家定期監看各種科學期刊,他們會組成一個小組去決定說什麼東西大概值多少價
    錢。像之前我看到一個報導他說,氣候變遷將會使全球損失三千億美金,不過我不
    知道這個東西怎麼來的,但他們就算得出這個數字。那這個當然是科學家和精算人
    員合作的一個結果。

    那工程師的話就是,其實很簡單嘛,比方說北京奧運的場地,那北京奧運的場地,
    他這個地方這個東西,比方說你保額就是它的建造費用的話,你這個保費到底要定
    到多少?蓋的時候有沒有偷工減料,或是設計的好不好,或是其他週邊的各種因
    素,就是所謂的工程的專業知識有在裡面。這個東西你要怎麼換成保險的術語跟價
    格?這是工程師在保險公司的一個作用。

    還有就是財務跟經濟學家。像現在大家比較熟的一個詞就是財務工程,也就是說現
    在衡量風險的方法比起以前要複雜很多,有一些已經不是傳統精算人員能夠做了。
    所以保險集團裡面有些這樣的人。那經濟那不用講了,就景氣上上下下,或投資熱
    潮從中國移到不知道是哪一國,哪些國家會有怎麼樣的風險……。還有就是律師,
    有些律師是幫忙準備訴訟用的,有些是幫忙定保單用的,因為真正那種大額的保單
    上,每一條規矩、每一條限制到底相對是多少風險的調整,多少的可能損失,萬一
    上法庭可能有什麼樣的結果?這部分都需要律師的加入。保險公司裡還需要IT人
    員,當然就是搞電腦的,這就不用說了。

    那另外一種人叫做underwriter,他在投資銀行裡面叫做承銷人員,但在再保險集
    團裡面他叫做核保人員,他在再保險集團裡面有關鍵性的地位,他是再保險集團裡
    面做生意的那種人。To insure or not to insure, that is the question……就
    是underwriter在做的事情。他們做的事情就是比方說一個非常大額的保單,你要
    保還是不保,或者說是條約裡面有沒有哪一條要修改,或者說是價格如果比對手高
    的時候,萬一我們提出來價格比對手還要差的時候,你是不是能夠當場立即反應知
    道成本是多少?能不能夠把價格降下來,這就是underwriter在做的事情。那你要
    做underwriter的話你需要比在投資銀行或資產管理公司的人比較好的數學能力,
    和不比他們差的做生意的本事。這種人坦白講不多。各位有機會的話,可以再多研
    究一下underwriter這個工作。

    再來我就要講說,你要在金融業發展比較一般化的走法。其實很簡單,就是拉高你
    的大學成績->學好英文->申請國外英語系國家交換學生->進外商暑期工讀->進外商
    當分析師,或是所謂大學畢業能夠做正職。接下來就是過了三五年去國外讀個MBA,
    接下來進外商申請那種MBA讀完能做的那份工作,一般而言叫做associate 。可是
    我蠻懷疑說,在場的各位有多少人能走這條路的,因為路很窄,位子很少,非常非
    常的少。所以如果你還沒仔細考慮過其他路線,接下來可要仔細聽了。

    我們在金融界到底在幹麻?我們做的事情其實就是constrained optimization。也
    就是在限定條件下最佳化你的表現,要表現的比你的對手還要好。你可以想像是奧
    運,每一項比賽都有他的比賽規則,你怎麼在這比賽規則之下鍛鍊你自己,能夠在
    需要的時候表現得比你對手還要好。那在古時候要做這種事情其實非常簡單的,基
    本上你只要會加減乘除會看財務報表,特別是那時候電腦還沒出來,憑人腦要做即
    時的連續時間函數的運算那是不可能的事情。甚至你現在看起來用excel能很快算
    出來的東西,在那時候就要一組精算師或一組數學家算個好幾天呢!現在在保險
    業,你需要用到應用數學、應用統計統計的知識,和要會使用一些保險相關的套裝
    軟體。如果是現在滿紅的財務工程的話呢,那就更麻煩了。你需要寫程式然後及時
    代入交易所給你的報價,然後解那個隨機微分方程。你怎樣解的比你的對快、比你
    的對手好,先比你對手快一步做出正確方向的投資決定,你就可以打敗你對手了。

    面對這樣高度複雜的狀況,專業還是最基本的,因為現在這種現象已經變成是......
    當代財務學是建構在數學和電腦之上的一門學問。這些所謂硬功夫的各種專業是最
    重要的事情。大學的時候或研究所階段如何修習相關課程呢?我想這是跟各位比較
    有關的部分,也就是你要怎麼準備你未來的人生?大學你修課的時候要以此方向為
    準則。這個部分我在板上有po過三種參考的課表,各位可以回去看一看。簡單來講
    就是數學電腦經濟會計這些東西,再往上有財務工程和金融計算,最上有連續時間
    財務之類的東西。

    總而言之,想在金融界闖盪,如果沒有堅實的專業能力,就像是赤手空拳在叢林裡
    搏鬥一樣,還能活著,純粹是靠運氣。請大家務必把握時間,加強自己的專業能
    力,不論是計量還是程式能力都好。

    講到這邊不知道大家有沒有什麼問題呢?我問大家一個問題:有兩種人,數學電腦
    很厲害,在世界上非常有名,這兩種人是哪兩種人,不知道有沒有人知道?第一種
    人叫做華人,華人意思就是中港台,你也可以算進新加坡。第二種人就是印度人。
    我這樣講你可能很快就想起來,這兩種人數學和電腦的功力在世界上都是有名的,
    在矽谷的部分不管是軟體還是硬體都有相當好的發展,我不敢說這兩種人已經支配
    全世界的IC產業,但基本上他們在IC產業的表現大家已經是有目共睹的。甚至有人
    把所謂的IC industry叫做India China Industry。現在問題就來了。為什麼金融
    業不會是另外一種、至少現在還看不出來,不是另外一種IC產業?為什麼印度裔的
    人跟華人在金融界的表現還沒有非常突出,那反而是猶太人在這個領域如此出色?
    到底是為什麼?猶太人到底是掌握了什麼?或者我該這樣講,猶太裔的銀行家到底
    掌握了什麼,使他們今天在金融界有這樣的地位?我們的目標是不是應該要放在學
    習猶太銀行家成功的秘訣?那這個秘訣到底在哪邊?其實我剛才已經把答案寫在黑
    板上了。秘密就在……像這個時候就要來一段工商服務了。馬上走開,不要回來!