Python 量化demo

news/2024/10/22 13:47:22

Python量化

量化交易: 通过程序选出合适的股票(或其他),在合适的时机,发起买入或卖出的交易,从中追求盈利。

量化指标

KDJ 指标

KDJ指标,也称为随机振荡器,是一种动量指标,用于衡量一定时间内股票收盘价与价格范围(最高价和最低价)的关系。
KDJ由三条线组成:快速线K、慢速线D和动态线J。这个指标可以帮助交易者识别超买和超卖条件,以及潜在的转折点。

MACD指标

  • MACD,全称是移动平均线收敛/发散指标(Moving Average Convergence Divergence),由以下几个主要部分组成:
  • 快线(短期EMA):这是短期的指数移动平均线,通常使用12天的价格数据进行计算。它对价格变化较为敏感,能够迅速反映市场的最新动态。
  • 慢线(长期EMA):这是长期的指数移动平均线,通常使用26天的价格数据进行计算。与快线相比,它对价格变化的反应较慢,更能反映市场的整体趋势。
  • DIF线(快线与慢线的差):DIF线是快线减去慢线的差值。它表示短期价格变化和长期价格趋势之间的差异。当DIF线在正值区域时,表明短期趋势较强;在负值区域时,表明长期趋势较强。
  • DEA线(信号线):DEA线是DIF线的9天指数移动平均线。它用于平滑DIF线的波动,帮助我们更清晰地观察市场趋势。
  • MACD柱状图:MACD柱状图显示DIF线与DEA线之间的差距。柱状图的高度表示差距的大小,当柱状图由负转正或由正转负时,往往意味着市场趋势的变化。
    通过这几个部分的配合,MACD能够为交易者提供清晰的买入和卖出信号,帮助他们在市场中做出更明智的决策。

KDJ结合MACD和RSI指标的分析方法

代码实现

确定KDJ结合MACD的策略,使用python pandas进行数据处理

数据获取

数据来源:baostock

#获取股票数据
def get_data(ticket,start_date):today = datetime.datetime.now().strftime("%Y-%m-%d")# 登录 Baostocklg = bs.login()# 获取股票数据,rs = bs.query_history_k_data_plus(ticket,"date,code,open,high,low,close,volume",start_date=start_date, end_date=today,frequency="d", adjustflag="3")data_list = []while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())result = pd.DataFrame(data_list, columns=rs.fields)# 转换数据类型result['close'] = result['close'].astype(float)result['high'] = result['high'].astype(float)result['low'] = result['low'].astype(float)# 登出 Baostockbs.logout()return result

KDJ 计算

# 计算 KDJ 指标中的 RSV 值
def calculate_KDJ(data):low_9 = data['low'].rolling(window=9).min()high_9 = data['high'].rolling(window=9).max()data['RSV']  = ((data['close'] - low_9) / (high_9 - low_9)) * 100# 计算 K 值k_period = 3data['K'] = data['RSV'].ewm(alpha=1/k_period).mean()#return rsv# 计算 D 值d_period = 3data['D'] = data['K'].ewm(alpha=1/d_period).mean()# 计算 J 值data['J'] = 3 * data['K'] - 2 * data['D']return data

MACD 计算

# 计算MACD
def calculate_macd(data):ema12 = data['close'].ewm(span = 12).mean()ema26 = data['close'].ewm(span = 26).mean()dif = ema12 - ema26dea = dif.ewm(span = 9).mean()macd_bar = (dif - dea)data['DIF'], data['DEA'], data['MACD'] = dif, dea, macd_barreturn data

买卖信号

def get_final_result(ticket,start_date):data = get_data(ticket,start_date)calculate_macd(data)#print(data)calculate_KDJ(data)# 生成买入卖出信号,结合KDJ和MACDdata['signal'] = np.where((data['K'] < data['D']) & (data['K'] > 20) & (data['D'] > 20) & (data['J'] < data['K']) & (data['J'] > data['D']) & (data['DIF'] > data['DEA']), 0,np.where((data['K'] > data['D']) & (data['K'] < 80) & (data['D'] < 80) & (data['J'] > data['K']) & (data['J'] > data['D']) & (data['DIF'] < data['DEA']), 1, np.nan))return data

选择一只股票测试下:

将处理结果存到文件:

数据可视化

引入matplotlib 模块

def plot_chart(data):plt.figure(figsize=(12, 8))# 绘制收盘价曲线plt.plot(data['date'], data['close'], label='Close Price', color='blue')# 绘制 K、D、J 曲线plt.plot(data['date'], data['K'], label='K', color='green')plt.plot(data['date'], data['D'], label='D', color='orange')plt.plot(data['date'], data['J'], label='J', color='purple')# 绘制 MACD 曲线plt.plot(data['date'], data['DIF'], label='DIF', color='red')plt.plot(data['date'], data['DEA'], label='DEA', color='yellow')plt.bar(data['date'], data['MACD'], label='MACD', color='gray', alpha=0.6)# 添加买入卖出信号标记for index, row in data.iterrows():if row['signal'] == 'buy':plt.scatter(row['date'], row['close'], marker='^', color='green', s=100)elif row['signal'] == 'sell':plt.scatter(row['date'], row['close'], marker='v', color='red', s=100)plt.title('Stock Analysis with KDJ and MACD')plt.xlabel('Date')plt.ylabel('Price')plt.legend()plt.xticks(rotation=45)plt.tight_layout()plt.show()

放到main里测试下:

# 获取处理完成后的数据
result = get_final_result('sh.600887','2024-8-21')
# 调用绘制图表函数
plot_chart(result)
# 存储到文件
result.to_csv("D:\\my_result_241022.csv", index=False)
# 打印带有信号的结果
print(result[['date', 'close', 'K', 'D', 'J', 'DIF', 'DEA', 'MACD', 'signal']])

感觉不对呀:

参考不了,仅供娱乐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

习题2.2

习题2.2代码 import numpy as np import pandas as pd import sympy as sp sp.init_printing(use_unicode=True) import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[Times New Roman + SimSun + WFM Sans SC] plt.rcParams[mathtext.fontset]=cm Times New Roma…

习题2.1

习题2.1代码 import numpy as np import pandas as pd import sympy as sp sp.init_printing(use_unicode=True) import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[Times New Roman + SimSun + WFM Sans SC] plt.rcParams[mathtext.fontset]=cm Times New Roma…

ArgoWorkflow教程(七)---高效的步骤间文件共享策略

之前我们分析了使用 artifact 实现步骤间文件共享,今天分享一下如何使用 PVC 实现高效的步骤间文件共享。1. 概述 之前在 artifact 篇我们演示了如何使用 artifact 实现步骤间文件传递,今天介绍一种更为简单的文件传递方式:PVC 共享。 artifact 毕竟是借助 S3 实现中转,效率…

Linux下安装Nginx,CentOS7安装Nginx

首先,需要安装一些编译 Nginx 所需的依赖包,使用以下命令: yum -y install gcc pcre - devel zlib - devel openssl - devel 下载 https://nginx.org/en/download.html上传到opt目录下 或者直接在linux系统里下载 wget http://nginx.org/download/nginx-1.26.2.tar.gz 如果c…

习题2.7

习题2.7代码 import numpy as np import pandas as pd import sympy as sp sp.init_printing(use_unicode=True) import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[Times New Roman + SimSun + WFM Sans SC] plt.rcParams[mathtext.fontset]=cm Times New Roma…

玩转博客园

收集一些优化博客园的帖子博客园美化主题推荐之Bili https://www.cnblogs.com/AhuntSun-blog/p/12342443.html 博客园 复制他人的博客模板(皮肤) https://www.cnblogs.com/abadcat97/p/14146475.html

C语言中的初始化是什么意思

在C语言中,初始化是指在定义变量时为其赋予初值的过程。通过初始化,可以确保变量在使用之前具有已知的初始值,避免了未初始化变量的不确定行为。初始化可以在变量定义时直接赋值,也可以通过赋予默认值或调用特定的初始化函数来完成。C语言中的初始化 在C语言中,初始化是指…

从事项目管理的朋友们,是如何有效管理项目进度

从事项目管理的專业人士,优化和管理项目进度的有效方法和技巧主要包括以下几点:•创建详细的项目时间表、•分配和优化资源、•设定和跟踪进度基准、•实施有效的团队沟通及•积极应对和管理风险。 首先让我们详细讨论创建详细的项目时间表。针对任何新的项目或任务,首要步骤…