我所参与的英国金融市场

(写这篇绝不是为了显摆我能炒股或如何,实际上最近亏损严重。其主要目的是说说那些和国内不一样的,甚至在国内所不能想象的金融市场和工具。不得不说只有在像英国这样的市场完善国家,投资才看起来是一件还算靠谱的事情,因为总能有合适的方式把闲钱投出去。问题则回归到投资是否理智的本质问题而非无处可投的窘境。)

进入股市是最近两年的事情,主要驱动力是认为投资对于我们这代人来说是不可避免的。经济高速发展(相比上几百年这是显著的),钱的平均贬值速度也是很快的(钱不贬值则会阻挠经济发展速度,金本位解体和美联储的不断宽松政策就是证据)。这些从某种角度说是提高人均生活水平,但其实也是在不断损害存贮者(saver,总是保持存款而非习惯性贷款的人)的利益而将他们的钱慢慢分给众多的借贷者(总是贷款的人)。这个问题复杂了,暂且这么说,我的理解也不一定对。中国人大多是存款者(中国有世界上最高的平均储蓄率),另外中产以上的人大多也是存款者(某种意义上)。如果不想成为月光族,仅靠工资和银行存款在长期来说是很吃力的,总有一天会发现年收支剩余(可存款部分)和银行利息会处在同一个数量级上。再考虑到实际货币贬值率大多时候高于基本利率(钱总是在贬值),仅依靠存款,总资产的增长速度只能是条减速曲。如果想保持匀速(且不谈加速),长远看动用回报率高于存款的其他投资工具就是不可避免的。既然终将要会,早作准备,笨鸟先飞。

中国现有的投资包括房产、黄金、基金、股票和市场衍生品(期货和股指等)。房产其实是最安全的,因为它在长期一定是增值的(钱在贬值,账面增值,但实际价值可能是贬值),能抵抗通货膨胀,并提供日常住所,相当于固定利息。但是现在中国的房价偏高,房产只有70年所有权,就不好说了。黄金是抵抗通货膨胀的好东西,但是就实际价值来说一定是贬值的(黄金产量为正,供给恒正)。基金基本是一揽子股票的加权,基本是找个公司帮你玩股票,降低风险,是中国普通人除存款外最容易投资的东西。股票则风险更大,投的公司不对,资不抵债退市则血本无归。衍生品则更是高风险。

就这些选择来说,平均回报(不考虑市场波动,比如说房市泡沫等等),个人觉得黄金比存款还糟糕,房子和基金也许比存款好,但只有基金、股票和衍生品等好过实际贬值率。(说白了,你如果能在这些东西上挣钱,也就是当个坏蛋从傻瓜或保守存款者手中拿钱。)中国的问题是这些工具不完善,不灵活,同国际市场脱轨(来英国后发现的)。

比如说股票和基金,在英国交易商注册一个账户,就可以交易英国本地的股票、基金、公司债券、政府债券。不过,简单设置后(签署写税务表格等等),就可以交易欧洲和美国市场上的股票,比如德国法兰克福、法国巴黎、纳斯达克和纽约华尔街等等。(这些就让我吃惊过,没想过作为一个普通投资者可以做跨国投资。)如果使用英国的衍生品交易,比如CFD和Spread Betting(后面会说),则可以用差价投资股票、股指、期货、外汇和大宗商品,获得1:10的杠杆效应,并可做空。这些在国内也是不可想象的。

说些具体的:

英国股票。在英国买股票需要向交易商申请一个股票账户。交易一笔股票需要交佣金和印花税,其中印花税一般是0.5%的股票价值,只在买入时收取。佣金按次收取,一般和交易额无关,买卖皆算,一般是单次8到18镑(散户价格,各公司不同,频繁交易的话会便宜些)。总的来说佣金要比国内高很多,所以导致单次交易金额会高很多。以单次买入1000镑股票算,买卖佣金和印花税就会占到2~3.5%的成本。如果单次交易少于1000镑,则会更高,显著减少收入。另外,股票买卖最小单位是股而非手,因而可以只买一只股票的一股,然后再卖一股。

CFD(Contracts for Difference 差价合约)和Spread Betting则是在英国使用最多的两个金融衍生品。先说CFD,它允许投资者用少量资本买卖大量股票(杠杆效应)。假设杠杆1:10,投资者即可用40镑买入100股价格为4镑的股票,其中40镑为买10股的价格,同时作为给交易公司的定金,剩余的360镑将由交易公司代付。如果股票增值5%到4.2镑,100股将收入20镑。如果卖出,则获得60镑(40镑本金加上20镑收入),实际收益50%(5%的10倍)。这是好的,但跌了就麻烦了。如果跌5%,那么100股变成380镑,此时卖出则收回20镑(40镑减去损失20镑),实际损失-50%,同样是10倍杠杆。付给公司的40镑实际上变成定金,保证交易公司不用承担投资者交易的亏算总额。1:10的杠杆则代表当股票跌掉10%,定金将被消耗光,股票将会被自动抛出,同时投资血本无归。

同时,CFD也可做空。假设你估计一支股票会跌,你可以用40镑先卖出100股那4镑的股票,交易公司会卖出100股并获得440镑(400镑的卖出和40镑的定金)。如果真的跌了5%(3.8镑),你需要用买入100股来结束交易,那么公司将买入100股,使用了380镑。卖出时的440镑减去买入的380镑,剩下60镑返还给你,则导致50%的实际投资收入。同样,如果先卖出,然后股票上升则会导致投资亏算,当上升10%会导致股票自动买入,投资血本无归。

在这些方面,spread betting是一样的,都可用来杠杆买卖股票。它们的不同在于交易公司的作用。CFD的交易公司会真实地按投资者的要求去买卖股票,所以交易对于股票市场来说是真实的,投资者的要价会公布到股票市场并影响股票走势。spread betting这是交易公司的内部交易,交易价格会跟随市场价格但不会影响市场价格(相当于投资者在玩一个虚拟股市)。交易公司通过更大的价差(买价和卖价差)获取差额,同时投资者的损失也会进入公司收入。也是由于这个原因,spread betting在英国算赌博,而CFD不是。当然Spread betting也有好处,由于它是赌博,所以不用上交资本升值税(用资本获得收入年10,000以上部分要收税18%到25%),同时交易没有佣金。

在国内就听说过杠杆,但在英国你可以实际自己使用杠杆。如果抱有投资一定导致收入的态度,那么杠杆一定是邪恶的,因为当投资失败的时候,巨大的损失一定会导致精神崩溃。不过,如果将CFD的投资和真实股票投资同等看待,而不去故意使用杠杆,CFD其实是比实际股票更好的。买入时的1:10杠杆并非定死,通过主动注资,可将杠杆降到1:1(即和实际买入股票一样)。由于实际买卖股票的是交易公司而非个人,交易没有印花税,CFD交易的佣金也较低。

举这么个例子,一个人用1000镑买4镑的股票250股,然后在一个月后以4.2镑价格抛出,收入为50镑的增值减去佣金和印花税,实际收入大概30镑。1000镑的成本获得3%的增值。假设股票的止损在20%(长期持有的止损一般在15%),即股票低于3.4镑时会抛出止损。那么实际需要的保证金是200镑(20%的止损)。用CFD来做,可以用100镑买入250股4镑的股票,然后主动注资100镑降低杠杆到1:5,同时将自动卖出点降到了20%。然后一个月后以4.2镑抛出。获得50镑的收入。CFD的佣金大概会有5镑,实际收入45镑。200镑成本获得45镑收入,12.5%增值。可以看出,在相同的20%止损条件下,CFD也会显著减小投资成本。只要止损点够低,杠杆效应被降低到安全程度,CFD一样是安全的。

其他的还有股指、外汇和实物,解释起来就更不好懂了。先说这么多吧。总的来说,英国给普通投资者更多的选择,个人也有可能去使用复杂的交易工具,当然风险自担。那些在国内只听说过的东西,在英国这里都变得实际可操作了。

PS:国内也是有好处的,想在国外找个能看JDK曲线的免费软件那基本是不可能的。而国内的股票软件如果没有这些技术曲线基本也是没人用的。

关于语法分析器

最近的工作导致我学习了好些编译器相关的知识,也接触了些语法分析相关的编程工具。基本上相关的编程已告一段落,于是是时写点小结了(生活平淡无趣,也好久没写东西了,最近也许会再写点)。

编译器说白了,其实就是个计算机语言转换器:将用一种语言编写的代码变成另一种语言的代码。比如GCC,其实就是将C代码变成机器汇编代码。一个完整的编译器一定会包含几个基本模块:语言解释器(Parser)、优化器(Optimizer)、目标代码生成器(Object Code Generator/Mapper)。其中语言解释器负责读入并理解输入语言;优化器可能对代码所描述的行为针对目标语言做一些优化;最后目标代码生成器将优化后的行为用目标语言描述一遍并输出。

我的工作是读入硬件设计语言Verilog HDL,做一些优化然后重新输出Verilog HDL。所以主要的工作在于前面两项,解释器和优化。目标代码生成基本就是简单打印输出。

语言解释器本身也有内部结构:预编译(Preprocessor)、语法分析(Lexical Analyser)和语意分析(Syntactic Analyser)。以C语言为例,预编译会处理所有的宏语句,比如条件编译#ifdef,头文件#include和宏定义#define等等。预编译的输出基本就是不包含宏的C语言文件(但仍有一个宏会出现:#line,用于标注预编译后文件与源文件的行号对应,否则GCC的报错信息就没有错误位置了)。语法分析则会检查输入语言的语法是否正确:比如括号是否对应、标识符是否合法、操作符是否都有操作数、类型定义是否合法、标识符是否有类型定义等等。如果语法正确,语法分析还负责将输入语言划分为语义分析所能理解的单词(token)。语意分析是最复杂的部分了,它负责理解所有的单词,并将它们转换为抽象语法树(即将所有单词存放入一个由语义关系构造的树形结构)。比如,语意分析会检查一个类型是否没有定义,操作符和操作数的类型是否不一至,一个表达式的左值是否不可修改或者一个函数是否返回了错误类型。

总的来说,语言有着不同的分析难度。语言的语法和语义特性决定了它们相应语言解释器的复杂度。比如,我们可以将计算器的输入理解成一种语言,该语言就非常简单。它不需要预编译(没有宏),甚至不需要语意分析(只有数字和运算符两种类型)。一个语法分析即可得出答案。如果计算器支持表达式输入就会复杂一些,语意分析就需要了。比如2+3*5,语意分析需要知道*的优先级比+高才能得到结果。同时()的出现也导致复杂度的提升。再往上,某些计算器还支持变量、函数,这便引入了存储和变量,一个表达式的求值不再简单取决于表达式本身。编程语言就更复杂了,简单的Basic语言支持引入库,则可能需要预编译。同时数据出现了类型,比如数和字符,语意分析则需要判别每一个变量的类型是否正确。C语言就更复杂了,结构体的出现导致用户能够自定义类型、语意分析需要学习所有用户定义的类型才能工作。C++则又把问题上升一个级别:typedef的出现导致一个类型可能有多种不同名称;namespace导致类型出现了作用域;子父类继承关系导致一个目标类型可以使用所有的父类类型,出现了类型的一对多关系。我现在所能想到最复杂的语言系统可能要数Haskell为代表的函数式语言了。它们支持类型自动推导,即表达式本身不许要一一标注类型,类型可根据调用关系动态指定和推断。

说到这里,你应该意识到类型是一个多么重要的概念。讲编译器的书往往会花大量章节讲不同的语法,比如语法是否有递归,是否需要大于1的预读取(lookahead)。但一旦涉及到类型,语法的那些复杂度就一下子变得小儿科了,因为大多数递归型语法可换成非递归的,大多数预读取问题可用更多的语法解决。但用户可自定义的语法则代表语言解释器需要自学习!在这个方面,我现在还是相当无知。好在Verilog HDL并不存在用户自定义类型,我现在还不需要处理这块大石头,但很可能将来需要(很可能我将读入VHDL,VHDL支持自有类型定义!)。不过我要说,这一块的水很深,慎入!!:-)

在工具方面,我现在用Flex+Bison处理Verilog,Boost.Spirit处理命令行解释和pugixml处理用标记语言(marking language)存储的数据文件。

针对复杂语言,基本需要解释器自动生成工具,比如Bison和ANTLR。它们都需要用户用语法描述语言定义目标语言的语法和语义。工具则通过这些语法描述自动生成一个语言解释器。这样做的好处是将代码编写的问题转嫁给了工具,但单独编译导致了语言解释器本身非常静态。在这方面,Boost.Spirit就允许用户动态定义语法,因为它本省就是一个C++库。不过它的编译速度可不敢恭维(大量使用范型STL的结果)。

对于标记语言,现在的工具基本已经傻瓜化了。我用的pugixml就是一个轻量级的XML解释器,能自动生成语法分析树,完全不用动脑。

不知我这半桶水的理解是否正确,不过用近一年的时间就从没学过编译器到独自写了个Verilog语言解释器我还是挺满意的。