python写炒股软件_⽤Python炒股,你不可以我能⾏!⽹友:
略⽜
由于⼩编并⽆深厚的数学功底也⽆深厚的⾦融知识, 所以不会在本⽂中引⽤各种⾼深的投资模型或数学模型。
交易系统
这⾥的交易系统不⼀定是程序,只是指你⾃⼰的交易原则或者遵守的⼀些技巧或者⽅法,你可以⼿动执⾏也可以借助编程语⾔,编程语⾔不就是⼀套⽤来使⽤的⼯具么。
建⽴⼀个完善的交易体系,我们⾄少应该思考⼀下六个⽅⾯。
1、市场----买卖什么
2、头⼨规模----买卖多少
3、⼊市----何时买⼊
4、⽌损----何时退出亏损的头⼨
5、⽌盈----何时退出盈利的头⼨
6、离市----何时离市
简单的⽰例
买卖A股
全仓
当⽇涨幅超过3%买⼊。
当持有头⼨亏损超过3%,平仓
当⽇跌幅⼤于3%或者三个连续阴线
分析: 这个交易策略其实只有在⾏情以波浪形状向上的⾏情时候才能获利,如果是盘整的情况下,怕是会亏的很惨。这⾥之所以写的这么简单粗暴是为了后⾯策略测试撸代码简单。
数据获取及处理
因为这⾥说的是⽤python炒股,所以应该采⽤程序的⽅式去获取数据,如果⼈⼯炒股,下载任何股票⾏情软件都是可以的,但是⼈⼯的执⾏是需要花费⽐较多的精⼒的。
⽽python语⾔中⽤于获取股票⾏情数据的库,最有名莫过于tushare了。
这⾥以上证乐视的股票为例吧。
python环境安装
安装Anaconda(python2版本)
注:如果没安装过这个环境的经验,就百度或者⾕歌⼀下吧,如果不是安装anaconda则需要艰难的⾃⾏解决依赖。
安装tushare
pip install tushare
获取⾏情数据
import pandas as pd
import tushare as ts
# 通过股票代码获取股票数据,这⾥没有指定开始及结束⽇期
df = ts.get_k_data("300104")
能运行python的软件# 查看前⼗条数据
df.head()
# 查看后⼗条数据
df.tail()
# 将数据的index转换成date字段对应的⽇期
df.index = pd.to_datetime(df.date)
# 将多余的date字段删除
df.drop("date", inplace=True, axis=1)
计算常⽤指标
# 计算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_ohlc
def candlePlot(data, title=""):
data["date"] = [_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.a().get_xticklabels(), rotation=50,
horizontalalignment="center")
fig = f()
fig.set_size_inches(20, 15)
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 = 0
def buy(bar):
global account, position
print("{}: buy {}".format(bar.date, bar.close))
# ⼀⼿价格
one = bar.close * 100
position = account // one
account = account - (position * one)
def sell(bar):
global account, position
# ⼀⼿价格
print("{}: sell {}".format(bar.date, bar.close))
one = bar.close * 100
account += position * one
position = 0
print("开始时间投资时间: ", 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
# ⾃定义事件窗⼝类