talib 买卖信号_如何产生股票交易的买卖信号

2023-10-11 08:30

本文主要是介绍talib 买卖信号_如何产生股票交易的买卖信号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

talib 买卖信号

回归和分类生成买/卖信号(Regression & Classification to generate buy/sell signals)

Moving average rule says that, buy and sell signals are generated by two moving averages of the level of the index-a long-period average and a short-period average. This strategy is expressed as buying (or selling) in its simplest form; which means when the short-period moving average rises above (or falls below) the long-period moving average. The idea behind computing moving averages it to smooth out an otherwise volatile series. When the short-period moving average penetrates the long-period moving average, a trend is considered to be initiated.

中号oving平均规则认为,买卖信号是由指数长周期平均和短周期平均水平的两条移动均线产生。 这种策略以最简单的形式表示为购买(或出售)。 这意味着当短期移动平均线高于(或低于)长期移动平均线时。 计算移动平均线背后的想法是将其平滑以消除本来不稳定的序列。 当短期移动平均线穿入长期移动平均线时,就认为趋势已经开始。

Here, with a simple example, we have shown as how to generate report on buy/sell signals and visualize the chart.

在这里,通过一个简单的示例,我们展示了如何生成有关买/卖信号的报告并可视化图表。

print("....Data Loading...."); print();
print('\033[4mCrude Oil Spot Price\033[0m');
data = web.DataReader('CL=F', data_source = 'yahoo', start = '2000-01-01');
data;
Image for post

Let’s focus on closing price of daily stock.

让我们专注于每日股票的收盘价。

df = data[['Close']];
# Plot the closing price
df.Close.plot(figsize=(10, 5));
plt.ylabel("Prices (USD)"); plt.title("Crude Oil Price Series");
plt.show();
Image for post

解释变量 (Explanatory variables)

To find the price movement of a stock, we will use two EMAs of different time period. We have taken exponential moving average (ema); in simple moving average (sma), each value in the time period carries equal weight, and values outside of the time period are not included in the average. However, the ema is a cumulative calculation, including all data. Past values have a diminishing contribution to the average, while more recent values have a greater contribution. This method allows the moving average to be more responsive to changes in the data.

为了找到股票的价格走势,我们将使用两个不同时间段的EMA。 我们采用了指数移动平均线(ema); 在简单移动平均值(sma)中,时间段中的每个值都具有相等的权重,并且该时间段之外的值不包括在平均值中。 但是,ema是包括所有数据的累积计算。 过去的值对平均值的贡献减小,而最近的值对平均值的贡献更大。 这种方法使移动平均值对数据的变化更加敏感。

df['ema10'] = (df['Close'].ewm(span=10,adjust=True,ignore_na=True).mean());
df['ema20'] = (df['Close'].ewm(span=20,adjust=True,ignore_na=True).mean());
df['price_tomorrow'] = df['Close'].shift(-1);
df.dropna(inplace=True);
X = df[['ema10', 'ema20']]; y = df['price_tomorrow'];

用原始数据绘制EMA (Plot EMA with original data)

fig = go.Figure(data=[go.Candlestick(x=data.index[-100:],
open=data['Open'][-100:], high=data['High'][-100:], low=data['Low'][-100:], close=data['Close'][-100:])]);
fig.add_trace(go.Scatter(x = df.index[-100:], y = df.ema10[-100:], marker = dict(color = "blue"), name = "EMA10"));
fig.add_trace(go.Scatter(x = df.index[-100:], y = df.ema20[-100:], marker = dict(color = "gray"), name = "EMA10"));
fig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True);
fig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True);
fig.update_layout(autosize = False, width = 1200, height = 600);
fig.update_layout(title='Crude oil prices, yaxis_title='(US$)');
fig.show();
Image for post

Here, shorter the period, the more weight is given to recent prices. In fact a short time period generates a line closely following the actual candles on the chart. Visually this means that there are more occurrences of the price moving above or below the EMA which can be interpreted as a signal to open or close a position.

在这里,时间越短,对近期价格的重视就越大。 实际上,很短的一段时间会在图表上的实际蜡烛线附近紧贴一条线。 从视觉上看,这意味着有更多的价格在EMA上方或下方移动,这可以解释为开仓或平仓的信号。

时间序列数据分割 (Time series data split)

# Split the data into train and test data set
tscv = TimeSeriesSplit();
print(tscv);
TimeSeriesSplit(max_train_size = 0.80, n_splits=5);
for train_index, test_index in tscv.split(X):
#print("TRAIN:", train_index, "TEST:", test_index);
X_train, X_test = X[train_index], X[test_index];
y_train, y_test = y[train_index], y[test_index];print('Length train set: {}'.format(len(y_train)));
print('Length test set: {}'.format(len(y_test)));
Image for post

回归规则 (Regression rule)

# Create a linear regression model
model = ElasticNet(max_iter=5000, random_state=0).fit(X_train, y_train);
print("Linear Regression model:");
print("Crude oil Price (y) = %.2f * 10 Days Moving Average (x1) \
+ %.2f * 20 Days Moving Average (x2) \
+ %.2f (constant)" % (model.coef_[0], model.coef_[1], model.intercept_));
Image for post

绘制实际和预测输出 (Plot actual and predicted output)

y_pred = DataFrame(model.predict(X_test), index = df[-len(y_test):].index, columns = ['price']);
y_test = DataFrame(y_test, index = df[-len(y_test):].index, columns = ['price']);fig = go.Figure();
fig.add_trace(go.Scatter(x = y_pred.index, y = y_pred.price,
marker = dict(color ="red"), name = "Actual price"));
fig.add_trace(go.Scatter(x = y_test.index, y = y_test.price, marker=dict(color = "green"), name = "Predicted price"));
fig.update_xaxes(showline = True, linewidth = 2, linecolor='black', mirror = True, showspikes = True,);
fig.update_yaxes(showline = True, linewidth = 2, linecolor='black', mirror = True, showspikes = True,);
fig.update_layout(title= "Crude oil price (predicted vs actual", yaxis_title = 'price (US$)', hovermode = "x", hoverdistance = 100, spikedistance = 1000);
fig.update_layout(autosize = False, width = 1000, height = 400,);
fig.show();
Image for post

测试精度 (Test accuracy)

accuracy = model.score(X_test, y_test);
print("Accuracy: ", round(accuracy*100,2).astype(str) + '%');
Image for post
oil = DataFrame();
oil['price'] = df[-len(y_test):]['Close'];
oil['pred_next_day'] = y_pred;
oil['actual_price_next_day'] = y_test;
oil['returns'] = oil['price'].pct_change().shift(-1);
oil['signal'] = np.where(oil.pred_next_day.shift(1) < oil.pred_next_day,1,0);
oil['strategy_returns'] = oil.signal * oil['returns'];((oil['strategy_returns']+1).cumprod()).plot(figsize=(10,5));
plt.ylabel('Cumulative Returns');
plt.show();
Image for post

The Sharpe ratio is a well-known and well-reputed measure of risk-adjusted return on an investment or portfolio, developed by the economist William Sharpe.

夏普(Sharpe)比率是经济学家威廉·夏普(William Sharpe)提出的一种众所周知的,声誉良好的衡量风险的投资或投资组合调整收益的方法。

The Formula for the Sharpe Ratio is:

夏普比率的公式是:

Average return / Std dev of return

平均回报率/标准回报率

Image for post
  • Usually, any Sharpe ratio > 1.0 is considered acceptable.

    通常,任何大于1.0的Sharpe比率都可以接受。
  • A ratio > 2.0 is rated as very good.

    比率> 2.0被评为非常好。
  • A ratio of 3.0 or higher is considered excellent.

    3.0或更高的比率被认为是极好的。
  • A ratio < 1.0 is considered sub-optimal.

    比率<1.0被认为是次优的。

买卖报告 (Buy/Sell Report)

df.loc[:,'pred_price'] = model.predict(df[['ema10', 'ema20']]);
df.loc[:,'signal'] = np.where(df.pred_price.shift(1) < df.pred_price,"Buy","Sell");
df.loc[:,'price_direction'] = df['signal'].replace(('Sell', 'Buy'), (0, 1));
df.tail();
Image for post

买/卖信号图 (Buy/Sell signals plot)

buys = df.loc[df['price_direction'] == 1]; sells = df.loc[df['price_direction'] == 0];# Plot
fig = plt.figure(figsize=(20, 5));
plt.plot(df.index, df['Close'], lw=2., label='Price');# Plot the buy and sell signals on the same plot
plt.plot(buys.index, df.loc[buys.index]['Close'], '^', markersize=5, color='k', lw=2., label='Buy');
plt.plot(sells.index, df.loc[sells.index]['Close'], 'v', markersize = 5, color='g', lw=2., label='Sell');
plt.ylabel('Price (USD)'); plt.xlabel('Date');
plt.title('Buy and Sell signals plot'); plt.legend(loc='best');# Display everything
plt.show()
Image for post

分类规则 (Classification rule)

# creating predictors and target variables for classification
print('Data shape:', df.shape); print();
X = np.array(df[['ema10', 'ema20']]);# Target variable
y = np.array(df['price_direction']);
Image for post

时间序列分割 (Time series split)

tscv = TimeSeriesSplit()
#print(tscv)
TimeSeriesSplit(max_train_size = 0.80, n_splits=5)
for train_index, test_index in tscv.split(X):
#print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]print('Length train set: {}'.format(len(y_train)))
print('Length test set: {}'.format(len(y_test)))
Image for post

逻辑回归 (Logistic Regression)

print('\033[4mLogistic Regression\033[0m')
clf = LogisticRegression(solver='liblinear', C=0.05, random_state=0
).fit (X_train,y_train);
model_scores = cross_val_score(clf, X_train, y_train, cv=5);
model_mean = model_scores.mean();
print ('Accuracy score (%):', model_mean*100);
Image for post

预测与准确性 (Prediction & accuracy)

y_pred = clf.predict(X_test)
# evaluate predictions
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
Image for post

分类报告 (Classification report)

print('Confusion matrix:'); print(confusion_matrix(y_test, y_pred)); print(); print ('Classification report:'); print (classification_report(y_test, y_pred));
Image for post

The recall means how many of this class we find over the whole number of element of this class. The precision here is how many are correctly classified among that class. The f1-score is the harmonic mean between precision & recall. The support is the number of occurrence of the given class in our data.

召回意味着我们可以在该类的全部元素中找到多少个此类。 这里的精度是在该类中正确分类的数量。 f1分数是精度和查全率之间的谐波平均值。 支持是给定类在我们的数据中出现的次数。

结论 (Conclusion)

We have shown here a simplified version of generating buy/sell signals based on moving average. This is a simple and fundamental process. Other technical indicators such as MACD, ROC etc. can be added based on trading strategy.

我们在这里显示了根据移动平均值生成买/卖信号的简化版本。 这是一个简单而基本的过程。 可以根据交易策略添加其他技术指标,例如MACD,ROC等。

Connect me here.

在这里连接我

Note: The programs described here are experimental and should be used with caution for any commercial purpose. All such use at your own risk.

注意:此处描述的程序是实验性的,出于商业目的应谨慎使用。 所有此类使用后果自负。

翻译自: https://medium.com/swlh/how-to-generate-buy-sell-signals-of-stock-trading-2542e9055c7f

talib 买卖信号


http://www.taodudu.cc/news/show-7921239.html

相关文章:

  • 数据挖掘笔试题(一)
  • Backtrader官方中文文档:第十六章Plotting绘图
  • 解读:一种金融时间序列预测方法:基于栈式自编码器、小波变换以及LSTM的深度学习框架...
  • 3dsmax 渲染到纹理 法线贴图
  • 【布线神器】3DMAX平滑布尔插件超级布尔工具SmoothBoolean直接提升10倍建模速度
  • (1).Windows词汇表大曝光
  • 顶象滑块的js逆向分析
  • 职场沟通的3个技巧,你们知道吗?
  • 职场沟通技巧揭秘:四步走,有效达成共识
  • 职场沟通技巧:高效沟通,化解冲突的秘诀
  • 通过PS制作遮罩/透贴贴图
  • 微信小程序小游戏中下载文件后缀名为unknown的解决方法(Laya引擎)
  • xbox游戏文件备份了,怎么才能不重新下载
  • ue4 development game初始化全局着色库所需的游戏文件缺失解决办法
  • 基于SpringBoot的企业招聘信息管理系统
  • 基于Python的城市招聘信息爬取和分析
  • 2017暑期实习校园招聘—软件开发方向面经
  • ADOBE READER把PDF转换成WORD教程
  • 2023基于微信小程序的校园求职招聘系统+后台管理系统(SSM+mysql)-JAVA.VUE(论文+开题报告+运行)
  • CAD转换为图片可以设置哪些格式
  • Rust Programming Language - Rust 编程语言
  • RustDesk自建中转服务器如何自己编译 RustDesk客户端,将企业固定IP/域名写进客户端,客户端安装无需配置直接使用(三)
  • Rust权威指南配套手把手笔记
  • rust 用steamcmd命令_Rust 的命令行应用
  • python go rust_rust ,go 对比选择
  • 【Rust】常用支持 Rust 的编辑器推荐
  • Rust:多线程并发编程
  • rust工程
  • 如何使用VSCode配置Rust开发环境(VS Code 安装 Rust 常用插件)
  • rust的现状和未来发展
  • 这篇关于talib 买卖信号_如何产生股票交易的买卖信号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/186827

    相关文章

    MCU7.keil中build产生的hex文件解读

    1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

    列举你能想到的UNIX信号,并说明信号用途

    信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

    Linux中如何屏蔽信号

    本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。 本文主要参考自《嵌入式linux系统使用开发》,作者何永琪,Thanks. 在linux系统中,如何处理某个进程发送的一个特定信号呢?一般来说有三种方式: 1) 忽略信号 2) 屏蔽信号 3) 为该信号添

    笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

    目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

    信号与信号量的区别[转]

    信号量(Semaphore),有时被称为信号灯,是在多环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Se

    国产隔离放大器:增强信号完整性和系统安全性的指南

    隔离放大器是电子领域的关键组件,特别是在信号完整性和电气隔离至关重要的应用中。这些放大器隔离输入和输出信号,使它们能够在没有直接电气连接的情况下跨不同系统传输数据。这确保了电路一部分的高压尖峰或噪声不会影响另一部分,从而保护了系统和用户。随着国产隔离放大器的不断发展,它们提供了性能、可靠性和成本效益的完美结合,使其成为工程师和系统设计师的理想选择。 1. 了解国产隔离放大器的优势 增强信号

    信号有效带宽

    根据傅里叶变换可以知道信号带宽是无穷大的,这对实际应用是帮助不大的,所以有了有效带宽的概念,可能大家知道常用的经验公式:O.35/Tr或者0.5/Tr等,那这个公式是怎么来的呢?有效带宽又是什么含义呢? 首先来看一个RC低通滤波器,如下: 其上升时间Tr为: 该滤波器的传递函数为: H(s)=1/(RCS+1) 式中S=2πf,转换为频率f的函数为: H(f)=1/(R

    Linux 一个简单的中断信号实现

    1.查看手册,学习中断处理图 流程:(次级源->开关)到 源挂起 到 开关  到 处理优先级 到 中断挂起标志 到 CPSR里面的开关(图中未展现) 最后cpu处理 此次我们先使用k1按键实现中断,即是eint8 2.此次仅涉及一个中断挂起,步骤较简单,有的寄存器未涉及处理。 寄存器挂起后,通过写1清除对应位( 硬件设计逻辑: 中断标志位通常由硬件自动设置为 1,表示中断发生。

    【QT】十分钟全面理解 信号与槽的机制

    目录 从一个定时器开始全方位简介1. 基本的信号与槽连接语法例子 2. 使用函数指针连接信号与槽(现代 C++ 风格)语法例子 3. 使用 Lambda 表达式作为槽语法例子 4. 自动连接(`QMetaObject::connectSlotsByName`)规则例子 5. 信号与槽的多对多连接例子(一个信号连接多个槽)例子(多个信号连接一个槽) 6. 断开信号与槽的连接语法例子 7. 信号

    RS485差分信号不对称

    在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信