如何用python神奇九转策略进行历史回测

python对“神奇九转”策略,进行数据回测,并查看历史形成高9低9的时间点。

1 神奇九转原理
股价在上涨或(下跌)过程中连续9日达到触发条件会生成数列1、2,3....7、8,9,数列会依次标注在当日K线上方(下方)。
只有当股价连续第六天达到触发条件时,数列才开始进行依次显示1、2,3、4,5、6
当第七天依然达到触发条件时则显示7,如第七日未达到触发条件则前面6天的序号消失。
第八日同第七日的显示逻辑一样。
当第九天依然达到触发条件时,便形成了1个九转结构(序列)。
而当第九日未达到触发条件时则前面8日的序号消失,九转结构不成立。
2 神奇九转下跌(达到底部,抄底)
低九买入结构:满足两个条件:第一:即连续出现九根K线,并且这些K线的收盘价都比各自前面的第四根K线的收盘价低,就在其K线下方标记相应的数字,如果出现中断,则原计数作废,重新来过。第二:8或9的最低价小于6或7的最低价,在9的下方显示。

img


3 神奇九转上涨(达到顶部,逃顶)
高九卖出结构:满足两个条件:第一.即连续出现九根K线,并且这些K线的收盘价都比各自前面的第四根K线的收盘价高,就在其K线上方标记相应的数字,如果出现中断,则原计数作废,重新来过.第二:8或9的最高价大于6或7的最高价,在9的上方显示。

img


4 首先导入分钟线历史k线数据
5 用神奇九转策略对数据回测,得到历史上形成的高9,低9的时间点及收盘价。
6 输出历史形成高9低9的时间点及收盘价。

版权声明:本文引用为CSDN博主「*星光」的原创文章
原文链接:https://blog.csdn.net/weixin_42322206/article/details/123344752
可以参考CSDN博主「fanfpy」的原创文章
原文链接:https://blog.csdn.net/qq_31663099/article/details/119846913

这个你可以把数据放在pandas里,然后按照这个什么规则进行一个判断。但是是否有效就见仁见智了。在我看来这个规则和跳大神也没啥区别。

Python量化交易策略及回测系统
比较详细,可以借鉴下
https://blog.csdn.net/weixin_47974364/article/details/123433336

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7743203
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这是一个比较复杂的策略,需要用到很多技术,下面是一个简单的思路:

  1. 导入历史分钟线k线数据,可以使用pandas读取csv文件。

  2. 编写九转策略代码,将买入信号和卖出信号打上标记。

  3. 对历史数据进行循环回测,计算每一天的策略信号和收盘价,并将买入和卖出的时间点和价格记录下来。

  4. 输出历史形成的高9低9的时间点及收盘价。

以下是九转策略的简单实现代码:

import pandas as pd

# 导入历史分钟线k线数据
df = pd.read_csv('data.csv')

def jiu_turn_strategy(df):
    # 初始化变量
    high_list = []
    low_list = []
    count = 0
    buy_flag = False
    sell_flag = False
    
    for i in range(len(df)):
        # 检查是否已达到9转
        if count >= 9:
            count = 0
            # 检查是否是高九(卖出信号)
            if df.loc[i, 'high'] > high_list[6] and df.loc[i, 'high'] > df.loc[high_list[8], 'high']:
                sell_flag = True
            # 检查是否是低九(买入信号)
            elif df.loc[i, 'low'] < low_list[6] and df.loc[i, 'low'] < df.loc[low_list[8], 'low']:
                buy_flag = True
            high_list = []
            low_list = []
        # 计算九转序列
        else:
            if df.loc[i, 'high'] > df.loc[i-1, 'high']:
                count += 1
            else:
                count = 0
            high_list.append(i)
            
            if df.loc[i, 'low'] < df.loc[i-1, 'low']:
                count += 1
            else:
                count = 0
            low_list.append(i)
        
        # 打上标记
        if buy_flag:
            df.loc[i, 'buy'] = df.loc[i, 'low']
            buy_flag = False
        if sell_flag:
            df.loc[i, 'sell'] = df.loc[i, 'high']
            sell_flag = False
    
    return df

以下是历史数据回测及输出的代码:

# 对历史数据进行循环回测
result = []
df = jiu_turn_strategy(df)
for i in range(len(df)):
    if df.loc[i, 'buy']:
        result.append(('buy', df.loc[i, 'timestamp'], df.loc[i, 'buy']))
    if df.loc[i, 'sell']:
        result.append(('sell', df.loc[i, 'timestamp'], df.loc[i, 'sell']))

# 输出历史形成的高99的时间点及收盘价
for r in result:
    print('{} at {} with price {}'.format(r[0], r[1], r[2]))

以上是简单的代码举例,实际上还需要处理一些细节问题,例如数据缺失、重复信号等问题。另外,这个策略还可以继续优化,例如加入止损止盈等机制,使其更加完善。
如果我的回答解决了您的问题,请采纳!