ITPub博客

首页 > > > 10064 记第一次“黑客松”

10064 记第一次“黑客松”

作者:格伯纳 时间:2015-11-16 01:04:40 0 删除 编辑

  昨天我参加了人生中第一场 hackathon ——连续 12 小时的编程竞赛。原来在出生 10000 天以后,还可以有第一次做的事情~

  这次比赛是由量化交易公司 Jane Street 主办的,题目就是写一个自动炒股机器人。我所在的队伍由三名博士生组成,除了我,还有数学系的博士姜子麟,和他的妹子、电子与计算机工程专业的博士鲍由之。去年,姜子麟曾经和我组队参加一次解谜竞赛;这次组队,也是他张罗的。我们三个人都没有金融背景;不过比赛手册里说了,不需要金融方面的先验知识,这也是我敢于参赛的原因。

(我的两个队友)

  比赛的形式是这样的:股市上总共有 7 支股票,其“公平价格”由一个随机过程控制。比赛由连续进行的许多轮组成,每轮 5 分钟,模拟一个交易日。在交易日中,各个队伍可以出价要求买入或卖出,而市场上也会有一些电脑模拟的 NPC(非人类玩家)在出价。一般情况下,最高的买入价会低于最低的卖出价,大家都在持观望态度;一旦有买入价高于或等于卖出价,交易就能成交。每个队伍炒股的资金是无限的,而股票可以向银行“借”——即持仓量可以为负值。持仓量的绝对值有上限;每个交易日结束时,手中仍持有的股票(无论正负)均按收盘时的“公平价格”折算成现金。比赛的第1个小时,钱比较值钱(这是为了奖励编程快的队伍);之后钱会贬值,到比赛进行到后半段时再逐渐升值回来,以使比赛益趋激烈;到最后,钱的价值会超过比赛开始时的水平。比赛的名次,基本就是按整场比赛的收益来排列了。

  下面介绍一下股市上的 7 只股票,这里面暗藏了许多玄机。为了易读性,下面用字母 A、B、C、D、E、X、Y 来指代它们。A、B、C、D、X 为常规股票,其中 A 股的“公平价格”不会浮动,固定为 1000 元。E 和 Y 是“基金”,E 由 A、B、C、D 四支股票组合而成;而 Y 则仅包含 X。基金可以直接交易,也可以拆分成各支股票再单独交易;反过来,各支股票也可以组合成基金——但每次拆分或组合(统称“转化”)都要交手续费。读到这里,你也许会想—— X 和 Y 看起来是一模一样的,那还互相转化个毛啊!这里面的玄机,将在下文分解。

  显然,股票 A 就是用来练手的。电脑模拟的 NPC 并不总是按套路出牌,有时会报出明显低于公平价格的卖出价,或者明显高于公平价格的买入价。既然 A 股的公平价格固定为 1000 元,那么只要我们时时刻刻报出 999 元的买入价和 1001 元的卖出价,总会有比较“笨”(比赛手册中称为“对价格不敏感”)的 NPC 来跟我们成交。我们迅速地把这个策略写成了程序。然而不幸的是,我们这个程序在阴沟里翻了船——我们弄错了正负号,以 1001 元的价格买入了 1000 多股,直接损失 1000 多元。赛场上的大屏幕显示着各个队伍的排名,每个交易日收盘时更新一次。在这个时候,大多数队伍的收益都还是 0;有五六个队伍手速比较快,已经开始在用这种策略赚钱了;而我们的队伍名列倒数第二——不错,至少还有一队难兄难弟。

  我们马上修改了程序的 bug,开始稳定地在每个交易日从 NPC 手里赚取二三百块钱。随即比赛进入了钱不值钱的、寂静而漫长的下午。大屏幕上只显示队伍的排名,并不显示每个队伍的具体盈亏数额。在长达半个多小时的时间里,我们队一直稳居倒数第二,这让我们有些灰心。不过我们并没有放弃拼搏,我一直在观察着 B 股的行情。比赛手册里说,有一种交易策略叫 pennying,就是说始终出比当前最高买入价高 1 块的买入价,以及比当前最低卖出价低 1 块的卖出价,这样你的交易就可以优先成交。于是我写了一个在 B 股上执行这种策略的程序。

  这时,排行榜上的我们终于翻盘了。我们队的名字,一跃超过了一大群零分队伍,在 28 个队伍的名单中位列 10 名左右。然而好景不长,我们本来想在测试环境中检验一下我在 B 股上的策略,却一不小心直接把它接到了比赛环境中,瞬间又损失了 2000 多元,再一次跌回负分的谷底。

  咦?为什么手册上的策略会赔钱呢?我仔细查看了一下交易记录,发现我发出的一买一卖两笔交易中,只有买的那一笔成交了。之后股价一路下跌,买入的股票牢牢地套在手里,始终卖不出去。在监视盈亏的网页上,我发现,只要持仓量不为零,盈亏额就始终受行情影响,波动很大。于是我提出一点建议:尽可能使得一对买卖交易同时成交,避免持仓。

  对此,姜子麟提出了不同意见。他说,股票暂时卖不出去不要紧,只要等着它涨回来就好了。然后,我们一齐发现这样做的期望收益为 0 ——这不就是人生三大错觉之“我能反杀”么?我们意识到,任何交易都有套牢的风险,如果不能预测股价使得预测价和真实的公平价格正相关,就不可能获得正的期望收益。

  正在我们一筹莫展的时候,有主持人过来跟我们聊天了。我们向他提出了关于股票 X 和基金 Y 的疑惑。主持人解释说,股票 X 的背景是巴西的一个石油公司,而 Y 则是一支美国基金。Y 的公平价格跟 X 始终保持一致,但 Y 的成交价会跟随 X 而波动,有一定延迟,于是就可以利用两个市场的价格差来赚钱。我们觉得对,于是我开始实现如下的策略:

    • 如果市场上 X 的最低卖出价低于 Y 的最高买入价,则买入 X,把它转化成 Y,再卖出;
    • 同理,如果市场上 Y 的最低卖出价低于 X 的最高买入价,则买入 Y,把它转化成 X,再卖出。

转化是需要手续费的,所以必须在确定交易收益大于手续费时,再出手。

  在实现过程中,我发现“转化”操作似乎并不成功,X 和 Y 一直具有大小相同、符号相反的持仓量。但这恰好提示我:干嘛要转化啊!既然 X 和 Y 的“公平价格”始终保持一致,那么只要保持 X 和 Y 的持仓量之和为 0,盈亏就不受市场波动影响啊!这样做的唯一缺点,就是在 X 和 Y 的持仓量达到上限的时候,交易就只能单向而不能双向进行了。但即使这样,这种交易策略也给我们带来了每个交易日 600 ~ 800 元的盈利,比炒 A 股赚得快。不久,我们就又翻身了。

(比赛现场)

  在我埋头实现上述策略的时候,姜子麟和鲍由之开始研究另一种策略。他们只买卖基金 Y,但是用股票 X 的行情来估算 Y 的公平价格。具体来说,他们把任一时刻 X 的最高买入价和最低卖出价的平均值当作 X 的公平价格(也就是 Y 的公平价格),如果 Y 的最高买入价高于此价格,则卖出 Y;如果 Y 的最低卖出价低于此价格,则买入 Y。这种策略没有遵循我之前提出的“不持仓”原则,所以很快就满仓了(X 和 Y 的持仓量上限为 ±10)。但是我们观察到,就算在满仓后,盈利额依然在波动中上涨。这真是一个惊喜!但是为什么呢?

  原来,我们在不知不觉中完成了“预测股价”这一看似不可能的任务。基金 Y 的公平价格与股票 X 连动,这里没有延迟;但 Y 的行情与 X 的行情相比却有延迟。所以,我们观察到的 X 的行情,就是未来的 Y 的行情,这相当于使用了诸葛亮的“观星”技能!而满仓后为什么还能继续赚钱呢?不妨设我们是正满仓(即已经持有 10 股基金 Y),假设股票 X 开始下跌,那么我们就会卖出 Y;所以,如果我们观察到 Y 没有卖出,那意思就是 X 还在上涨,我们手里的 Y,同样也是越来越值钱的!

  我们对比了这种“观星”策略和我的“平仓”策略,发现“观星”策略赚钱更快。我们分析认为,两种策略的差别,就发生在满仓之后——如果市场继续向同一方向发展,那么“观星”策略以逸待劳地享受股价变化带来的收益,而“平仓”策略则享受不到。进而我们又想到,在“观星”策略中,当 Y 满仓后把它转化成 X,就相当于把 Y 的持仓量上限扩大到 ±20。这次转化操作成功了,我们队的日盈利额达到了 2000 元左右。之前两次失误损失掉的钱,现在看来已经不算什么了。(写到这里我想到,在“平仓”策略中,如果在满仓时通过“转化”操作消化掉库存,似乎就相当于持仓量没有上限了。不过比赛当时没有想到这么多,而且“转化”操作没有成功)

  我们决定乘胜追击,把“观星”策略也应用到基金 E 上去,即通过股票 A、B、C、D 的均价来预测 E 的公平价格。这一部分程序也是由姜子麟口述、鲍由之执笔的(因为我和鲍由之用的是 Python 语言,而姜子麟并不熟悉)。此时已经到了晚上,我们也不准备再开发什么新的策略了,于是我就闲了下来,去干了会儿实验室的活 _(:3」∠)_ “观星”策略很快就放出了卫星。基金 E 的持仓量上限是 ±100,依靠转化操作,我们实际上获得了 ±400 的持仓量上限,日盈利额上万了。大屏幕上我们的排名从第十稳步上升到第五。我们右边坐着一支说法语的队伍,名叫 SugarPower(似乎可以译作“苏哥怕我”?@Sugar Su),之前一直稳居第六,被我们反超的时候,有一个队员向我们投来了饱含不知什么感情的目光。

(偷拍主持人小哥,此时我们队排第七)

(“苏哥怕我”队,后面的角落里是最终的冠军队伍)

  比赛的最后一个小时,在动感的音乐声中,大屏幕上开始显示前六名的具体盈利额;到了最后的半个小时,开始实时显示当前交易日中每个队伍的盈亏额和持仓量。我凑到大屏幕前仔细观察了一下。排行榜上,第一名和第二名组成第一梯队,第二名一直紧跟第一名,而甩开第三名较大距离。第三、四名组成第二梯队,而我们队进步很快,终于也跻身其间。从实时盈亏额和持仓量来看,各队的策略都很不一样。第一梯队的两支队伍,盈利都很稳定,而我们队的盈亏额波动很大,千位数字都一直在跳动。第二梯队的另外两支队伍中的一支只买卖 E 基金,并不把它拆分成 A、B、C、D 股,但也常常获得与我们队相近的收益。还有一支叫作 PEACH 的队伍,只玩 D 股,赚的时候嗨翻天(盈利上万元),但亏的时候也是万劫不复(亏损上万元)。有趣的是,有一个交易日我们队伍保持着正的 D 股持仓量,而 PEACH 队保持着负的 D 股持仓量,我们两个队伍却都在赚钱。我一度以为,通过常规股票来预测基金的走势,是“预测未来”的唯一办法,但现在看来还有许多我们没想到的策略。更重要的是,似乎并没有一个策略能够通吃任何行情,我看到各队的策略(包括我们自己的)都在某些交易日马失前蹄。

  倒数第二个交易日结束的时候,赛场上爆发出一阵惊叹——原来第二名反超了第一名!比赛是只有第一名有奖金的,所以这是一个当之无愧的“大新闻”。与此同时,我们队居然到达了第三名!惊心动魄的最后一个交易日过去了,前两名的位置没有再发生变化,也就是说,原先一直位居第二的队伍“闷声发大财”成功了。而我们队的最终名次是第四,不过反正第二梯队的三支队伍分数都很接近,名次也就不那么重要了。

(比赛最终排名,第四是我们)

  这场比赛下来,我的收获还是很大的。我算是入了一点儿金融的门,知道了量化交易是怎么回事(当然只是盲人摸象式的了解),也了解了在市场上任何一点儿不小心都有可能造成巨大的损失。不过,随着策略的进步,开始时似乎无法弥补的损失到了后来也只是毛毛雨——就像打帝国时代的时候,在黑暗时代被狼咬死一个农民,在当时影响很大,但到了帝王时代就没人在乎了。

  欢迎大家讨论交易策略,虽然身为金融小白的我不确定能跟得上 ;-)

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    983868