湖边的白杨树

探索是一种乐趣

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  218 随笔 :: 1 文章 :: 14 评论 :: 59万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

高频交易基于低手续费,且交易判断成功的概率远大于失败的基础上的。

朴素的思路是判断拐点,在拐点处产生快速交易。

首先导入某一期货品种(分钟K线). 

1
df = pd.read_csv("JqData/RB2205.csv", index_col='date',parse_dates=['date'])[['open','close','low','high']]

分K线走势是这样子的:

df = df[:120]
df[['close']].plot()
plt.show()

 

 

找到拐点,并标记出来。(注意:拐点判断有延时性,交易具有延时性)

算法;

求导(dx=1),根据本点的前两点,和上一拐点的性质和距离判断前一点是否是拐点(knee point),本点是否买入或卖出

复制代码
# Create new columns to store the knee point flag, type, and open direction.
df['kpFlag'] = np.NaN
df['kpType'] = np.NaN
df['oDirection'] = np.NaN

prevKpClose = 0
minDistance = 3
prevKpType = KneePointType.Unknown
for i in range(2, len(df)):
    if (df['dy1'][i-1] >=0) and (df['dy1'][i] < 0):   # flat/up -> down
        df.loc[df.index[i-1], 'kpType'] = KneePointType.Down.name
        if (prevKpType != KneePointType.Down):
            df.loc[df.index[i-1], 'kpFlag'] = True
            prevKpType = KneePointType.Down       
            if (df['close'][i-1] - prevKpClose >= minDistance * 1):
                df.loc[df.index[i], 'oDirection'] = OpenDirection.Sell.name
                prevKpClose = df.loc[df.index[i-1], 'close'] 
    elif (df['dy1'][i-1] <=0) and (df['dy1'][i] > 0):   # flat/down -> up
        df.loc[df.index[i-1], 'kpType'] = KneePointType.Up.name
        if (prevKpType != KneePointType.Up):
            df.loc[df.index[i-1], 'kpFlag'] = True
            prevKpType = KneePointType.Up       
            if (df['close'][i-1] - prevKpClose <= minDistance * -1):
                df.loc[df.index[i], 'oDirection'] = OpenDirection.Buy.name
                prevKpClose = df.loc[df.index[i-1], 'close'] 
复制代码

 

 

 

把拐点(K),买点(B),和卖点(S)图形化显示一下:

复制代码
from matplotlib import pylab
z = df[['close','kpFlag']]
z.plot(marker='o') # Plot the data, with a marker set.
#pylab.xlim(0,3) # Change the axes limits so that we can see the annotations.
#pylab.ylim(0,4)
plt.rcParams["figure.figsize"] = (36,20)
ax = pylab.gca()

for i in z.index: # iterate through each index in the dataframe
    v = df.loc[i, 'close'] 
    f = df.loc[i, 'kpFlag'] 
    d = df.loc[i, 'oDirection']
    if f == True:
        ax.annotate('K',xy=(i,v),  bbox=dict(boxstyle='round,pad=0.2', fc='pink', alpha=0.5),)
    if d == OpenDirection.Buy.name:
        ax.annotate('B',xy=(i,v),bbox=dict(boxstyle='round,pad=0.2', fc='red', alpha=0.5),fontsize=20)
    if d == OpenDirection.Sell.name:
        ax.annotate('S',xy=(i,v),  bbox=dict(boxstyle='round,pad=0.2', fc='green', alpha=0.5), fontsize=20)
复制代码

 

 看起来这个震荡行情下的表现还不错,单边行情中还需要做一些微调

 

posted on   fdyang  阅读(501)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示