Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

C# 已经成为自动交易的标准了?

交易一直在用的 Multicharts 用的语言是内置的 EasyLanguage。昨天这个软件发布了 .net 的版本,也就是 Multicharts .NET,和前者的区别在于可以使用 C# 作为策略和指标的编写语言了。

稍微查了查,发现几个比较有名的自动交易软件(比如 Ninja Trader、SmartQuanter)都是支持 C# 的,估计 Multicharts 也是被逼的吧 XD。难道 C# 已经成为自动交易的标准了吗?

一开始我以为只是语法仿照 C#,试用了一下发现是原生的 C# 程序(或者说库),编译后直接运行在 .net framwork 上的,这样的就有些优势:

  • 可以直接调用 .net 库,也可以调用第三方库,基本上现在可以在交易程序里面干任何事情了。
  • 可以直接用 Visual Studio 来编辑和 debug 代码。
  • 可以直接调用 GDI 来高效率绘图。

而 EasyLanguage 只可以在程序里发交易单和数值计算而已,也没法获得账户的详细的信息。

也就是说 C# 版本相当于提供了更底层的操作,所以如果你觉得 EasyLanguage 的功能太少,又不想自己去翻 broker 的 API 文档从头写程序的话,那么这个 .net 版本是非常不错的选择。

虽然我目前的策略都很简单,EasyLanguage 完全可以胜任,不过我还是很有兴趣用这个 .net 版本弄个类似 “如果开仓了就在 Twitter 上 @ 我一下”  的功能,肯定非常有趣呐~

 

当然用 C# 做更底层的操作,也是有代价的,那就是代码的复杂度上升了。

比如,突破前 n 日高点买一手,用 EasyLanguage 编写的话就是这样:

input: Price( High ), Length( 20 ) ;

Buy 1 share next bar at Highest( Price, Length ) + 1 point stop;

相信即使是不懂 EasyLanguage 的人,也能大致看懂这个代码是什么意思吧~

但是如果用 C#,看起来就像这样:

using System;
using PowerLanguage.Function;

namespace PowerLanguage.Strategy
{
    public class Channel_Breakout_LE : SignalObject
    {
        private ISeries<Double> m_price;

        private int m_length = 20;

        private HighestFC m_highestfc;

        private IOrderPriced m_Order;

        public Channel_Breakout_LE(object ctx) :
            base(ctx) {}

        private ISeries<Double> price{
            get { return m_price; }
        }

        [Input]
        public int length{
            get { return m_length; }
            set { m_length = value; }
        }

        protected override void Create(){
            m_highestfc = new HighestFC(this);
            m_Order = OrderCreator.Stop(new SOrderParameters(Contracts.Default, "ChBrkLE", EOrderAction.Buy));
        }

        protected override void StartCalc(){
            m_price = Bars.High;
            m_highestfc.pricevalue = price;
            m_highestfc.len = new Lambda<Int32>(delegate { return length; });
        }


        protected override void CalcBar(){
            m_Order.Send((m_highestfc[0]
                               + (1*Bars.Point)));
        }
    }
}

……囧

如果说 EasyLanguage 即使是不懂程序的人也可以看两天就上手的话,那么这个 C# 版本的肯定只能是程序员的菜了。

好歹前两年也写过几个 .net 的程序,翻出书复习一下 C# 先~

期权初感受

 

从去年 10 月份看一本期权书开始,一直持续不断的接触这个东西,越接触越觉得复杂,很多方面和想象中不一样,虽然现在还是没有弄出个所以然,但是还是有些感受,这里就简单记录一下吧。

期权不擅长做什么

期权的定义这里就不再重复了,如果只看定义的话,多数人肯定会认为期权主要的功能就是:

  1. 利用高杠杆获得超额收益。
  2. 提供低成本的资产保护。

不过很囧的是,接触到现在,我感觉期权最不擅长做的事情,就是这两件事。

不管是想获得超额的收益也好、还是想以低成本保护资产也好,都要使用价外期权,而期权都是有到期日的,如果在到期日之间价格没有如预期的发展,期权的时间价值就会慢慢流逝,除非在你入场后价格大幅变化,否则很难实现收益。

如果是市场已经大跌再去买入期权做保护的话,期权又会包含太高的隐含波动,基本上都是不划算的买卖。

所以单纯的买入价外期权,想获得高收益的,和买彩票的感觉差不多;如果是提供资产保护的话,那只能应对黑天鹅行情。

期权擅长做什么

那期权擅长做什么呢,暂时感觉有两个:

  1. 做平。
  2. 做希腊字母。

在接触期货之前,我只做过股票,而内地的股票又是只能做多的,所以即使在熊市,当初也满脑子想着做多(和现在还在做股票的同学状态差不多XD),后果是什么大家也都知道了,而这一切的原因仅仅是不知道做空的方式而已。此外,想必去年做股指期货的同学都会收益不错吧包括我自己,其实只是因为股指期货可以做空而已,赶上了空头的“牛市”而已。

所以,有些时候多一种选择是很重要的,而期权就提供了做多做空之外的第三种选择:做平

从单纯的 Credit Spread 到 Iron Condor、Double Calender,期权的做平方式真是多种多样呐,每种都适合不同的市场状况。在使用这些策略的时候,脑子里不用再考虑市场会到哪里哪里,反而变成市场 不会 到哪里哪里,相比预测市场会到哪个点位,预测市场不会到哪里要轻松得多,再加上使用这些策略的时候时间的流逝反而对你有利,所以在大部分的时候都是比较轻松的交易。

做希腊字母我只接触了一点,比如简单的 Vega play 和 Gamma Scalp,感觉比做平策略更加的价格无关,如果想单纯的做市场情绪的话,也可以通过做希腊字母来实现。

一些误区

卖方恐惧症

即使是上面那些做平的策略,也都包含期权的空头,更不要说去卖裸期权了,很多人都听说过期权的卖方被黑天鹅事件搞得倾家荡产,或者是赚 100 次 1 次就赔回去云云,所以都对期权卖方不那么感冒,实际上还是有一些夸张了。

的确曾经有机构因为卖期权然后遭遇黑天鹅而倒闭,但是这主要的原因还是因为他们可以 无担保的卖出大量 期权,而这对散户来说是不可能的,举个例子:

  • 我在 IB,卖出一张 ES (小标普期货)的下月价外 Put,IB 要求的保证金是 6055$。
  • 而我如果直接多一张 ES 期货,保证金只是 5000$。

而 Put 卖方的最大损失肯定不会超过期货多头,也就是说,在这种保证金要求下,卖 Put 还不如直接多期货的风险大,所以和期货一样,仓位才是决定风险的主要因素。

死撑到期

估计很多人包括我自己在内,在看过那些做平的中性策略收益图后都很失望,比如 “最大收益才 20%,但是最大亏损一定是 100%”,基本上都是小赚大赔的模式,和期货的“限制亏损,放飞盈利”的理念太违背了。

这也是没办法的事情,因为中性策略都是靠高胜率而不是盈亏比,只要最终的期望值是正的就可以了。

不过,这样就会让人认为,使用这些策略,就应该入场之后死撑到到期日那天,其实没有人规定了非得这样做!在到期日之前,随时感觉状况不对都可以出场,虽然死撑到到期日,胜率会高一点。

也就是说,书上的那些期权策略,都只是工具而已,真正的策略是你叠加在这个工具上的进出场策略,自己来调节胜率和盈亏比。

期权的缺点

期权的缺点也是很明显的,目前感觉有下面这几个:

选择太多

唔,这个其实是优点,不过很容易变成缺点。对于期货来说只有多和空,而期权光做平的策略就有那么多,就算定下来策略,到时候还会出现 “用哪个到期日的期权好呢”、“卖哪个 Delta 的期权呢” 类似的问题。要不拿不定用那个策略好,要不拿不定使用哪个价位的期权,完美主义者基本上直接就疯了 -_-。

价差和流动性

其实期权这个东西即使在外盘也不是什么热门的东西,玩的人也不多,所以很多期权的流动性都不是很好,导致买卖价差比较大。现在流动性比较好的大多是股指期权,而商品期货的期权流动性就远不如股指期权了,有时候在商品期权上做个简单的价差都比较困难,使用对应 ETF 的期权也许是个解决办法。

而且就算是股指期权,使用大于两个腿的策略也会受到价差的影响,基本上短期的多腿策略都很难建,只能去做中长期的了。

难以回测

难以回测体现在两个方面,一个是很难搞到期权的历史数据,因为涉及多个价位和到期日,即使是每日收盘价的数据都很多,更不要说日内的报价了。第二个方面就是策略难以描述,或者说难以程序化,比如“在隐涵波动率较高的时候去卖出 40~70 天到期,delta 0.1 左右的 Iron Condor”,里面含糊的部分太多,而且有的时候理想的价位根本没有报价,还有的时候符合条件的组合最终的收益太低(被价差吃掉了)。

所以很难像期货那样,想出一个策略,就可以写个程序在历史数据上跑一下,也就是说即使有策略,不实盘交易也很难知道这个策略到底如何。

 

其实我早就开了一个单独的期权账户,想练习一些中性策略,但是也就是因为上面这些缺点,让我迟迟没有动手,要不就是因为制定出来的策略模糊的成分太多,要不就是因为对策略本身没什么信心,总之就是心里没底啊 ╮(╯▽╰)╭。

展望一下

总之,感觉期权还是非常有价值的工具,虽然比较复杂,但是也许有时候不用搞得那么复杂,和期货策略一样也是越简单越好吧。

接下来除了实践中性策略之外,我还想用期权改善现有的一些期货策略,实际上这个从二月底就开始实践了,不过效果还是比较勉强,现在只能继续观察和记录数据了。

估计会爆掉不少资金来做实验,不过我还是觉得值得的,还好自动单那边比较给力,学费还是有的 :)。

 

全面转做外盘 - 2012 上半年自动单总结

自上次自动单总结又过去了半年时间,这样算下来,已经完整的执行自动交易一年了。从开始的时候觉得神奇,到现在已经习以为常了,反正让它跑着就是,虽然如果自动单有仓位就老去瞄盘面的坏毛病还没改,但是自从晚上开始锻炼和凌晨玩大菠萝之后就改善多了~

内盘的股指期货一直犹豫要不要再开始做,最终还是放弃了,上个月把内盘期货账户最后的一点资金转到外盘去了,所以现在就正式全面的转向外盘了~

其实内盘的股指期货(IF)还是很好做的,放弃无非就是因为几个原因:

  • 内盘的自动化交易软件还有点不靠谱,如果是手动盯盘做,按照去年的经验,基本上等于 “浪费睡觉时间+承受多余的压力+增加执行错误”。
  • IF 的合约规模对我来说有点尴尬,如果小上一半就好了,希望以后能有 mini IF。
  • 保证金、滑点、手续费都没什么优势。

外盘还是使用原来的程序,参数也没有改,只是 3 月份下线了玉米,将小罗素换成更好的波动率期货,然后将小恒指都换到大恒指。

先来看看下线的玉米:

相当囧的曲线,谁能想到去年感觉最稳定的玉米,从今年一开始就回撤呢,最终在 3 月份停单,农产品周期性的交易不活跃是原因之一。

 

然后是小罗素的后代波动期货:

在上半年跑出了漂亮的曲线,收益大部分都是它贡献了,上半年最后一天的交易还将自动单账户净值收在新高,真的是非常走运。

 

然后是老朋友恒指 1 号和 2 号,今年这两个品种都陆续从小恒指换到了大恒指:

1 号:

2 号:

1 号贡献了自动单另一半的收益,2 号虽然很囧但是也算 OK~


 

总结

要说遗憾,那就是依然没有想出什么新的策略,好在现在用的这个看上去适用性还不错,就顺其自然的让它工作下去吧~

每笔交易的平均风险为账户的 3% (恒指 1 号为 3%、2 号为 1%、玉米为 2.5%、波指为 5%),上半年最终收益为 77%,看上去还不错,不过最大回撤也达到了 20%。

要说自动交易做成这样,是属于不错呢还是差强人意呢,我也不知道该如何评价,我只知道我在 2 月底开了个账户手动操作,虽然属于实验性质,但是忙了 4 个月的收益是 -6% ……

所以这东西依然比我自己做要强得多得多。

 

 

最后附上一张图片,这是平常记录的盈亏序列,有兴趣的可以瞄瞄,现在回过头来看觉得非常有趣 ~

红色是止损,绿色是超过止损的收益,黄色是小于止损的收益或是小于额定止损的损失。

 

 

 

 

 

 

 

大菠萝终于来了

找了半天才找到多年前的这篇文章,竟然已经过去 4 年了……

这 4 年来折腾了不少事情,可惜我的电脑还是 4 年的那台,不换显卡根本没法玩。

万幸的是上个月配备的笔记本电脑运行起来毫无压力,不用为这一个游戏去换显卡了~

还没有仔细玩,计划只在周末玩,否则就没法干别的事情了,况且还有一大堆 PS3 游戏 >_<。

目前只是有点不爽还要联网和登陆服务器(尤其是网速杯具的时候),而且窝在电脑前用鼠标玩,终归没有仰在椅子里拿着手柄玩得那么舒适呐~

 

带文件浏览器边栏的 Macvim

Vim 默认并没有文件浏览器的功能,所以如果需要同时浏览项目内多个文件,或是要在某个文件夹下创建新文件、重命名文件的时候,就有点麻烦,虽然有诸如 NERDTree 的插件,但是显然效果和使用上都不是那么直观,而且我需要的功能无非就是浏览和创建文件而已。

于是,终于找到了这个带文件浏览器边栏的 Macvim 修改版:

https://github.com/alloy/macvim

功能不多不少,正好满足要求,显示的效果非常直观,简单易用~

这样暂时也不用去折腾 TextMate、Sublime Text 什么的了,Macvim 还可以撑一段时间~