1.策略原理及逻辑
1.1策略原理
相对强弱指数(RSI)是通过比较一段时期内的平均收盘涨数和平均收盘跌数来分析市场买沽盘的意向和实力,从而作出未来市场的走势。
RSI在1978年6月由Wells Wider创制的一种通过特定时期内股价的变动情况计算市场买卖力量对比,来判断股票价格内部本质强弱、推测价格未来的变动方向的技术指标。发表在美国Commodities杂志中(现为Future杂志),并收录于同年推出的New Concepts in Technical Trading Systems书中。相比起其他分析工具,RSI是其中一种较容易向大众传译的计量工具,故一推出便大受欢迎。
RSI计算公式和方法
RSI=[上升平均数÷(上升平均数+下跌平均数)]×100
具体方法:
上升平均数是在某一段日子里升幅数的平均而下跌平均数则是在同一段日子里跌幅数的平均。例如我们要计算九日RSI,首先就要找出前九日内的上升平均数及下跌平均数,举例子如下:
日数收市价升跌
第一天23.70
第二天27.90 \ 4.20
第三天26.50 \ 1.40
第四天29.60 \ 3.10
第五天31.10 \ 1.50
第六天29.40 \ 1.70
第七天25.50 \ 3.90
第八天28.90 \ 3.40
第九天20.50 \ 8.40
第十天23.20 \ 2.80
(1-10天之和)+15.00+15.40
(9天内)上升平均值:15÷9=1.67 (9天内)下跌平均值:15.40÷9=1.71
第十天上升平均数=(4.20+3.10+1.50+3.40+2.80)/9=1.67
第十天下降平均数=(1.40+1.70+3.90+8.40)/9=1.71
第十天RSI=[1.67÷(1.67+1.71)]×100=49.41
如果第十一天收市价为25.30,则
第十一天上升平均数=(1.67×8+2.10)÷9=1.72
第十一天下跌平均数=1.71×8÷9=1.52
第十一天RSI=[1.72÷(1.72+1.52)]×100=53.09
据此可计算以后几天的RSI。同样,按此方法可计算其他任何日数的RSI。至于用多少日的RSI才合适。最初RSI指标提出来时是用14天,14天作为参数则成为默定值。但在实际操作中,分析者常觉得14天太长了一点,才有5天和9天之方法。
1.2策略逻辑:
RSI指标的买卖时机:
- 当数值运行在80以上时我们称为超买,此时一般卖出。
- 当数值运行在20以下时我们称为超卖,此时一般买入。
2.策略代码
2.1配置文件【rsi_stock.ini】(提示ini配置文件,需要保存成UTF8格式)
|
2.2策略文件【rsi_stock.py】(代码过大无法上传,详细代码见证经社—— http://zjshe.cn/q/forum.php?mod=viewthread&tid=85&extra=page%3D1)
3.代码涉及的函数代码
3.1 python函数及package
| 功能 | 函数原型 | 参数 | 返回值 |
| 参数名 | 含义 |
| sys | 提供了一系列有关Python运行环境的变量和函数。 |
|
|
| sys.argv[0] | 当前程序名 |
|
| sys.argv | 获取当前正在执行的命令行参数的参数列表(list)。 | sys.argv | sys.argv[1] | 第一个参数 |
|
| sys.argv[2] | 第二个参数 |
|
| arrow | 标准的时间日期库。 |
| ta-lib | 被广泛应用的金融市场数据分析的库 |
| pandas | Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的 |
| numpy | 一套用于支持科学计算的python第三方库 |
| time | 返回当前时间的时间戳 | time.time() |
|
| 返回当前时间的时间戳 |
| len | 返回对象(字符、列表、元组等)长度或项目个数。 | len(s) | s | 对象 | 返回对象长度。 |
| append | 用于在列表末尾添加新的对象。 | list.append(obj) | obj | 添加到列表末尾的对象。 | 该方法无返回值,但是会修改原来的列表。 |
3.2掘金接口函数
| 功能 | 函数原型 | 参数 |
| 参数名 | 类型 | 说明 |
| on_bar | 响应Bar事件,收到Bar数据后本函数被调用。 | on_bar(bar) | bar | bar | bar数据 |
| open_long | 异步开多仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口 | open_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE |
| sec_id | string | 证券代码,如浦发银行600000 |
| price | float | 委托价,如果price=0,为市价单,否则为限价单 |
| volume | float | 委托量 |
| close_long | 异步平多仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。 | close_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE |
| sec_id | string | 证券代码,如浦发银行600000 |
| price | float | 委托价,如果price=0,为市价单,否则为限价单 |
| volume | float | 平仓量 |
| open_short | 异步开空仓,以参数指定的symbol、价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口 | open_short(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE |
| sec_id | string | 证券代码,如浦发银行600000 |
| price | float | 委托价,如果price=0,为市价单,否则为限价单 |
| volume | float | 委托量 |
| close_short | 异步平空仓接口,以参数指定的exchange, 证券代码sec_id, 价和量下单。如果价格为0,为市价单,否则为限价单。策略类和交易服务类都提供该接口。 | close_long(exchange, sec_id, price, volume) | exchange | string | 交易所代码, 如上交所SHSE |
| sec_id | string | 证券代码,如浦发银行600000 |
| price | float | 委托价,如果price=0,为市价单,否则为限价单 |
| volume | float | 平仓量 |
| get_last_n_dailybars | 提取单个代码的最新n条DailyBar数据, 策略类和行情服务类都提供该接口。 | get_last_n_dailybars(symbol, n, end_time='') | symbol | string | 证券代码, 带交易所代码以确保唯一,如SHSE.600000 |
| n | int | 提取的数据条数 |
| end_time | string | 指定截止时间, 如2015-10-30 15:00:00 |
| get_dailybars | 提取指定时间段的历史Bar数据,支持单个代码提取或多个代码组合提取。策略类和行情服务类都提供该接口。 | get_dailybars(symbol_list, begin_time, end_time) | symbol_list | string | 证券代码, 带交易所代码以确保唯一,如SHSE.600000,同时支持多只代码 |
| begin_time | string | 开始日期, 如2015-10-19 |
| end_time | string | 结束日期, 如2015-10-30 |
| get_position | 查询当前策略指定symbol(由交易所代码和证券ID组成)和买卖方向的持仓信息。策略类和交易服务类都提供该接口。 | get_position(exchange, sec_id, side); | exchange | string | 交易所代码 |
| sec_id | string | 证券代码 |
| side | int | 买卖方向 |