量化交易——双均线策略(金叉死叉)

article/2025/9/19 2:38:25

一、双均线概念

  均线:对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些平均值连起来,成为一条线,就叫做N日移动平均线。移动平均线常用线有5日、10日、30日、60日、120日的指标。

    5日和10日的是短线操作参照指标,称作均线指标;

    30日和60日的是中期均线指标,称作均线指标;

    120日和240日的是长期均线指标,称作均线指标。

  金叉:短期均线上穿长期均线,买入信号。

  死叉:短期均线下穿长期均线,卖出信号。

  交易策略:金叉买入,死叉卖出

二、金叉死叉交易练习

1、使用tushare包获取某股票的历史行情

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt    # Python绘图和数据可视化的工具包
import tushare as tsts.get_k_data("601318", start="2004-01-30").to_csv('601318.csv')
df = pd.read_csv('601318.csv', index_col="date", parse_dates=['date'])[['open', 'close', 'high', 'low']]
print(df)
"""open   close    high     low
date                                      
2007-03-01  21.254  19.890  21.666  19.469
2007-03-02  19.979  19.728  20.166  19.503
...            ...     ...     ...     ...
2020-01-22  85.000  85.220  85.480  83.830
2020-01-23  84.010  83.490  84.560  82.480[3076 rows x 4 columns]
"""

2、使用pandas包计算该股票历史数据的5日和30均线

  5日均线则前4天没有均线,30日均线则前29天没有均线。

(1)普通方法

df['ma5'] = np.nan     # 创建5日均值列
df['ma30'] = np.nan    # 创建30日均值列
print(df)
"""open   close    high     low  ma5  ma30
date                                                 
2007-03-01  21.254  19.890  21.666  19.469  NaN   NaN
2007-03-02  19.979  19.728  20.166  19.503  NaN   NaN
...            ...     ...     ...     ...  ...   ...
2020-01-22  85.000  85.220  85.480  83.830  NaN   NaN
2020-01-23  84.010  83.490  84.560  82.480  NaN   NaN
"""
for i in range(4, len(df)):    # 从第五个到最后一个# 当天和前四天的收盘价的平均值为5日均线值df.loc[df.index[i], 'ma5'] = df["close"][i-4:i+1].mean()   # i=4是第五天,[0,5]
print(df)
"""open   close    high     low      ma5  ma30
date                                                     
2007-03-01  21.254  19.890  21.666  19.469      NaN   NaN
2007-03-02  19.979  19.728  20.166  19.503      NaN   NaN
2007-03-05  19.545  18.865  19.626  18.504      NaN   NaN
2007-03-06  18.704  19.235  19.554  18.597      NaN   NaN
2007-03-07  19.252  19.758  19.936  19.090  19.4952   NaN
...            ...     ...     ...     ...      ...   ...
2020-01-23  84.010  83.490  84.560  82.480  85.6320   NaN
"""for i in range(29, len(df)):    # 从第30个到最后一个# 当天和前29天的收盘价的平均值为30日均线值df.loc[df.index[i], 'ma30'] = df["close"][i-29:i+1].mean()
print(df)
"""open   close    high     low      ma5       ma30
date                                                          
2007-03-01  21.254  19.890  21.666  19.469      NaN        NaN
2007-03-02  19.979  19.728  20.166  19.503      NaN        NaN
2007-03-05  19.545  18.865  19.626  18.504      NaN        NaN
2007-03-06  18.704  19.235  19.554  18.597      NaN        NaN
2007-03-07  19.252  19.758  19.936  19.090  19.4952        NaN
...            ...     ...     ...     ...      ...        ...
2020-01-17  86.150  86.250  86.900  85.850  86.1780  85.292333
2020-01-20  88.300  87.600  88.700  87.350  86.4080  85.387667
2020-01-21  87.000  85.600  87.290  85.600  86.1620  85.452667
2020-01-22  85.000  85.220  85.480  83.830  86.0440  85.507000
2020-01-23  84.010  83.490  84.560  82.480  85.6320  85.488667
"""

(2)简单方法

df['ma5'] = df['close'].rolling(5).mean()
df['ma30'] = df['close'].rolling(30).mean()
print(df)
"""open   close    high     low      ma5       ma30
date                                                          
2007-03-01  21.254  19.890  21.666  19.469      NaN        NaN
2007-03-02  19.979  19.728  20.166  19.503      NaN        NaN
2007-03-05  19.545  18.865  19.626  18.504      NaN        NaN
2007-03-06  18.704  19.235  19.554  18.597      NaN        NaN
2007-03-07  19.252  19.758  19.936  19.090  19.4952        NaN
...            ...     ...     ...     ...      ...        ...
2020-01-17  86.150  86.250  86.900  85.850  86.1780  85.292333
2020-01-20  88.300  87.600  88.700  87.350  86.4080  85.387667
2020-01-21  87.000  85.600  87.290  85.600  86.1620  85.452667
2020-01-22  85.000  85.220  85.480  83.830  86.0440  85.507000
2020-01-23  84.010  83.490  84.560  82.480  85.6320  85.488667
"""

3、使用matplotlib包可视化历史数据的收盘价和两条均线

df[['close', 'ma5', 'ma30']].plot()
plt.show()

  运行后显示效果:

  

4、分析输出所有金叉日期和死叉日期

  如果前一交易日五日均线小于30日均线,后一交易日五日均线大于30日均线,则说明是金叉;

  如果前一交易日五日均线大于30日均线,后一交易日五日均线小于30日均线,则说明是死叉。

(1)循环的解法

# dropna()删除含有空数据的全部行,axis参数可删除含义空数据的全部列
df = df.dropna()
gloden_cross = []    # 金叉
death_cross = []      # 死叉for i in range(0, len(df)-1):if df['ma5'][i] >= df['ma30'][i] and df['ma5'][i-1] <= df['ma30'][i-1]:gloden_cross.append(df.index[i])if df['ma5'][i] <= df['ma30'][i] and df['ma5'][i-1] >= df['ma30'][i-1]:death_cross.append(df.index[i])print('金叉日期', gloden_cross)
"""
金叉日期 [Timestamp('2007-06-14 00:00:00'), Timestamp('2007-12-10 00:00:00'),..., Timestamp('2020-01-02 00:00:00')]
"""
print('死叉日期', death_cross)
"""
死叉日期 [Timestamp('2007-06-04 00:00:00'), Timestamp('2007-11-06 00:00:00'),..., Timestamp('2019-12-23 00:00:00')]
"""

(2)简便算法

# dropna()删除含有空数据的全部行,axis参数可删除含义空数据的全部列
df = df.dropna()sr1 = df['ma5'] < df['ma30']
sr2 = df['ma5'] >= df['ma30']death_cross = df[sr1 & sr2.shift(1)].index
golden_cross = df[-(sr1 | sr2.shift(1))].indexprint('金叉日期', golden_cross)
"""
金叉日期 DatetimeIndex(['2007-04-12', '2007-06-14', '2007-12-10', '2008-04-23',..., '2020-01-02']
"""
print('死叉日期', death_cross)
"""
死叉日期 DatetimeIndex(['2007-06-04', '2007-11-06', '2007-12-13', '2008-05-20',..., '2019-11-12', '2019-12-23']
"""

5、使用该策略的炒股收益率

  如果我从2010年1月1日起,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率?

# 炒股收益率
first_money = 100000
money = first_money    # 持有的资金
hold = 0               # 持有的股票
sr1 = pd.Series(1, index=golden_cross)
sr2 = pd.Series(0, index=death_cross)sr = sr1.append(sr2).sort_index()    # 将两个表合并,并按时间排序
sr = sr['2010-01-01':]           # 从2010年1月1日开始for i in range(0, len(sr)):p = df['open'][sr.index[i]]      # 当天的开盘价if sr.iloc[i] == 1:# 金叉buy = money // (100 * p)   # 买多少手hold += buy * 100money -= buy * 100 * pelse:# 死叉money += hold * phold = 0    # 持有股票重置为0# 计算最后一天股票市值加上持有的资金
p = df['open'][-1]
now_money = hold * p + money
print('当前持有资产总额:', now_money)
print('盈亏情况:', now_money - first_money)
"""
当前持有资产总额: 551977.7999999997
盈亏情况: 451977.7999999997
"""

  需要注意的是:这里金叉死叉都是按照当天的收盘价计算的。但是如果得到当天的收盘价就已经无法进行交易了。因此要让策略可行,需要按照当天的开盘价计算。

 


http://chatgpt.dhexx.cn/article/pYkf66Y8.shtml

相关文章

什么是金叉、死叉

转载自&#xff1a;http://blog.sina.com.cn/s/blog_1578c31fd0102wuxu.html 均线系统最基本最简单第一大战法就是“金叉做多&#xff0c;死叉做空”&#xff0c;它是趋势发生转变的重要信号。金叉也称“黄金交叉”&#xff0c;就是一条短期均线成功上穿另一条长期均线&#xf…

“鬼影”浅析 - 反病毒,信息安全,网络安全,反木马,病毒资讯平台,安全解决方案,电脑使用技巧,杀毒软件交流,anti-virus,民间反病毒联盟

访问原文 这个鬼影病毒相信大家都比较熟悉&#xff0c;但是最近似乎那个什么XX工作室已经宣布停止开发了&#xff0c;所以逐渐淡出的人们的视线&#xff0c;但是这个病毒的技术含量比较高&#xff0c;值得去学习…… 鬼影主体:WMPLAYER.EXE MD5:f377e0f7c8f1a37cd5c92cf7aea3c8…

写计算机病毒吗,会写计算机病毒很牛吗

满意答案 djipuh90 2016.02.11 采纳率&#xff1a;52% 等级&#xff1a;12 已帮助&#xff1a;8216人 先假设你说的病毒是os系统病毒&#xff0c;以windows系统为例 类似熊猫烧香这种层次的病毒&#xff0c;大概只能算是非常非常普通的&#xff0c;技术上也没有什么特别之处…

鬼影3分析笔记

这是学习笔记&#xff0c;供自己再次调试回忆&#xff0c;别人看没什么价值&#xff0c;因为写的太乱了。而且有些点自己也没理清 前面是wowocock老师的文档 首先根据教程了解到感染好mbr之后存在磁盘最后的区段的信息有 1.ProtectMode Code是Hook了OsLoader.exe之后获得控制…

鬼影病毒分析报告

鬼影病毒分析报告 一、 鬼影病毒概述 这是一个***下载器&#xff0c;使用了ring3恢复内核钩子、感染磁盘引导区&#xff08;MBR&#xff09;、多种方法结束杀毒软件等 技术自启动并对抗杀毒软件。完全感染后&#xff0c;是一个看不到可疑文件、没有启动项、普通重装系统也无法解…

用友与鬼影病毒

昨天一客户打电话&#xff0c;说软件无法登陆。 上门查看现象如下&#xff1a; 用友服务无法启动&#xff0c;双击启动&#xff0c;报错&#xff1a;本地计算机上的用友通服务启动后又停止了。一些服务自动停止&#xff0c;如果它们没有什么可做的&#xff0c;例如性能和日志警…

鬼影病毒

鬼影病毒是指寄生在磁盘 主引导记录&#xff08;MBR&#xff09;&#xff0c;即使格式化重装系统&#xff0c;也无法清除的病毒。 2010年3月15日&#xff0c;国内某安全中心发现一种被命名为“鬼影”的电脑病毒&#xff0c;由于该病毒成功运行后&#xff0c;在进程中、系统启动…

鬼影病毒6.0分析

原理图 文件名功能1001.exe主模块camhgzsswk.sys释放模块p2phook.sys释放模块的克隆p2pc.ini攻击模块配置文件safemon.dll注入攻击模块beep.sys持久化攻击模块 主模块1001.exe [1]创建用户mima1&#xff0c;运行ipconfig进行掩饰。 [2]释放病毒驱动sys文件。 [3]将病毒驱动注…

鬼影病毒和浏览器锁狼狈为奸,用户浏览器遭强行劫持

鬼影病毒和浏览器锁狼狈为奸&#xff0c;用户浏览器遭强行劫持 据金山毒霸安全实验室监测&#xff0c;发现鬼影病毒变种再次高发&#xff0c;其中一个伪装成阿里旺旺的变种感染量就达1.6万台/天。中毒电脑桌面出现多个图标&#xff0c;浏览器被锁定为go2000.com或soolaa.com&am…

新鬼影病毒

今天和明天是最后两天宿舍有空调的日子啦,暑假宿舍没空调啊,悲催T__T 好吧,今天是最精华的部分啦对于鬼影3的分析,剩下的都是浮云啦,alg.exe不准备分析了,能用OD调试的货.分析起来只是时间问题.但是MBR和之后的保护模式的代码就不一样啦同学们,纯静态分析,伤不起啊,各种硬编码,…

股票量化分析指标公式是什么?

股票量化分析指标公式是什么&#xff1f;其公式为&#xff1a;量比现成交总手/(过去5日平均每分钟成交量当日累计开市时间)。 股票量化分析指标API调用流程&#xff08;部分&#xff09; “股票量化分析指标”是指可以用具体数据反映的指标&#xff0c;比如成交量、市盈率和日…

基于macd、kdj、ma技术指标分析股票多空方向——应用开发4 分析技术指标一系列形态结果

接上一节&#xff0c;我们计算获取了技术指标的结果total_df&#xff0c;结果如下图 我们需要显示股票最近10天的分析结果&#xff0c;对此我们只需要截取total_df前12天数据就可以了。 #获取前12天的数据 total_dftotal_df.iloc[-12:,:] total_df 对应列的数字0&#xff5e;9…

波段炒股看什么指标最准,怎么才能把股票波段做好?

波段炒股看什么指标最准&#xff0c;怎么才能把股票波段做好&#xff1f;股票有不少盈利方式&#xff0c;可是这样的盈利方式&#xff0c;你会吗&#xff1f;做波段盈利的好处在哪里呢&#xff1f; 股票做波段赢利率&#xff0c;针对股票市场的波段操作特点&#xff0c;波段操作…

基于macd、kdj、ma技术指标分析股票多空方向——应用开发3 计算股票相关技术指标数据

接上一节&#xff0c;我们获取了000001.SZ股票过去一年的历史数据stock_df&#xff0c;接下来我们就计算技术指标 所用包 pandas_ta import pandas_ta as ta 关于pandas_ta 可以在GitHub - twopirllc/pandas-ta: Technical Analysis Indicators - Pandas TA is an easy to …

股票 - - 常用指标【下】

股票 - - 常用指标【下】 接上一篇文章,文章地址&#xff1a;八、巴菲特最看重的指标1. 简介 九、快速读懂股票的估值1.前言2.市盈率3.知识点 十、筹码分布 - - 一个一用就上瘾的指标1.一个关于筹码的故事2.关于筹码的形态单峰密集状态双峰密集状态多峰密集形态 3.上述三种形态…

常用技术指标之一文读懂KDJ指标

什么是KDJ指标&#xff1f; KDJ中文名又叫随机指标&#xff0c;英文名叫Stochastic oscillator&#xff0c;由乔治莱恩&#xff08;George Lane&#xff09;于20世纪50年代首创&#xff0c;最早用于期货市场。KDJ指标能比较迅速、直观地研判行情&#xff0c;主要用于分析中短期…

史上最全股票指标图文详解(原创)

炒股要把风险放在第一位,盈利放在第二位。 1、成交量(VOL)指标: 定义:股市中的成交量,是指股票或者大盘当日成交量的总手数。成交量指标一般是用柱状图来表示。左面的坐标值与柱子的横向对应处,就是当日当时的成交总手。如当天收盘价高于当天开盘价,成交柱呈红色;…

期货投资心得

期货的K线是什么 K线就是股票期货某个时间段的价格趋势&#xff0c;有四个数据构成&#xff0c;一个是开盘价&#xff0c;收盘价&#xff0c;最高价&#xff0c;最低价。其中k线红色时表示&#xff0c;收盘价高于收盘价&#xff1b;其中k线绿色时表示&#xff0c;收盘价低于收…

量化分析(8)——唐安奇通道

唐安奇通道和布林通道差不多&#xff0c;都是判断超买和超卖的工具&#xff0c;我还是喜欢rsi强度来判断超买和超卖&#xff0c;不过这二者可以相互印证一下。这里简单的画一下图&#xff0c;介绍一下。 # -*- coding: utf-8 -*- """ Created on Thu Oct 19 11…

Python 金融量化 道路突破策略(唐奇安道路突破策略布林带通道及其市场风险)

目录 获取数据1.通道突破简介2.唐奇安通道(Donchian Channel)2.1 唐奇安通道刻画2.2 在K线图中绘制唐奇安上下通道线2.3 Python捕捉唐奇安通道突破2.4 选择不同时间跨度 3.布林带通道3.1 布林带通道概述3.2布林带通道计算方式3.3 开始编码3.4 布林带通道线及K线图绘制3.5 布林带…