楼主: xiyun_baba
7087 14

[源码分享] RSI实现收益率惊人的反转策略Python源码 [分享]

  • 1关注
  • 3粉丝

初中生

80%

还不是VIP/贵宾

-

威望
0
论坛币
490 个
通用积分
1.0031
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
1235 点
帖子
15
精华
0
在线时间
21 小时
注册时间
2017-5-28
最后登录
2019-9-14

xiyun_baba 发表于 2017-7-15 00:38:11 |显示全部楼层
本帖最后由 xiyun_baba 于 2017-7-15 00:52 编辑

        RSI是股市中经常使用的指标,很多技术分析大牛喜欢使用该指标。 RSI指标运行范围在0-100之内,实际上RSI很少会运行到90以上,即便当前市场最强势的股票也不会运行到90到100之间。RSI指标也很少运行到20以下,更不要说运行到0了。一般股票运行在20到80之间,当处于熊市时,从20运行到50左右,即开始下跌;处于牛市当中,RSI下降到40-50之间即开始新的一波上涨,RSI运行到80附近,开始一波新的调整。分析以往历史数据,RSI运行到20以下相当少见,一旦RSI运行到20以下,买入持有的胜算会很大。
         本策略就是利用RSI这个特性研究RSI的反转规律。本文所使用的数据来自Tushare,时间跨度为2016.1.1到2017.6.30日,共有3270只股票。之所以选择近期一年半的数据,是因为近一年半处于熊市当中,验证近期使用该策略是否有效。
1)策略结果:
rsi翻转1.jpg

从统计结果我们看到当RSI小于20时,持有10个交易日总收益高达23倍,而我们的时间跨度仅仅为1年半。
2)策略介绍:
a)本策略使用14日RSI,如果RSI小于设定数值,买入并持有3,5,10,12日,计算这些持有日期的收益率.
b) 反转策略,设定数值不能超过50,否则就不准确了。
c)反转策略,当RSI小于指定数值后,可能随机还会下跌,所以指定的日期不能小于3,否则也失去意义。
d)改进方向:RSI小于指定数值后,需要等到RSI不在继续下跌或者收盘价不再下跌再买入。
e)缺陷:没有考虑交易时间的重叠,即同一时间可能有多个股票符合买入条件,资金会分成几份。结果的收益会虚高。

3)代码分析
3.1)遍历所有文件,这些文件从tushare获取,保存在本地test目录之下。
20170715002.jpg


3.2函数calc_profit ,统计持有3日,5日等多个时期的收益率和胜率情况;
20170715002205.jpg


3.3函数multi_date_profit,同时持有3日,5日等多个日期时,某个股票的收益情况;
20170715002433.jpg


3.4 遍历每个股票,调用函数multi_date_profit,得到3日,5日等多个日期的统计数据。


20170715002717.jpg


3.5)打印全部股票的收益率和胜率,并存储到.csv文件中去。
20170715002939.jpg


4)结论:本策略没有区分该股票是否面临利空的因素,如果能结合爬虫,分析该股票近期公告和新闻,对于负面消息,不买入该股票,而买入基本面良好的股票,这样胜率可以大大提升。

本文的源代码请见附件,小卖5个币,毕竟写代码不容易啊,花费了不少心思。如果有错误的地方,请大家交流指正。直接在后面回复即可。


tushare_all_rsi.rar (2.41 KB, 售价: 5 个论坛币)



关键词:python RSI Profit multi share

已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

stata SPSS
xiyun_baba 发表于 2017-7-15 00:59:18 |显示全部楼层
核心源码如下:
#统计RSI小于某个数值时收益
def multi_date_profit(rsi1,buy,profit,close,muliti,conent):
    i = 0;
    totalProfit = 0.0
    positiveCount = 0
    negativeCount = 0
    count = 0
    #遍历每一个RSI列表
    while i < rsi1.size:
        #如果某个RSI数值小于指定数值
        if rsi1.iat[i] < rsiValue:
            buy.iat[i] = 1
            #防止最后的数字超出RSI列表值域
            if(i + muliti >= rsi1.size):
                return
            #得到利润,收盘价相比
            profit.iat[i + muliti] = close.iat[i+muliti]/close.iat[i] - 1.0
            #单个股票的所有利润和
            totalProfit += profit.iat[i + muliti]
            count = count + 1
            #统计正负收益的次数
            if(profit.iat[i + muliti] <= 0):
                negativeCount = negativeCount + 1
            else:
                positiveCount = positiveCount + 1
            for j in range(muliti):
                buy.iat[i+j+1] = 0
            i = i + muliti
        else:
            i = i + 1
    #插入3个记录:每个股票的买入次数,收益率和胜率
    if count <= 0 :
        return
    content.append(count)
    content.append(totalProfit)
    content.append(float(positiveCount )/count * 100)
回复

使用道具 举报

xiyun_baba 发表于 2017-7-15 00:59:48 |显示全部楼层
#统计利润等参数
def calc_profit(i):
    busysignal = 'buysignal'+str(i)
    profit = 'profit'+str(i)
    print '持有%d个交易日的统计:' %i
    count = sum(list(all_profit[busysignal]))
    print '    共发出买入信号: %d' %(count) + '次'
    #买卖一次费用为0.0015,佣金为万分之二,印花税为千分之一
    print '    总费用:%.2f' % (count*0.0015)
    print '    总收益:%.2f' %(sum(list(all_profit[profit])) - (count*0.0015) - 1) + '倍'
    #print '    总胜率' + str(sum(list(all_profit['success3']))/count)
    count1 = sum(list((all_stock[profit] - 0.0015 )> 0))
    list1 = list((all_stock[profit]- 0.0015))
    new_list = [i for i in list1 if i > 0]
    count2 = sum(list(all_stock[profit]< 0))
    count1  = float(count1)
    count2 = float(count2)
    print '    胜率:%.2f' %((count1)/(count1+count2))
回复

使用道具 举报

lht8032 发表于 2017-7-15 05:41:17 来自手机 |显示全部楼层
xiyun_baba 发表于 2017-7-15 00:38
RSI是股市中经常使用的指标,很多技术分析大牛喜欢使用该指标。 RSI指标运行范围在0-100之内,实际 ...
感谢分享
回复

使用道具 举报

zwzhai 发表于 2017-7-15 09:21:07 来自手机 |显示全部楼层
xiyun_baba 发表于 2017-7-15 00:38
RSI是股市中经常使用的指标,很多技术分析大牛喜欢使用该指标。 RSI指标运行范围在0-100之内,实际 ...
好东西!!!!!
回复

使用道具 举报

xiyun_baba 发表于 2017-7-18 21:36:33 来自手机 |显示全部楼层
xiyun_baba 发表于 2017-7-15 00:38
RSI是股市中经常使用的指标,很多技术分析大牛喜欢使用该指标。 RSI指标运行范围在0-100之内,实际 ...
大家评论一下啊
回复

使用道具 举报

xiyun_baba 发表于 2017-7-21 23:52:49 |显示全部楼层
有没有专家、
回复

使用道具 举报

lwell20 发表于 2017-7-27 07:20:08 |显示全部楼层
回复

使用道具 举报

wilson.jia 发表于 2017-7-28 16:59:14 |显示全部楼层
本帖最后由 wilson.jia 于 2017-7-28 21:33 编辑

提问下,count2 = sum(list(all_stock[profit]< 0)),为什么不是sum(list(all_stock[profit] - 0.0015< 0)

回复

使用道具 举报

wilson.jia 发表于 2017-7-28 21:33:51 |显示全部楼层
本帖最后由 wilson.jia 于 2017-7-29 15:56 编辑
xiyun_baba 发表于 2017-7-15 00:59
核心源码如下:
#统计RSI小于某个数值时收益
def multi_date_profit(rsi1,buy,profit,close,muliti,conen ...
提问下,count2 = sum(list(all_stock[profit]< 0)),为什么不是sum(list(all_stock[profit] - 0.0015< 0)
还有,第i天满足rsi条件,按照i+1天的收盘价作为买入价更合理吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2019-10-14 04:53