竟然可以用python炒股?

article/2025/10/19 11:20:09

由于笔者并无深厚的数学功底也无深厚的金融知识, 所以不会在本文中引用各种高深的投资模型或数学模型,参考书籍主要是《海龟交易法则》《以交易为生》。

交易系统

在交易之前,我们应该首先有一个交易系统用于指导我们自己交易,不一定有什么规范,但是可以作为一个交易的依据,至于这个依据可不可行,科不科学那就见仁见智了。

当然了,这里的交易系统不一定是程序,只是指你自己的交易原则或者遵守的一些技巧或者方法,你可以手动执行也可以借助编程语言,编程语言不就是一套用来使用的工具么.

这里参考海龟交易法则里面的交易体系(这里只是参考大方向).

建立一个完善的交易体系,我们至少应该思考一下六个方面。

  • 1、市场----买卖什么
  • 2、头寸规模----买卖多少
  • 3、入市----何时买入
  • 4、止损----何时退出亏损的头寸
  • 5、止盈----何时退出盈利的头寸
  • 6、离市----何时离市

简单的示例

  • 买卖A股
  • 全仓
  • 当日涨幅超过3%买入。
  • 当持有头寸亏损超过3%,平仓
  • 当日跌幅大于3%或者三个连续阴线

分析: 这个交易策略其实只有在行情以波浪形状向上的行情时候才能获利,如果是盘整的情况下,怕是会亏的很惨。这里之所以写的这么简单粗暴是为了后面策略测试撸代码简单。

数据获取及处理

因为这里说的是用python炒股,所以应该采用程序的方式去获取数据,如果人工炒股,下载任何股票行情软件都是可以的,但是人工的执行是需要花费比较多的精力的。

而python语言中用于获取股票行情数据的库,最有名莫过于tushare了。

这里以上证乐视的股票为例吧。

python环境安装

安装Anaconda(python2版本)

下载地址:https://www.anaconda.com/download/
注:如果没安装过这个环境的经验,就百度或者谷歌一下吧,如果不是安装anaconda则需要艰难的自行解决依赖。

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的。交流经验。从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

安装tushare

pip install tushare

参考: http://tushare.org/

获取行情数据

import pandas as pd
import tushare as ts# 通过股票代码获取股票数据,这里没有指定开始及结束日期
df = ts.get_k_data("300104")# 查看前十条数据
df.head()# 查看后十条数据
df.tail()# 将数据的index转换成date字段对应的日期
df.index = pd.to_datetime(df.date)# 将多余的date字段删除
df.drop("date", inplace=True, axis=1)

注:关于股票数据的相关处理需要由pandas,matplotlib的知识,参考:http://pandas.pydata.org/pandas-docs/version/0.20/10min.html

计算常用指标

# 计算5,15,50日的移动平均线, MA5, MA15, MA50
days = [5, 15, 50]
for ma in days:column_name = "MA{}".format(ma)df[column_name] = pd.rolling_mean(df.close, ma)# 计算浮动比例
df["pchange"] = df.close.pct_change()
# 计算浮动点数
df["change"] = df.close.diff()

最终处理完成后的结果如下:

df.head()
Out[13]: open  close   high    low    volume    code     MA5  MA15  MA50  \
date                                                                           
2013-11-29  9.396  9.741  9.870  9.389  146587.0  300104     NaN   NaN   NaN   
2013-12-02  9.298  8.768  9.344  8.768  177127.0  300104     NaN   NaN   NaN   
2013-12-03  8.142  8.414  8.546  7.890  176305.0  300104     NaN   NaN   NaN   
2013-12-04  8.391  8.072  8.607  8.053  120115.0  300104     NaN   NaN   NaN   
2013-12-05  7.983  7.366  8.108  7.280  253764.0  300104  8.4722   NaN   NaN   pchange  change  
date                          
2013-11-29       NaN     NaN  
2013-12-02 -0.099887  -0.973  
2013-12-03 -0.040374  -0.354  
2013-12-04 -0.040647  -0.342 

可视化

走势图

所谓一图胜前言,将数据可视化可以非常直观的感受到股票的走势。
个人觉得,如果用程序炒股还是应该一切都量化的,不应该有过多的主观观点,如果过于依赖直觉或者当时心情,那么实在没必要用程序分析了。

df[["close", "MA5", "MA15", "MA50"]].plot(figsiz=(10,18))

效果如下:

用python炒股

k线图

import matplotplib.pyplot as plt
from matplotlib.daet import DateFormatter
from matplotlib.finance import date2num, candlestick_ohlcdef candlePlot(data, title=""):data["date"] = [date2num(pd.to_datetime(x)) for x in data.index]dataList = [tuple(x) for x in data[["date", "open", "high", "low", "close"]].values]ax = plt.subplot()ax.set_title(title)ax.xaxis.set_major_formatter(DateFormatter("%y-%m-%d"))candlestick_ohlc(ax, dataList, width=0.7, colorup="r", colordown="g")plt.setp(plt.gca().get_xticklabels(), rotation=50,horizontalalignment="center")fig = plt.gcf()fig.set_size_inches(20, 15)plt.grid(True)candlePlot(df)

效果如下:

用python炒股

注: 这里只是一个示例,说明matplotlib的强大以及小小的演示,如果遇到什么奇怪的问题就查api或者google吧。

策略测试

手动撸代码

这里用最近买过的一只股票吧,京东方A(000725)。

# 导入相关模块
import tushare as ts
import pandas as pd# 获取数据
df = ts.get_k_data("000725")# 处理数据
df.index = pd.to_datetime(df.date)
df.drop("date", axis=1, inplace=True)# 计算浮动比例
df["pchange"] = df.close.pct_change()
# 计算浮动点数
df["change"] = df.close.diff()# 查看当前数据数据前五行open  close   high    low      volume    code   pchange  change
date                                                                        
2015-07-20  4.264  4.234  4.342  4.165  13036186.0  000725       NaN     NaN
2015-07-21  4.136  4.195  4.274  4.096   8776773.0  000725 -0.009211  -0.039
2015-07-22  4.175  4.146  4.214  4.067   9083703.0  000725 -0.011681  -0.049
2015-07-23  4.136  4.254  4.283  4.096  12792734.0  000725  0.026049   0.108
2015-07-24  4.224  4.136  4.254  4.106  13009620.0  000725 -0.027739  -0.118# 设定回撤值
withdraw = 0.03
# 设定突破值
breakthrough = 0.03
# 设定账户资金
account = 10000
# 持有仓位手数
position = 0def buy(bar):global account, positionprint("{}: buy {}".format(bar.date, bar.close))# 一手价格one = bar.close * 100position = account // oneaccount = account - (position * one)def sell(bar):global account, position# 一手价格print("{}: sell {}".format(bar.date, bar.close))one = bar.close * 100account += position * oneposition = 0print("开始时间投资时间: ", df.iloc[0].date)
for date in df.index:bar = df.loc[date]if bar.pchange and bar.pchange > breakthrough and position == 0:buy(bar)elif bar.pchange and bar.pchange < withdraw and position > 0:sell(bar)print("最终可有现金: ", account)
print("最终持有市值: ", position * df.iloc[-1].close * 100)

输出如下:

开始时间投资时间:  2015-07-20
2015-07-29: buy 3.83
2015-07-30: sell 3.653
2015-08-04: buy 3.752
......
2018-02-27: sell 5.71
2018-03-06: buy 5.79
最终可有现金:  333.3
最终持有市值:  7527.0

结论: 通过上面的测试发现资亏了两千多...

借助测试框架

借助测试框架才是正确的回撤姿势,因为框架包含了更多的功能。这里使用pyalgotrade。

简单使用

from pyalgotrade import strategy
from pyalgotrade import technical
from pyalgotrade.barfeed import yahoofeed# 自定义事件窗口类
class DiffEventWindow(technical.EventWindow):def __init__(self, period):assert(period > 0)super(DiffEventWindow, self).__init__(period)self.__value = Nonedef onNewValue(self, dateTime, value):super(DiffEventWindow, self).onNewValue(dateTime, value)if self.windowFull():lastValue = self.getValues()[0]nowValue = self.getValues()[1]self.__value = (nowValue - lastValue) / lastValuedef getValue(self):return self.__value# 自定义指标
class Diff(technical.EventBasedFilter):def __init__(self, dataSeries, period, maxLen=None):super(Diff, self).__init__(dataSeries, DiffEventWindow(period), maxLen)# 定义自己的策略
class MyStrategy(strategy.BacktestingStrategy):def __init__(self, feed, instrument, diffPeriod=2):# 传入feed及初始账户资金super(MyStrategy, self).__init__(feed, 10000)self.__instrument = instrumentself.__position = Noneself.setUseAdjustedValues(True)self.__prices = feed[instrument].getPriceDataSeries()self.__diff = Diff(self.__prices, diffPeriod)self.__break = 0.03self.__withdown = -0.03def getDiff(self):return self.__diffdef onEnterCanceled(self, position):self.__position = Nonedef onEnterOk(self, position):execInfo = position.getEntryOrder().getExecutionInfo()self.info("BUY at $%.2f" % (execInfo.getPrice()))def onExitOk(self, position):execInfo = position.getExitOrder().getExecutionInfo()self.info("SELL at $%.2f" % (execInfo.getPrice()))self.__position = Nonedef onExitCanceled(self, position):# If the exit was canceled, re-submit it.self.__position.exitMarket()def onBars(self, bars):account = self.getBroker().getCash()bar = bars[self.__instrument]if self.__position is None:one = bar.getPrice() * 100oneUnit = account // oneif oneUnit > 0 and self.__diff[-1] > self.__break:self.__position = self.enterLong(self.__instrument, oneUnit * 100, True)elif self.__diff[-1] < self.__withdown and not self.__position.exitActive():self.__position.exitMarket()def runStrategy():# 下载数据jdf = ts.get_k_data("000725")# 新建Adj Close字段jdf["Adj Close"] =jdf.close# 将tushare下的数据的字段保存为pyalgotrade所要求的数据格式jdf.columns = ["Date", "Open", "Close", "High", "Low", "Volume", "code", "Adj Close"]# 将数据保存成本地csv文件jdf.to_csv("jdf.csv", index=False)feed = yahoofeed.Feed()feed.addBarsFromCSV("jdf", "jdf.csv")myStrategy = MyStrategy(feed, "jdf")myStrategy.run()print("Final portfolio value: $%.2f" % myStrategy.getResult())runStrategy()

输出如下

2015-07-30 00:00:00 strategy [INFO] BUY at $3.78
2015-07-31 00:00:00 strategy [INFO] SELL at $3.57
2015-08-05 00:00:00 strategy [INFO] BUY at $3.73
2015-08-06 00:00:00 strategy [INFO] SELL at $3.56
...
2018-02-13 00:00:00 strategy [INFO] BUY at $5.45
Final portfolio value: $7877.30

猛地一看会发现,用框架似乎写了更多的代码,但是框架内置了更多分析工具。
下面简单介绍。

策略可视化

from pyalgotrade import strategy
from pyalgotrade import technical
from pyalgotrade.barfeed import yahoofeed
from pyalgotrade import plotter
from pyalgotrade.stratanalyzer import returnsclass DiffEventWindow(technical.EventWindow):def __init__(self, period):assert(period > 0)super(DiffEventWindow, self).__init__(period)self.__value = Nonedef onNewValue(self, dateTime, value):super(DiffEventWindow, self).onNewValue(dateTime, value)if self.windowFull():lastValue = self.getValues()[0]nowValue = self.getValues()[1]self.__value = (nowValue - lastValue) / lastValuedef getValue(self):return self.__valueclass Diff(technical.EventBasedFilter):def __init__(self, dataSeries, period, maxLen=None):super(Diff, self).__init__(dataSeries, DiffEventWindow(period), maxLen)class MyStrategy(strategy.BacktestingStrategy):def __init__(self, feed, instrument, diffPeriod=2):super(MyStrategy, self).__init__(feed, 10000)self.__instrument = instrumentself.__position = Noneself.setUseAdjustedValues(True)self.__prices = feed[instrument].getPriceDataSeries()self.__diff = Diff(self.__prices, diffPeriod)self.__break = 0.03self.__withdown = -0.03def getDiff(self):return self.__diffdef onEnterCanceled(self, position):self.__position = Nonedef onEnterOk(self, position):execInfo = position.getEntryOrder().getExecutionInfo()self.info("BUY at $%.2f" % (execInfo.getPrice()))def onExitOk(self, position):execInfo = position.getExitOrder().getExecutionInfo()self.info("SELL at $%.2f" % (execInfo.getPrice()))self.__position = Nonedef onExitCanceled(self, position):# If the exit was canceled, re-submit it.self.__position.exitMarket()def onBars(self, bars):account = self.getBroker().getCash()bar = bars[self.__instrument]if self.__position is None:one = bar.getPrice() * 100oneUnit = account // oneif oneUnit > 0 and self.__diff[-1] > self.__break:self.__position = self.enterLong(self.__instrument, oneUnit * 100, True)elif self.__diff[-1] < self.__withdown and not self.__position.exitActive():self.__position.exitMarket()def runStrategy():# 下载数据jdf = ts.get_k_data("000725")# 新建Adj Close字段jdf["Adj Close"] =jdf.close# 将tushare下的数据的字段保存为pyalgotrade所要求的数据格式jdf.columns = ["Date", "Open", "Close", "High", "Low", "Volume", "code", "Adj Close"]# 将数据保存成本地csv文件jdf.to_csv("jdf.csv", index=False)feed = yahoofeed.Feed()feed.addBarsFromCSV("jdf", "jdf.csv")myStrategy = MyStrategy(feed, "jdf")returnsAnalyzer = returns.Returns()myStrategy.attachAnalyzer(returnsAnalyzer)plt = plotter.StrategyPlotter(myStrategy)plt.getInstrumentSubplot("jdf")plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())myStrategy.run()print("Final portfolio value: $%.2f" % myStrategy.getResult())plt.plot()runStrategy()
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

图片输出如下

竟然可以用python炒股?

注: 这里的策略测试股票选择以及时间选择并不严谨,仅作功能展示,测试结果可能有很大的巧合性。

股价监控

根据这个需求写了一个股价监控的半成品,通过邮箱监控。

技巧:在微信的辅助功能里面启用QQ邮箱提醒的功能,那么股价变动的通知就会很及时了,因为微信几乎等同于短信了。

这里简单说一下各个配置项及使用方法。

default段落

breakthrough代表突破的比例,需要传入两个值,项目里面的突破比例依次是3%,5%.

withdraw代表回撤,也需要两个值,示例为3%,5%.

attention代表关注的股票列表,填入关注的股票代码,用空格隔开
注:这里暂时没有考虑关注股票的情况,所以很多的关注股票也许有性能上的问题。

mail段落

依次输入用户名及密码以及收件人的邮箱

position段落

当前持仓的股票以及其持仓成本。
如持有京东方A(000725)以5.76的股价。
000725 = 5.76
如果多个持仓就多个如上的相应的键值对。

使用方法参考该脚本的readme
https://github.com/youerning/UserPyScript/blob/master/monitor/README.md

==PS:很难过的是英文水平不好还用因为注释,以及用英文词汇做变量名,如果词不达意请见谅。==

下单

这一部分本人暂时没有让程序自动执行,因为暂时还没有打磨出来一套适合自己并相信的体系,所以依靠股价监控的通知,根据不断修正的体系在手动执行交易。

后记

由于入市不到一年,所以就不用问我走势或者收益了, 当前战绩是5局3胜,微薄盈利。

最后以下图结束.

竟然可以用python炒股?

最后的最后:

关注一下再走呗^_^


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

相关文章

用深度学习算法预测未来股票走势

最近研究了一下用深度学习算法来预测股票未来的走势&#xff0c;看了网上不少别人分享的案例&#xff0c;也实际进行了测试&#xff0c;感觉用 LSTM 算法比较适用。长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#…

AI in Finance<量化交易人工智能金融投资>(下)

7 机器学习量化策略7.1 基于股价涨跌分类/回归模型7.1.1 特征选择(遗传算法因子挖掘)7.1.2 Linear Regression股价回归预测7.1.3 Logestic Regression涨跌分类预测7.1.4 Random Forests涨跌分类预测7.1.5 SVM涨跌分类/回归预测7.1.6 MLP涨跌分类/回归预测7.1.7 集成学习 涨跌分…

(转)人工智能无处不在,这次是有公司用它来炒股

这事情能成吗&#xff1f; 人工智能是现在科技界一个比较热门的话题&#xff0c;不管公司大小、做什么&#xff0c;都在谈人工智能&#xff0c;好像这是唯一的选择。 现在有人想用它来炒股。 Shaunak Khire 的团队开发了一套机器智能系统 Emma AI&#xff0c;正在募资成立一…

AI 量化机器人,人工智能如何助你从股市发家?

量化交易是不是很高大上&#xff1f; 量化交易&#xff0c;听起来很高大上&#xff0c;其实就是众多投资方法中的一种。 要理解什么是量化交易&#xff0c;首先我们来说说什么叫“量化”。 我们来想象一种场景&#xff1a; 假如有人做了两道菜&#xff0c;让大家去评价这两道菜…

如何用深度强化学习自动炒股

向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习 公众号&#xff1a;datayx 深度学习技术在股票交易上的应用研究调查 http://gregharris.info/a-survey-of-deep-learning-techniques-applied-to-trading/ 文中缩写&#xff1a; DBN 深度信…

如何用人工智能预测股票(完整项目)

本文由 沈庆阳 所有,转载请与作者取得联系! 前言 十分钟实现人工智能股价预测&#xff0c;是一个深度学习的练习项目。其通过机器学习算法&#xff0c;根据过去几年与某只股票相关的K线走势、公司相关报道的情感分析作为数据集&#xff0c;通过训练来得到可以预测股价的机器学…

想靠AI炒股致富,结果恐怕会让你怀疑人生

来源&#xff1a;脑极体 作者&#xff1a;藏狐 经历了漫长熊市的A股&#xff0c;在农历新年后迎来了一个超乎想象的春天。最能够代表牛市来临的信号&#xff0c;不是领跑全球的历史性涨幅&#xff0c;而是连你老家的大妈都准备拿出首付甚至卖房抄底了&#xff0c;各路股神纷纷出…

手把手带你玩转Spark机器学习-使用Spark进行文本处理

系列文章目录 手把手带你玩转Spark机器学习-专栏介绍手把手带你玩转Spark机器学习-问题汇总手把手带你玩转Spark机器学习-Spark的安装及使用手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换手把手带你玩转Spark机器学习-使用Spark构建分类模型手把手带你玩转Spa…

大数据笔记--Spark机器学习(第二篇)

目录 一、梯度下降法 1、什么是梯度&#xff1f; 2、梯度下降法与梯度上升法 3、梯度下降法的直观解释 4、梯度下降法的相关概念 5、梯度下降法原理 6、梯度下降法的算法参数 7、梯度下降法-家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09; 8、总结 …

Spark机器学习(一)-Spark工程搭建

目录 概述 环境准备 搭建Spark项目的代码工程 创建maven项目工程 创建scala测试类 整合spark环境 概述 最近自己在加强AI这块&#xff0c;以前做Java、大数据分析比较多&#xff0c;所以对CDH那套东西都比较熟悉&#xff0c;例如Hadoop、Spark。但Spark这块中的ML用得不…

【Spark】实验6 Spark机器学习库MLlib编程实践

Spark机器学习库MLlib编程实践 一、实验目的 通过实验掌握基本的MLLib编程方法&#xff1b;掌握用MLLib解决一些常见的数据分析问题&#xff0c;包括数据导入、成分分析和分类和预测等。 二、实验平台 新工科智慧平台。数据集1&#xff1a;下载Adult数据集(http://archive.i…

手把手带你玩转Spark机器学习-使用Spark进行数据降维

系列文章目录 手把手带你玩转Spark机器学习-专栏介绍手把手带你玩转Spark机器学习-问题汇总手把手带你玩转Spark机器学习-Spark的安装及使用手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换手把手带你玩转Spark机器学习-使用Spark构建分类模型手把手带你玩转Spa…

spark之常见的机器学习算法

1、分类、回归、聚类 分类回归是一种重要的机器学习和数据挖掘技术。分类的目的是根据数据集的特点构造一个分类函数或分类模型(也常常称作分类器)&#xff0c;该模型能把未知类别的样本映射到给定类别中的一种技术。 即&#xff1a; 向量X[x1,x2...xn]但标签C[c1,c2...,ck]的…

Apache Spark机器学习

推荐电子书&#xff1a;Apache Spark 2.x入门 - 从入门到制作 前言&#xff1a; 使用Apache Spark 2.0及更高版本&#xff0c;实现了很大的改进&#xff0c;使Spark更容易编程和执行更快&#xff1a; Spark SQL和Dataset / DataFrame API通过Spark SQL优化的执行引擎提供易用…

Spark Machine Learning(SparkML):机器学习(部分二)

目录 6.分类和回归 6.1分类(Classification) 逻辑回归(LR) 决策树分类器(DTC) 随机森林分类器(RFC) 梯度提升树分类器(GBTC) 多层感知器分类器(MLPC) 线性支持向量机(SVM) One-vs-Rest分类器 朴素贝叶斯(NB) 6.2回归(Regression) 线性回归(LR) 广义线性回归(GLR) …

spark机器学习笔记:(六)用Spark Python构建回归模型

声明&#xff1a;版权所有&#xff0c;转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmodecontents 博主简介&#xff1a;风雪夜归子&#xff08;英文名&#xff1a;Allen&#xff09;&#xff0c;机器学习算法攻城狮&#xff0c;喜爱钻研Meachine Learnin…

Spark机器学习实例

2020/07/09 - 引言 《Learning Spark》过程中只是简单介绍了mllib中的东西&#xff0c;没有一个完整的实践过程&#xff0c;暂时还没有去找有没有专门做这种的书&#xff0c;好像我看《spark in action》是有这部分内容&#xff0c;后续在看。本篇文章就利用这个鸢尾花的数据集…

spark机器学习笔记:(一)Spark Python初探

声明&#xff1a;版权所有&#xff0c;转载请联系作者并注明出处 http://blog.csdn.net/u013719780?viewmodecontents 博主简介&#xff1a;风雪夜归子&#xff08;英文名&#xff1a;Allen&#xff09;&#xff0c;机器学习算法攻城狮&#xff0c;喜爱钻研Meachine Learnin…

Spark Machine Learning(SparkML):机器学习(部分三)

目录 8.协同过滤(Collaborative Filtering) 8.1交替最小二乘ALS 8.2显式和隐式反馈 8.3缩放正则化参数 8.4冷启动策略 8.5代码示例: 9.频繁模式挖掘(Frequent Pattern Mining) FP-Growth PrefixSpan 10.ML优化&#xff1a;模型选择和超参数调优 模型选择&#xff08…

spark机器学习算法研究

spark提供了一个机器学习库&#xff0c;spark ml包&#xff0c;可以在spark中直接引入使用 import org.apache.spark.ml.clustering.{KMeans,KMeansModel} import org.apache.spark.ml.linalg.Vectors1. 常用聚类算法 k-means 算法 GMM 高斯混合模型 PIC 快速迭代聚类 LDA 隐式…