Jacky Liu's Blog

自动交易模式

    ---- 收盘!昨天开始试验 自动交易模式,条件触发模拟买入了 8 只。以 200.0(对数,大约 2%)作为盈利门槛的话,今天 6 只盈利,1 只平盘,1 只亏损。嗯。

    ---- 昨天的记录:

 

 

    ---- 今天的脚本:

 

    ---- 今天的结果:

 

    ---- 模拟亏损的那一只:

 

 

基于 gvim 的股票操作界面

 

    ---- 自己开发的基于 gvim 的股票操作界面。截图没开实盘,内容不具有实际操作意义,只做演示用。此文只谈界面设计,而且最终无可避免地回归到恶俗的主题—— Vim 的高端和我对它的钟爱上面来。

    ---- 基本显示形式就是图中那样,3 个窗口就够了。Vim 的任意一个窗口都可以加载任何一个缓冲区,所以 3 个窗口可以显示非常非常多的内容。左下两个辅助窗口的大小用自动命令的方式控制,光标进入时自动增大,离开时自动缩小。在窗口中切换缓冲区有一套自定义的按键。

    ---- 左边窗口显示的是 分析交易系统 的文件结构,背后的插件是 文件浏览器 插件。它并不只是显示文件结构这么简单,还可以跟 分析交易系统 配合,执行自定义的操作。对 股票分析交易系统 来讲,最常用的操作都定义成了 Vim 命令,比如 :Run :Quit :Update :Backup 这些。更多的操作都是预先写好的 python 脚本,以文件的形式显示在左边。需要执行的时候,只要在相应的脚本或目录名上按 \e 按键,这是更加灵活的方式。如果需要某个新功能或新操作,只要再写个 python 脚本,写好以后 \e 执行就可以了。

因为所有的插件都是自己写的,它们有共同的插件管理器,也有一套内部传送信号的定义。按 \e 按键的时候,文件浏览插件 就会把文件路径这些参数交给 分析交易系统 去加载执行。自写自用插件可以避免一些通用插件固有的问题,比如自定义命令过长(怕跟其它插件重复),插件之间无法配合,还有莫名其妙的冲突问题。插件之间冲突是 Vim 的痼疾,因为 Vim 的资源(窗口、缓冲区、系统选项、寄存器 ...)都是公有的,任意一个插件都可以动。虽然有经验的插件作者会有意避免,但是对于安装了许多插件的用户来说,冲突现象一定不陌生。

    ---- 中间最大的窗口是主窗口,用来显示 市场综合界面。可以建立多个 市场综合界面,用来显示不同内容,比如实盘时用来显示不同交易模式下属的符合条件的个股。不同综合界面之间可以通过自定义按键切换。

    ---- 市场综合界面 里用界面条目作为基本的显示单位,每一个界面条目对应一个后台数据结构,比如 个股、板块、交易模式 等等。界面条目之间有上下级关系,符合树状的体系结构。根节点是 市场行情缓存,它的下级数据分成几大类:
    
    第一类是不同市场对象,有 个股、指数、板块;
    
    第二类是自己定义的交易模式,分成 手动模式、自动模式、盘后开发模式。除了交易模式之外,还有 全局监控模式。交易模式 和 市场对象(个股)相互作用,符合匹配条件时会产生以个股代码和时间点为标志的 综合分析记录,分析记录在界面中会作为相应个股或交易模式的下级。

    全局监控模式 目前有三种,实现在分析交易过程中需要的不同功能:
        持仓模式,用来记录已持仓的个股,对持仓和资金情况进行统计,也负责仓位和资金管理;
        关注模式,用来记录和管理手动设置的关注目标,便于后续操作。
        预设指令模式,用来记录预设的条件交易指令,条件符合时自动执行。

    第三类是一些比较复杂又专门的功能,在程序里单独作为一个组件,比如 历史分时交易模拟缓存器。分时模拟交易 是个不可缺少的功能,每种交易模式在投入实际运用之前,都需要用历史分时数据进行模拟交易,检验模式的成效。模拟过程会产生 分时模拟交易记录,这些模拟交易记录既不从属于个股也不从属于交易模式,而是从属于一个预设条件(比如可用资金多少)限制下的模拟过程,这些都需要一个专门的对象(分时交易模拟缓存器)来记录和管理。分时交易模拟缓存器也是 市场行情缓存 的下级。

    ---- 市场综合界面 中的数据条目有一些基本操作,可以展开(显示下级列表)、合上。下级列表由多个分列表组成,一个界面条目可以对应多种下级总列表,比如 市场行情缓存 展开后,可以显示市场全部个股,也可以显示全部交易模式。每个分表有自己独立的 成员过滤、排序、显示 定义,通过在分表标题的不同位置按 < 或 > 键,可以切换不同的过滤、排序、显示方式。比如一个交易模式下面当日符合条件的个股,可以按最新的收盘涨幅排序,也可以按开盘涨幅或最低涨幅排序,也可以按相关模式专门定义的特有指标排序。每种排序方式都可提供不同的关注角度,帮助快速找到值得关注的目标。

    这里要补充一下,股票与其它品种(比如期货)相比,最大的好处是个股数量多,有几千个可选。即使在坏的市道下,也不难找到好的个股。但是要利用这种好处需要专门的技术,包括盘后基于日线行情的分析提取,更重要的是实盘时的监控。对一只个股来说,整个交易日之内价位合适的操作窗口可能只有几分钟而已。如果做不到对所有个股的监控和及时的反应,就很难达到预期操作目标。上面这些设计,都是为了强化实盘时的监控和反应速度。在不同的排序方式、过滤方式之间进行切换基本不需要时间。另外,自定义颜色也是一个很大的帮助,像图里显示的那样,让颜色的深浅来反映指标值的大小,这个后面细说。

    以上所有这些,下级列表的内容,以及过滤、排序、显示方式,都用动态配置数据来控制,下面是动态配置数据和其中一个过滤函数的定义。
 

 



    注意这些函数都是定义成文本的,因为它们需要在运行的时候动态加载。如果预设的 过滤、排序、显示 方式还是不能满足需求,可以在运行时通过修改这些文本来更改函数定义(通过底部辅助窗口执行),然后动态加载新的定义,结果会立即在 市场综合界面 里反映出来。

    ---- 回到前面的话题,在 市场综合界面 里,对于不同类型的条目还有专门的操作,比如对个股,可以在底部窗口显示它的 F10 信息,也可以绘制它的最新图形,也可以发出交易指令。这些操作都透过自定义按键来做。

    ---- 总之,市场综合界面 是最重要的一个界面。除了实盘时显示当天需要关注的个股以外,也可以在盘后运行,把目标日期设成历史日期,作为人工交易的操盘练习,或者作为交易模式的比较直观的验证。

    ---- 最后,是底部的辅助窗口,这个窗口对应多个缓存,每个缓存显示不同内容,缓存之间也是通过自定义按键切换:
        *. 运行记录缓存,相当于 stdout,显示 分析交易系统 运行时的 logging 输出。
        *. 全能输入缓存,用来在运行时输入 python 代码,然后动态加载执行。除了上面说的修改函数定义之外,还可以执行其它操作,比如输入比较复杂的预设交易指令,设置自动执行的条件参数,等等。代码文本都是预先写好的,多数情况下只需要把参数改成想要的值。
        *. 实盘记录缓存,在实盘运行时显示重要的提示信息,比如某只个股达到了交易模式的匹配条件,某只已持仓个股达到了卖出条件,等等。不同类型的信息用不同颜色显示,重要的信息会搭配声音提示。目前还没试过怎样让 python 播放音频,不过对 python 来讲应该不是问题。
        *. 全局信息缓存,用来显示数据对象的各种详细信息,比如个股的 F10 信息,或者程序运行时的状态,也用自定义按键触发。

    ---- Vim 为何适合做其它程序的界面?因为它有几个关键特性:

        *. 界面的作用就是输入跟输出。对输入来说,Vim 有自定义按键和命令。命令可以带参数,按键还可以针对界面中不同的位置做不同处理。对输出来说,Vim 里有标签页、窗口,一个窗口可以对应多个 Vim 缓冲区,一个 Vim 缓冲区还可以对应多个后台数据缓存。总之,窗口不必开很多,但显示内容可以很丰富。

        *. 可以根据内容的文法自定义内容的显示颜色,对 gvim 来说,可用的颜色数量丰富(与 html 相同)。抛开后台自定义的交易模式不谈,单这一点就是极大的好处。前面说过,对股票交易来说,全盘的监控、分析提取,以及条件符合时及时操作是关键。有了界面颜色的帮助,不需要专业训练的眼睛就可以在一大堆数据中迅速辨认出最值得关注的目标。文法匹配的定义可以很细致,比如说,同样是角度,结构顶角和趋势升角的含义就是不同的,对时间长度来说,波段长度和趋势长度含义也不同,它们都有不同的颜色定义。相比之下,一般的股软只是上涨用红色,下跌用绿色而已。

        *. Vim 可以用 Python 语言进行扩展。而对于 Python 来讲,基本上想要什么功能都有。可以通过网络特性跟局域网内的系统前台交换数据,接收前台的实时行情并且发送交易指令,可以用 matplotlib 绘图,可以调用图片浏览器查看,还可以装一个 Selenium 接口,通过 Selenium 控制网络浏览器来玩微操盘,或者把 Vim 里编辑的内容通过一个自定义按键发上博客(这两个只是设想,没做)。当然 matplotlib 速度有点问题,以后可能会用 pyqt 来做一个绘图引擎,真正做到动态实时绘图,而且可以在图形上直接进行操作。
        
    ---- 以上就是 Vim 作为 UI 可以做到的事情。实际上,我已经把 分析交易系统 整个都改写成一个 Vim 插件了(原本是独立进程,通过 IPC 与 Vim 界面传递数据)。这样就节省掉了在进程间传递数据的种种麻烦,也因为如此,Vim 能做的事情更加广泛。比如在运行时,可以显示系统内部任何一个数据结构当前的值,因为整个系统已经成了一个 Vim 插件,它所有的部分 Vim 都看得到。这样用下来,并没有发现什么问题,效果很好。
 

冠豪高新 幕后人物的经验之谈

    ---- 微博上偶然看见的,据说前一阵子的 冠豪高新 背后是个叫 林广茂 的人,而股价上演那样疯狂的行情是因为受到了政策加持,被定为 “融资融券” 的标的。因为自己一直专注技术,对 内幕、主力 之类的信息并不关心,看见了才知原来如此。虽然这家公司名字里有个 “高新”,但这就像我把我家的厕所评为五星级豪华厕所一样,实际上它只是个生产打印纸的企业。

    ---- 其实这些都无所谓。理工科出身,从技术入手,在目前的投资起步阶段,还是坚持 “价格涵盖一切” 的思路。技术之外当然有东西,还有很多,但是得先把技术弄透了再说。我更感兴趣的是下面这段据说是林的经验之谈,@中国对冲基金 整理的。虽说是二手的,也没关系。对这种大而化之的东西,读起来也是相由心生,我思故我在。别人究竟讲的什么不重要,重要的是你读到了什么,只要感觉能够融会就好。

 

 

    ---- 按照我的理解,他所说的投资方法的发展分以下几个阶段。

        1. 对 “术” 的掌握。文里说的这个 “术”,在我看来就是基本功。每个领域里都有这样的基本功,对服装设计师来说就是纳针脚、画图样,对画家来说就是构图、笔法,对写手来说就是遣词造句。在投资分析里面,就是知道面对一个市场情势时从哪些角度去分析它,趋势怎样?微观怎样?区间怎样?能量怎样?几个量一有,心中就有了底,而不会像一个外行一样,面对图形时脑中纷繁复杂,千头万绪,把头一转开又是一片空白,什么也不剩下。

        2. 掌握了 “术” 以后,再把它 “拆分开”。这个说法有点绕,或者可以说 “把厚书再读薄”,或者 “见山又是山,见水又是水”。讲具体点,是指去繁就简,抓住实质。投资分析的指标有成百上千种,实际用的时候要所偏重。不光是偏重最能反映实质的那些,可能更重要的是偏重你最熟悉、用起来最顺手的那些。

    ---- 过了这个阶段,就已经解决赚不赚钱的问题了。接下来就是发展路线问题。投资到了一定阶段会遇到瓶颈,原有的投资方法不能支撑更大的资金规模,收益率会下降。往下怎么发展,文中给出两条路。第一是 “求快”,也就是仍然坚持原来的分析和交易手段,把大资金拆成小资金操作,加快交易频度,通过追踪更多的机会来支撑更多的资金。第二种,文中叫做 “取势”,其实也就是往中长线发展。操作目标仍然相对集中,通过加大操作周期,博取更高的单次收益来支撑更大资金量。

    ---- 至于文中最后说的 “钟摆” 什么的,我能明白什么意思,但没法体会了。毕竟现在这个段位差太远了。

    ---- 网上另有关于主角事迹的报道,从这些报道看,主角自己显然是选择了文中所说的第二条路。报道中说主角曾经连续两年多追踪一个期货品种,结果 卟啦卟啦卟啦 。。。你们都知道的。

    ---- 而像我这样的要是以后也真到了这个阶段,自然会选第一条路,我还是要依赖我的 Vim 跟 Python :)

 

趋势线

 

    ---- 有句话怎么说来着,“只有趋势才是你的朋友”。

 

    ---- 对任意一点可以辨认它所处的趋势。算法保证如果 A 点和 B 点的趋势起点都在 O,那么 A、B 之间任意一点的趋势起点也在 O 点。

 

用 Python / Matplotlib 画出来的股票 K线图 (四)

 

    ---- 前一篇在这: 用 Python / Matplotlib 画出来的股票 K线图 (三)

    ---- 日线与分时对比行情:

    ---- 下面是绘图脚本与绘图数据合在一起的压缩文件。注意:

        1. 是 py3 脚本,matplotlib 已经支持 py3。绝大部分都是中文写的,不想被英文虐出翔了。

        2. 是 Linux 下写的,需要在 Linux 下执行。先解压,然后到生成的目录下执行:

python3   绘图.py

            就可以了。会生成一个 绘图.log 文件和一个图片文件放在相同目录下。

        <补记>:已经证实经过很小的改动就可以在 windows 下运行,输出中文字内容的大小样式有区别,其它一样,得益于 python 和 matplotlib 的跨平台特性。但是我不知道具体改哪些。

    ---- 解压后的文件结构:

        日线分时对比行情/
        ├Public/
        │├Public.py
        │└__init__.py
        ├子图定义/
        │├__init__.py
        │├公司信息子图.py
        │├分时价格子图.py
        │├分时手数子图.py
        │├实盘价格子图.py
        │├实盘手数子图.py
        │├日线价格子图.py
        │└日线换手子图.py
        ├绘图.py
        └绘图数据.pickle

    ---- 关于授权:除了特别说明的以外,本博客里的代码都用 “干啥随你便” 协议进行授权。

    Unless otherwise noted, all code pieces in this blog are licensed under the "DWYW(Do What the f Whatever You Want)" agreement. Good luck.

    ---- Download

尼玛的 冠豪高新

    ---- 有时看看某些 A 股的走势,你会觉得如此变态,如此不可理喻。人生充满机会,成功只要放手一搏,煞笔也能赚钱,不赚的都是煞笔,都尼玛这样了不富还有天理吗啊啊啊啊啊啊啊啊 ~

    ---- 可是明知精彩每天都在上演,我这种闷骚又有完美主义强迫症的苦逼却还在埋头调试交易模式,这简直跟坐怀不乱差不多。我觉得我有看破红尘的潜质,只差有人来点化了。

    ---- 一个美股交易员朋友说,虽然美股是 T+0 规则而且没有涨跌停限制,但美股的波动远没有 A 股这么变态。
    
    ---- 南辕北辙,欲速不达。投资与投机,股市与陷阱,公有与私有,中国梦与箩筐套鸟,摸石头过河与脱裤子放屁,都是羊头与狗肉而已。

 

 

用 Python / Matplotlib 画出来的股票 K线图 (三)

 

    ---- 前一篇在这: 用 Python / Matplotlib 画出来的股票 K线图 (二)

    ---- 后一篇在这: 用 Python / Matplotlib 画出来的股票 K线图 (四)

    ---- 就像上回说的,新内容加进来。除此之外,与上一版代码相比最大的改动就是内部重构过,子图全部定义成 class。图中一共包含 5 个子图,从上到下依次是: 基本信息(就是那些文字)、历史价格、历史换手率、价格、换手率。通过输入的绘图数据进行控制,任何一个子图都可以关闭,关闭子图可以节省绘图时间和存储空间。本来还有一个财务信息子图要加进去,但是现在想暂时告一段落,先弄点其它的。

    ---- 作为输入的 Python pickle file 在 这里

 

 

    ---- 最后是脚本,仍然是 Python 2 的:

Python + 股票: 个股资讯表

 

---- 以上是 Vim 在全屏模式下的截图。全屏模式下 Vim 没有了程序标签栏,并且覆盖了 OS 的系统任务栏。用来切换全屏模式的按键定义:

    nnoremap <S-F10> :silent !wmctrl -r :ACTIVE: -b toggle,fullscreen<CR>

需要外部命令 wmctrl 可用。感谢 闲耘,是从他的 vimrc 里抄来的。

 

---- 基本搞定了个股资讯表。内容包括新闻动态、重大事项、公司公告。

 

---- 表的结构:<代码> <日期> <时间> <类型> <来源> <序号> <内容> <属性>。下面一条查询语句:

读出个股最新资讯
1
2
3
4
5
SELECT t1.代码, t1.日期, t1.时间, t1.类型, t1.来源, t1.序号, t1.内容, t1.属性 FROM 个股资讯 AS t1
JOIN (
    SELECT 代码, 类型, MAX(日期) AS 最大日期 FROM 个股资讯 GROUP BY 类型, 代码
) AS t2
ON t1.代码=t2.代码 AND t1.类型=t2.类型 AND t1.日期=t2.最大日期;

耗时 20 多秒,读出 12000 多条记录。不知道是否设计有问题,怎么会这么慢。眼下没时间深究,先这样吧。

 

---- Plotting 模块改用多进程也基本搞定,结果比预想的还要好。我的电脑是双核的,所以在主进程之外又建立两个工作进程来执行绘图任务。粗略统计,与单进程相比的速度提升在 120% ~ 130% 之间,现在绘制一幅图形大概只需要 3 到 4 秒。

 

---- 但是遇到一个神秘 bug,好久才搞定。好像必须给进程对象的建立留有足够的时间,否则进程跑起来会出问题。目前在程序里加了一个延时语句 sleep(0.3),看上去是好了。因为程序结构比较复杂,没心思去重现它了,能用就行,也先这样吧。

 

---- 接下来要把图形再优化一下,新的内容加进去。差不多了以后开始建日线统计表。

 

用 Python / Matplotlib 画出来的股票 K线图 (二)

 

---- 最新的在这里: 用 Python / Matplotlib 画出来的股票 K线图 (四)

 

---- 下一篇在这里: 用 Python / Matplotlib 画出来的股票 K线图 (三)

 

---- 上一版的改进,双股同列 + 无数细小改进,如下图。dpi= 300。明的一条是个股走势,暗的是同期的指数走势。这大概是近期最强的一只。

 

---- 要想培养对走势的感觉,采用固定比例尺的图形是必须的。一般股票软件里的图形都为显示方便而做了变形处理,用处不大。

 

---- 图形感觉差不多了,告一段落。接下来的目标是 股本结构、历史分配、行业板块、股东研究 这些信息,还包括个股资讯。实时的数据仍然暂时不碰。

 

 

---- 源码贴出来。因为 Matplotlib 还不支持 Python3, 所以单写了一个 Python2 脚本。注意绘图数据是用 pickle file 传递的。

[补记:我决定放弃线性坐标了。这个脚本只支持对数坐标。]

 

 

用来画股票 K线图 的 Python 脚本

    ---- <补记>:

        最新的在这里: 用 Python / Matplotlib 画出来的股票 K线图 (四)

        下一篇在这里: 用 Python / Matplotlib 画出来的股票 K线图 (三)

 

    ---- 花了 20 个小时左右的时间才从新浪下载完复权日线数据,把复权日线表建起来。这速度也太慢了,还有首次下载网页失败的比例居然这么高,一定有问题,印象中以前不是这么慢的,下载几千只股票的数据也只有几十个页面会首次下载失败吧。但昨天晚上更新最新数据的时候把下载任务之间的延迟扩大了一些,好像好一些,速度还可以,而且失败率不高。我开的是 5 个线程,下载页面之间的间隔是 0.2 ~ 0.3 秒。

    ---- 另外,把那个画 K 线图的脚本贴出来。这个脚本是通过研究 Matplotlib 官网里的示例并且借助 Google,用大概 1 周的时间改出来的。简单介绍一下:

    1. 由两个子图(subplot)构成,上面一个显示价格(K 线),下面一个显示成交量。
   
    2. K 线子图可以使用线性坐标或者对数坐标(由 Plot() 函数第三个参数控制)。使用线性坐标的时候,每个单位价格区间所占高度是固定的;使用对数坐标的时候,每个单位涨幅区间(比如 10%)所占高度是固定的。成交量子图的高度总是固定,不论成交量数值大小。
   
    3. 对 X 轴来说,每根 K 线的宽度固定,整个图形的宽度决定于行情的天数。只要把行情数据文件作为参数传递过去就可以,图片尺寸由程序自主计算。
   
    4. 另外,figdpi 这个变量控制图片的分辨率(解析度),可以随意调大调小。上一篇文章里贴的图使用的 dpi 值是 300。另外,X 轴和 Y 轴上的坐标点也是程序自主决定的。

    ---- 整个脚本还是一个 work-in-progress,目前的局限主要在于使用对数坐标时,Y 轴坐标点的确定。前一篇里所贴的那个图,可以看见价格上限在 20 块左右,如果换一只价格 90 块上下的股票,或者用来画几千点的指数行情,那 Y 轴的坐标点就会太密集。解决办法是根据取值区间来自主选择合适的 Y 轴坐标间距,但是这个目前还没有做。

    ---- 任何意见或建议都许多欢迎 !

 

    ---- <补记>:已经有了大幅改进的版本,在下一篇里。

 

 

 




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee