广州大学--金融股票数据分析

广州大学–企业实训–金融分析


Part_1

  • 获取股票数据
  • 数据清洗以及格式化
  • 绘制股票k日均线以及利用双均线进行股票模拟交易
    在这里插入图片描述

准备工作

1、通过链接获取股票数据:五粮液股票数据
2、将股票数据保存到本地,并存为csv格式。
3、修改文件名称(便于后续代码读取文件)
ps:链接中code可以自行替换成想要的代码编号,同时start和end表示开始日期和结束日期,可自行调整。

主要思想

  • 短期均线和长期均线交会地方为交易时机。

  • 短期曲线从下方突破长期曲线为黄金交叉,适合买入;
    在这里插入图片描述

  • 短期曲线从上方突破长期曲线为死亡交叉,适合卖出。
    在这里插入图片描述

代码

import pandas as pd
import datetime

# 读取文件数据
def read(file_name):
    # 读取文件数据
    array = pd.read_csv(file_name, sep=',')
    # 创建list存储数据
    data = [[] for _ in range(len(array))]
    # 依次存储到list中
    for i in range(len(data)):
        data[i].append(change_data(array['日期'][i]))
        data[i].append(array["开盘价"][i])
        data[i].append(array["收盘价"][i])
        data[i].append(array["涨跌幅"][i])
        data[i].append(array["涨跌百分比"][i])
        data[i].append(array["最低价"][i])
        data[i].append(array["最高价"][i])
        data[i].append(array["成交手数"][i])
    return data

# 将字符类型的时间转换成time类型
def change_data(data):
    time = datetime.datetime.strptime(data, '%Y/%m/%d').date()
    return time

# k日均线
# 参数为()
def k(index, data, k):
    # 切片当前天数前k天
    temp = data[index - k - 1:index - 1]
    # t存储k天的开盘价
    t = []
    # 计算类和
    s = 0
    # 添加前k天的开盘价
    for i in range(k):
        t.append(temp[i][1])
        s += t[i]
    # 返回均值
    return s / k

# 输出当天的数据
def rec_day(index, data, short, long):
    print(data[index][0])
    print("当天开盘价:", data[index][1])
    print("前", short, "天均值为:", k(index, data, short))
    print("前", long, "天均值为:", k(index, data, long))

if __name__ == '__main__':
    # 读取文件数据
    shares = read('000858(2).csv')
    # 初始资金
    first_money = 10000000
    # 当前账户余额
    money = 10000000
    # 当前持有股票数量
    num = 0
    # 判断是否买
    flag = 0
    # 记录最后一天的价格
    last_price = 0

    # 炒股天数
    for i in range(1250):
        # 短期曲线日期
        short = 5
        # 长期曲线日期
        long = 100

        # 设置开始日期
        # 如果考虑10日曲线和月曲线,则开始日期要设置得大一点
        start_day = long + 1
        # 输出今天的信息
        rec_day(i + start_day, shares, short, long)
        # 今天的开盘价
        recent = shares[i + start_day][1]
        # 记录最后一天的价格
        last_price = recent
        # 前5日均值
        day_5 = k(i + short + 1, shares, short)
        day_10 = k(i + long + 1, shares, long)

        # 此时短期曲线从下方突破长期曲线,为黄金交叉
        if day_10 > day_5 and flag == 0:
            # num表示持有股票数
            num += int(money / recent / 100)
            # money表示当前余额
            money -= num * recent * 100
            flag = 1
            print("价格合适,冲了", num, "股")
        # 此时短期曲线从上方向下突破长期曲线,为死亡交叉
        elif day_10 < day_5 and flag == 1:
            print("跌了跌了,快卖出!")
            money += num * recent * 100
            # 全部卖出
            num = 0
            flag = 0
        else:
            pass
        print("账户余额:", int(money))
        print("持有股数:", num)
        print('\n')

    print("最后一天,以当天开盘价出了")
    money += num * last_price * 100
    num = 0
    print("账户余额:", int(money))
    print("利润:", int(money - first_money))
    print("利润率:", (((money - first_money) / first_money) * 100), "%")
    print("持有股数:", num)

结果展示

在这里插入图片描述


Part_2

  • 选择一支股票绘制k线图
原理

股市及期货市场中的K线图的画法包含四个数据,即开盘价、最高价、最低价、收盘价,所有的k线都是围绕这四个数据展开,反映大势的状况和价格信息。如果把每日的K线图放在一张纸上,就能得到日K线图,同样也可画出周K线图、月K线图。

步骤

1、.利用tushare工具对股票数据信息进行采集。
2、处理采集的股票数据信息,new_data=开盘价、收盘价、日最低价、日最高价,ma5、ma10、ma20分别表示五日、十日、二十日移动平均线,v_data=当日成交量、五日、十日、二十日平均成交量。
3、绘制K线。
4、绘制MA线,对不同的移动平均线给予不同的颜色。
5、绘制成交量,当天的股价上涨时,成交量柱状图为红色,当天的股价下跌时,成交量柱状图为绿色。
6、将K线、成交量图添加入图表中。
7、将图标保存到本地,打开本地数据页面。

代码_1

import tushare as ts
from pyecharts import options as opts
from pyecharts.charts import Bar, Kline, Line, Grid
from pyecharts.globals import ThemeType
import webbrowser as wb

# 股票代码
stock_code = '000858'
# 开始日期
start_date = '2018-07-10'
# 截止日期
end_date = '2018-12-31'

# 获取股票交易历史数据
df = ts.get_hist_data(stock_code,
                      start=start_date,
                      end=end_date)
df = df.iloc[::-1]

# 开盘价、收盘价、日最低价、日最高价
mount_data = df[['open', 'close', 'low', 'high']]

# 取日期
date = list(mount_data._stat_axis.values)

new_data = []

# 取k线图所需数据,第一个为开盘价,第二个为收盘价,第三为最小值,第四为最大值
for i in range(len(date)):
    temp_data = []
    # temp_data保存每日开盘、收盘、最小值、最大值数据
    for j in mount_data.columns.values:
        temp_data.append(mount_data.iloc[i][j])
    # new_data保存temp_data
    new_data.append(temp_data)

# 当日成交量、5日平均成交量、10日平均成交量、20日平均成交量
v_data = df[['volume', 'v_ma5', 'v_ma10', 'v_ma20']]
ma5 = list(df['ma5'])
ma10 = list(df['ma10'])
ma20 = list(df['ma20'])

# 绘制K线
kline = (
    Kline().add_xaxis(xaxis_data=date)  # 显示x轴日期
        .add_yaxis("k_线图", y_axis=new_data,
                   # 自定义颜色
                   itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), )  # y轴展示股票价格

        .set_global_opts(
        # 提示框
        tooltip_opts=opts.TooltipOpts(
            trigger="axis",
            axis_pointer_type="cross",
            background_color="rgba(245, 245, 245, 0.8)",  # rgb表示颜色选择
            border_width=1,  # 边框宽度选择
            border_color="#ccc",  # 边框颜色
            textstyle_opts=opts.TextStyleOpts(color="#000"),  # 文字颜色设置
        ),
        # 区域缩放
        datazoom_opts=[  # 设置zoom参数后即可缩放
            opts.DataZoomOpts(
                # 调节是否显示组件
                is_show=False,
                type_="inside",
                # 设置两个轴同时缩放
                xaxis_index=[0, 1],
                # 范围
                range_start=0,
                range_end=100,
            ),
            opts.DataZoomOpts(
                is_show=True,
                xaxis_index=[0, 1],
                type_="slider",
                # 基于顶部进行百分比对齐
                pos_top="90%",
                range_start=0,
                range_end=100,
            ),
        ],
        # 视觉映射配置项
        visualmap_opts=opts.VisualMapOpts(
            is_show=False,
            dimension=2,
            series_index=[4, 5, 6, 7],
            is_piecewise=True,
            pieces=[
                {"value": 1, "color": "#ec0000"},
                {"value": -1, "color": "#00da3c"},  # 颜色选择-1:绿色,1:亮红色
            ],
        ),
        # y轴起始坐标可自动调整
        yaxis_opts=opts.AxisOpts(
            is_scale=True,
            splitarea_opts=opts.SplitAreaOpts(
                is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=0.5)
            ),
        ),
        # 坐标轴指示器配置项
        axispointer_opts=opts.AxisPointerOpts(
            is_show=True,
            link=[{"xAxisIndex": "all"}],
            label=opts.LabelOpts(background_color="#777"),  # 轴颜色
        ),
        # 区域选择组件配置项
        brush_opts=opts.BrushOpts(
            x_axis_index="all",
            brush_link="all", # "all" 表示所有 series 都进行brushLink联动
            out_of_brush={"colorAlpha": 0.1}, # 图元的颜色的透明度
            brush_type="lineX",  # 刷子类型
        ),

        xaxis_opts=opts.AxisOpts(is_scale=True),
        # 标题
        title_opts=opts.TitleOpts(title="000858股票2018下半年k线图"),
    )
)

line = (
    Line()
        .add_xaxis(xaxis_data=date)  # 显示x轴日期
        .add_yaxis(  # 显示五日均线
        series_name="MA5",
        y_axis=ma5,
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=0.5, opacity=0.5), # 宽度和透明度
        itemstyle_opts=opts.ItemStyleOpts(color="#0004a1"), # 图形的颜色
        label_opts=opts.LabelOpts(is_show=False),
    )
        .add_yaxis(  # 显示十日均线
        # 参数部分同MA5
        series_name="MA10",
        y_axis=ma10,
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=0.5, opacity=0.5),
        itemstyle_opts=opts.ItemStyleOpts(color="#fff401"),
        label_opts=opts.LabelOpts(is_show=False),
    )
        .add_yaxis(  # 显示二十日均线
        # 参数部分同MA5
        series_name="MA20",
        y_axis=ma20,
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=0.5, opacity=0.5),
        itemstyle_opts=opts.ItemStyleOpts(color="#71f401"),
        label_opts=opts.LabelOpts(is_show=False),
    )
        .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
)

# 绘制成交量图
a = Bar()

# 成交量图x轴表示日期
a.add_xaxis(date)

for i in v_data.columns.values:
    data_volume = list(v_data[i])
    bar = (a.add_yaxis(i,
                       [[j, data_volume[j],
                         -1 if new_data[j][0] > new_data[j][1]  # 根据开盘价与收盘价的比较,跌:-1,涨:1
                         else 1] for j in
                        range(len(data_volume))],  # 颜色选择-1:绿色,1:亮红色
                       label_opts=opts.LabelOpts(is_show=False),
                       xaxis_index=1,
                       yaxis_index=1
                       )
        .set_global_opts(
        # 取消x轴的显示
        xaxis_opts=opts.AxisOpts(
            type_="category",
            is_scale=True,
            grid_index=1,
            boundary_gap=False,
            axisline_opts=opts.AxisLineOpts(is_on_zero=False),
            axistick_opts=opts.AxisTickOpts(is_show=False),
            splitline_opts=opts.SplitLineOpts(is_show=False),
            axislabel_opts=opts.LabelOpts(is_show=False),
            split_number=20,
            min_="dataMin",
            max_="dataMax",
        ),
        legend_opts=opts.LegendOpts(selected_mode="single", pos_right="30%", pos_top="70%")
    )

    )

overlap_kline_line = kline.overlap(line)

grid_chart = Grid(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))

# 将K线添加进图标中
grid_chart.add(
    overlap_kline_line,
    # 设置位置
    grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%"),
)

# 将成交量图添加进下半部分
grid_chart.add(
    bar,
    grid_opts=opts.GridOpts(
        pos_left="10%", pos_right="8%", pos_top="75%", height="16%"
    ),
)

# 保存到本地
grid_chart.render("kline_test.html")
# 打开本地数据页面
wb.open("kline_test.html")

结果展示_1

  • K线图【[000858]2018-07-16~2018-12-27】完整图:
    在这里插入图片描述

  • K线图【[000858]2018-07-16~2018-12-27】仅K线图:
    在这里插入图片描述

  • K线图【[000858]2018-07-16~2018-12-27】仅MA5与成交量MA5图:
    在这里插入图片描述

  • 单日成交量、开盘价、收盘价、最低价、最高价、MA5、MA10、MA20信息显示:
    在这里插入图片描述

代码_2

# -*- coding: utf-8 -*-
# @Time    : 2021/1/7 10:34
# @Author  : Joker
# @Site    : 
# @File    : window.py
# @Software: PyCharm
# coding: utf-8


import requests
import pandas as pd
import matplotlib.pyplot as plt
from pyecharts.charts import Kline, Bar, Grid, Line
from pyecharts import options as opts
import webbrowser as wb

# 股票代码
stock_code = '1000858'
# 开始日期
start_date = '20150815'
# 截止日期
end_date = '20210105'

# 设置数据url
url = 'http://quotes.money.163.com/service/chddata.html?code={}&start={}&end={}'.format(stock_code, start_date,
                                                                                        end_date)

# 从网上获取股票交易历史数据
online_data = requests.get(url)

# 根据股票代码设置csv文件名称
csv_file_name = 'stock_{}.csv'.format(stock_code)

# 将数据保存到本地csv文件
with open(csv_file_name, "wb") as f:
    f.write(online_data.content)

# 读取股票数据
stock_data = pd.read_csv(csv_file_name, encoding='gb2312')

# 将股票数据按照日期进行排序
stock_data = stock_data.sort_values(by=["日期"], ascending=[True], inplace=False)

# 清洗掉收盘价<0的股票数据
stock_data_cleared = stock_data[stock_data['收盘价'] > 0]

# 获取掉股票名称
stock_name = '五粮液'

# 计算股票数据长度
row_count = stock_data_cleared.shape[0]
# 计算股票数据行数
x_tick_interval = int(row_count / 20)
x_tick_index = range(0, row_count, x_tick_interval)

# 设置窗口尺寸
plt.figure(figsize=(12, 6))

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 上半部分图片
plt.subplot(211)
# 绘制收盘价的线条
plt.plot(range(row_count), stock_data_cleared['收盘价'], color="red", linewidth=0.2)
plt.plot(range(row_count), stock_data_cleared['开盘价'], color="blue", linewidth=0.2)
# 展示横轴时间
plt.xticks(x_tick_index, "")
# 收盘价范围
plt.yticks(range(0, 360, 20))
plt.xlabel("时间")
plt.ylabel("收盘价")
# 设置背景网格
plt.grid(linewidth=0.5, color="black", alpha=0.5)
# 展示股票名称和代码
plt.title(stock_name + "\n\n股票代码" + stock_code)

# 下半部分图片
plt.subplot(212)
# 绘制成交量的柱状图
plt.bar(range(row_count), stock_data_cleared["成交量"], color="#008080")
# 显示x轴坐标
plt.xticks(x_tick_index, stock_data_cleared.iloc[x_tick_index, 0], rotation=70)
# 背景网格线
plt.grid(linewidth=0.5, color="#008080", alpha=0.5)
# 调整子图布局
plt.subplots_adjust(hspace=0.1)
# y轴注释
plt.ylabel("成交量")
# 展示图片
# plt.show()

stock_data_extracted = stock_data_cleared[["开盘价", "收盘价", "最低价", "最高价", "成交量", "日期"]]


# 计算日均线
# 参数为(数据源,天数)
def moving_average(data, day_count):
    # 截取数据源的时间列
    data = data.values[:, 0]
    result = []
    for i in range(len(data)):
        start_day_index = i - day_count + 1
        # 检测开始日期小于0的情况
        if start_day_index <= 0:
            start_day_index = 0
        # 调整后的日期即准确的天数
        justified_day_count = i - start_day_index + 1
        # 求均值
        mean = data[start_day_index:i + 1].sum() / justified_day_count
        result.append(round(mean, 2))
    return result


# 绘制k线
kline = (
    Kline()
        .add_xaxis(stock_data_extracted["日期"].values.tolist())  # 展示x轴日期
        .add_yaxis("", stock_data_extracted.iloc[:, :4].values.tolist(),
                   itemstyle_opts=opts.ItemStyleOpts(
                       # 自定义颜色
                       color="#ec0000",
                       color0="#00da3c",
                       border_color="#8A0000",
                       border_color0="#008F28", )
                   )  # 展示y轴成交量

        .set_global_opts(
        xaxis_opts=opts.AxisOpts(is_scale=True, is_show=False),
        # axis_opts=opts.AxisOpts(is_scale=True,min_=0), #y轴起始坐标可以设为0
        yaxis_opts=opts.AxisOpts(is_scale=True),  # y轴起始坐标可自动调整
        # 绘制上半部分价格的图
        # 左边注释
        title_opts=opts.TitleOpts(title="价格", subtitle=stock_name + "\n" + stock_code, pos_top="20%"),
        axispointer_opts=opts.AxisPointerOpts(
            is_show=True,
            link=[{"xAxisIndex": "all"}],
            label=opts.LabelOpts(background_color="#777"),
        ),
        # 设置缩放
        datazoom_opts=[  # 设置zoom参数后即可缩放
            opts.DataZoomOpts(
                # 显示组件
                is_show=True,
                type_="inside",
                # 设置两个轴同时缩放
                xaxis_index=[0, 1],
                # 范围
                range_start=0,
                range_end=100,
            ),
            opts.DataZoomOpts(
                is_show=True,
                xaxis_index=[0, 1],
                type_="slider",
                # 基于顶部进行百分比对齐
                pos_top="90%",
                range_start=0,
                range_end=100,
            ),
        ],
        # 视觉映射配置项
        visualmap_opts=opts.VisualMapOpts(is_show=False, type_='color', dimension=None, series_index=[3, 5],
                                          is_piecewise=False,
                                          pieces=[{"value": 1, "color": "#ec0000"},
                                                  {"value": -1, "color": "#00da3c"}, ], ),

    )
)

# 绘制开盘线、收盘线等
line = (
    Line()
        # 5日均线
        # 横轴为日期
        .add_xaxis(xaxis_data=stock_data_extracted["日期"].values.tolist())
        # 纵轴为收盘价
        .add_yaxis(
        series_name="MA5",
        y_axis=moving_average(stock_data_extracted[["收盘价"]], 5),
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        itemstyle_opts=opts.ItemStyleOpts(color='blue'),

    )
        # 30日均线
        .add_yaxis(
        series_name="MA30",
        y_axis=moving_average(stock_data_extracted[["收盘价"]], 30),
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        itemstyle_opts=opts.ItemStyleOpts(color='pink')
    )
        # 60日均线
        .add_yaxis(
        series_name="MA60",
        y_axis=moving_average(stock_data_extracted[["收盘价"]], 60),
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        itemstyle_opts=opts.ItemStyleOpts(color='green'),
    )
        # 120日均线
        .add_yaxis(
        series_name="MA120",
        y_axis=moving_average(stock_data_extracted[["收盘价"]], 120),
        is_smooth=True,
        is_hover_animation=False,
        linestyle_opts=opts.LineStyleOpts(width=1, opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        itemstyle_opts=opts.ItemStyleOpts(color='black'),
    )

        .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
)

# 将K线图和移动平均线显示在一个图内
kline.overlap(line)

# 成交量的数据
x = stock_data_extracted[["日期"]].values[:, 0].tolist()
y = stock_data_extracted[["成交量"]].values[:, 0].tolist()

data_volume = []

y_open = []
y_close = []
x_open = []
x_close = []

for i in range(len(stock_data_extracted)):
    open_price = stock_data_extracted[["开盘价"]].values[i]
    close_price = stock_data_extracted[["收盘价"]].values[i]
    c = []
    if open_price > close_price:
        y_open.append(stock_data_extracted[["成交量"]].values[i])
        x_open.append(i)
    else:
        y_close.append(stock_data_extracted[["成交量"]].values[i])
        x_close.append(i)

bar = (
    Bar()
        # 格式参数同上半部分
        .add_xaxis(x)
        .add_yaxis("成交量", y, label_opts=opts.LabelOpts(is_show=False),
                   itemstyle_opts=opts.ItemStyleOpts(color="#ec0000"))
        .set_global_opts(title_opts=opts.TitleOpts(title="成交量", pos_top="70%"),
                         legend_opts=opts.LegendOpts(is_show=False), )
)

# 使用网格将多张图标组合到一起显示
grid_chart = Grid()

# 将k线添加进图表中
grid_chart.add(
    kline,
    grid_opts=opts.GridOpts(pos_left="15%", pos_right="8%", height="55%"),
)

# 将成交量图添加进下半部分
grid_chart.add(
    bar,
    grid_opts=opts.GridOpts(pos_left="15%", pos_right="8%", pos_top="70%", height="20%"),
)

# 保存到本地
grid_chart.render("d:/kline_test.html")
# 打开本地数据页面
wb.open("d:/kline_test.html")

结果展示_2

在这里插入图片描述
ps:代码功能类似,展现主题不一样


Part_3

  • 对股票数据进行分析,得到股票的特征值
  • 对数据集进行训练集、测试集划分,并用感知机算法进行股票涨跌预测

步骤

  1. 打标签:
    股票当天的涨跌幅表示了该股票在当天是涨还是跌。如果该股票当天的涨跌幅大于0,则该股票在当天为涨,否则为跌。所以我们根据每天的涨跌幅来进行打标签,如果涨跌幅大于0则打标签1,否则打标签0。
  2. 寻找特征变量
    我们将前一天的收盘价和当天的开盘价作为特征变量。所以我们从第2天的数据开始,将前一天的收盘价和当天的开盘价作为两维的数据集x,将对应的标签值作为标签集y。
  3. 训练集、测试集划分
    我们使用train_test_split()函数将数据集x,和标签集y划分为训练数据集X_train、训练标签值Y_train、测试数据集X_test和测试标签集Y_test。
  4. 运行感知机算法
    使用sklearn里的Perceptron算法库进行预测。预测结果为y_pred,y_pred是预测的标签值,最后将y_pred与真实的y_test进行比对,得出正确率。

代码

from sklearn.linear_model import Perceptron
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np

data = pd.read_csv("000858.csv")
data['label'] = None

# 打标签
for i in range(len(data)):
    if data.loc[i, '涨跌幅'] > 0:
        data.loc[i, 'label'] = 1
    else:
        data.loc[i, 'label'] = 0

# 以前一天的收盘价、今天的开盘价作为特征变量
x = []
y = []
for i in range(1, len(data)):
    x.append(np.array([data.loc[i - 1, '收盘价'], data.loc[i, '开盘价']]))
    y.append(np.array(data.loc[i, 'label']))

# 划分训练集与测试集
X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size=0.2, stratify=None, shuffle=False)

# 调用感知机算法
ppn = Perceptron()
ppn.fit(X_train, Y_train)
# 预测涨跌
y_pred = ppn.predict(X_test)
# 正确预测个数
true_classified_sum = 0
for i in range(len(Y_test)):
    if y_pred[i] == Y_test[i]:
        true_classified_sum += 1

Accuracy = round(true_classified_sum / len(Y_test), 4)
# 输出正确率
print("Accuracy: ", Accuracy * 100, "%")

结果展示

在这里插入图片描述

ps:训练前需要自行打标签得到数据文件


Part_4

构建神经网络模型,对股票数据进行训练,将训练后的模型用于预测后续股票行情。

步骤

1、 读取文件数据,并按照列顺序进行整理
2、 将源数据分割为训练集、测试集
3、 建立训练模型,对模型进行训练
4、 拟合训练集的数据,对测试集数据进行预测
5、 计算几个误差参数,如mse、mae、rmse等
6、 绘制训练集、测试集的图像

代码

	import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split

# 读取股票数据文件
def read(file_name):
    file = pd.read_csv(file_name)
    stock = file[["开盘价", "涨跌幅", "最高价", "最低价", "涨跌百分比", "收盘价"]]
    return stock

def train(x, y):
    # 分割训练集和测试集 8:2
    x_train, x_test, y_train, y_test = train_test_split(np.array(x), np.array(y), shuffle=False,
                                                        test_size=0.3)
    # 建立训练模型
    model = Sequential()
    # 中间层:20
    model.add(Dense(20, input_dim=5, init='uniform', activation='relu'))
    # 输出层: 1
    model.add(Dense(1))
    # 定义损失函、优化器
    model.compile(loss='mean_squared_error', optimizer='Adam')
    # 训练模型10000次
    model.fit(x_train, y_train, nb_epoch=10000, batch_size=50)

    # 预测训练集的数据
    y_train_predict = model.predict(x_train)

    # 预测测试集的数据
    y_test_predict = model.predict(x_test)
    return y_train, y_train_predict, y_test, y_test_predict

# 绘制训练数据图
def draw_train(y_train, y_train_predict):
    # 绘图:拟合训练集的数据
    data = pd.concat([pd.DataFrame(y_train), pd.DataFrame(y_train_predict)], axis=1)
    data.iloc[:, 0].plot(figsize=(18, 9))
    data.iloc[:, 1].plot(figsize=(18, 9))
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.legend(('真实数据', '拟合数据'), loc='upper right', fontsize='20')
    plt.title("训练拟合", fontsize='30')  # 添加标题
    plt.ylabel('收盘价')
    plt.show()

# 绘制测试数据图
def draw_test(y_test, y_test_predict):
    # 绘图:预测测试集的数据
    data = pd.concat([pd.DataFrame(y_test), pd.DataFrame(y_test_predict)], axis=1)
    data.iloc[:, 0].plot(figsize=(18, 9))
    data.iloc[:, 1].plot(figsize=(18, 9))
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.legend(('真实数据', '预测数据'), loc='upper right', fontsize='20')
    plt.title("五粮液预测", fontsize='30')
    plt.ylabel('收盘价')
    plt.show()

def cal(y_test, y_test_predict):
    # 计算差值
    sub = y_test_predict - y_test
    # 根据公式计算三个参数
    y_rmse = np.sqrt(np.sum(sub ** 2) / y_test.shape[0])
    y_mse = np.sum(sub ** 2) / y_test.shape[0]
    y_mae = np.sum(abs(sub)) / y_test.shape[0]

    # 更新del
    sub = y_test_predict - y_test.mean()
    # 计算平方和
    y_get_SSR = np.sum(sub ** 2)

    # 更新del
    sub = y_test - y_test.mean()
    # 计算平方和
    y_get_SST = np.sum(sub ** 2)

    # 计算R_square
    R2 = y_get_SSR / y_get_SST
    print("R2:", R2)
    print("均方根误差rmse:", y_rmse)
    print("绝对误差mae:", y_mae)
    print("均方误差mse:", y_mse)

if __name__ == '__main__':
    # 读取文件
    stock = read("000858.csv")
    # 归一化
    # stock = (stock - stock.min()) / (stock.max() - stock.min())

    # 特征列,(0,n-1)相当于昨天的
    X = stock.iloc[:-1, :-1]
    # 标签列,(1,n)相当于今天的
    Y = stock.iloc[1:, -1]

    # 训练
    y_train, y_train_predict, y_test, y_test_predict = train(X, Y)

    # 计算三个参数
    cal(y_test, y_test_predict)

    # 画训练拟合图
    draw_train(y_train, y_train_predict)
    # 画预测图
    draw_test(y_test, y_test_predict)


结果展示

训练结果:
训练结果
训练集拟合图:
在这里插入图片描述
预测测试集:
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值