25、金融领域的机器学习应用:支付反欺诈与股票价格预测

金融领域的机器学习应用:支付反欺诈与股票价格预测

1. 支付数据集机器学习模型的最终参数

在支付数据集的机器学习模型中,最终参数如下:

# Print the final parameters
print "Parameters for the optimal model: {}".format(clf.get_params())
Parameters for the optimal model: {'warm_start': False, 'oob_score': False, 
'n_jobs': 1, 'min_impurity_decrease': 0.0, 'verbose': 0, 'max_leaf_nodes': 
None, 'bootstrap': True, 'min_samples_leaf': 1, 'n_estimators': 10,  
'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'criterion': 
'gini', 'random_state': None, 'min_impurity_split': None, 'max_features': 
'auto', 'max_depth': 2, 'class_weight': None}

这标志着支付数据集机器学习实现的结束。此实现与其他领域的方法类似,但使用了支付交易数据集,需要调整对洗钱交易的定义方式。不过,这只是一种简单的欺诈检测方法,现实世界中的模型和数据会复杂得多,例如需要考虑国籍、IP地址或位置等因素。

2. 股票市场运动预测案例研究

2.1 案例背景

RISEGOINVEST 是一家领先的投资咨询公司和基金管理公司,自 1997 年成立以来,其基金规模大幅增长。公司创始人 Jimiki Takasata 具有前瞻性眼光,看到了新兴市场的潜力,并引导投资者关注亚洲、中东和非洲等地区。然而,公司在发展过程中也错过了一些投资机会,如非洲的投资机遇,并且在香港和马来西亚的证券市场投资失败。

随着竞争加剧,投资者对新兴市场基金经理和顾问的要求越来越高。重要客户 Mr. Parakeet 要求公司提供更准确的印度股票市场报告,能够预测股票价格走势,否则将转移资金。公司投资顾问 Jim Catzat 向 Takasata 汇报后,Takasata 要求 Jim 与公司计算机科学家 Kazy Korone 沟通,看是否能建立预测股票价格的计算机模型。Kazy 表示使用机器学习可以构建这样的模型,但需要过去 10 年的印度股票市场数据,并请求一周时间构建原型。

2.2 案例问题

  1. 是否可以为任何给定股票构建机器学习预测模型并预测其次日价格?
  2. 构建这样的预测模型需要哪些数据?定义常见的数据特征,如股票名称、收盘价、开盘价等。
  3. 对于像印度这样的新兴市场,哪些来源能提供最准确的股票市场数据?这些数据是免费的还是需要付费?
  4. 从数据源收集数据后,将采取什么方法来定义机器学习预测模型?
  5. 列出使用问题 4 中定义的方法在模型中会使用的一两种算法。
  6. 实际的基于 Python 的机器学习解决方案是什么?

2.3 问题解答

2.3.1 问题 1

可以开发一个链式模型来预测股票下一个交易日的价格。因为价格是数值数据,在股票交易时每秒每分钟都会产生,有多种算法可用于预测股票市场价格,大多数是回归算法。

2.3.2 问题 2

构建预测模型需要以下特征以及目标预测值(价格):
| 特征 | 描述 |
| ---- | ---- |
| Date | 股票交易日期 |
| Open | 该日期的股票开盘价 |
| High | 该日期的股票最高价 |
| Low | 该日期的股票最低价 |
| Last | 该日期的股票最后成交价 |
| Close | 该日期的股票收盘价 |

2.3.3 问题 3

目前有以下免费数据源可获取印度国家证券交易所和孟买证券交易所的数据:
- Yahoo 使用 Pandas datareader 库 :以下是一个示例代码,用于下载任何股票的历史价格数据。

# -*- coding: utf-8 -*-
"""
Created on Sun Dec  3 23:32:32 2017
@author: PUNEETMATHUR
"""
import numpy as np
import pandas as pd
#import pandas.io.data as web
from pandas_datareader import data, wb
sp500= data.DataReader('^GSPC', data_source='yahoo', start='1/1/2000', 
end='1/12/2017')
#sp500= data.DataReader('^GSPC', data_source='yahoo')
sp500.ix['2010-01-04']
sp500.info()
print(sp500)
print(sp500.columns)
print(sp500.shape)
import matplotlib.pyplot as plt
plt.plot(sp500['Close'])
# now calculating the 42nd Days and 252 days trend for the index
sp500['42d']= np.round(pd.rolling_mean(sp500['Close'], window=42),2)
sp500['252d']= np.round(pd.rolling_mean(sp500['Close'], window=252),2)
#Look at the data
sp500[['Close','42d','252d']].tail()
plt.plot(sp500[['Close','42d','252d']])

但该数据不太准确,包含节假日和周六的值,而此时股票市场是关闭的。
- Quandl.com :这是一个免费且准确的数据源。需要在其网站注册并获取免费的 API 密钥。以下是使用 Quandl 加载数据的示例代码:

pip install Quandl
# -*- coding: utf-8 -*-
"""
Created on Sat Sep 22 23:43:13 2018
@author: PUNEETMATHUR
"""
import quandl
quandl.ApiConfig.api_key = 'INSERT YOU API KEY HERE'
# get the table for daily stock prices and,
# filter the table for selected tickers, columns within a time range
# set paginate to True because Quandl limits tables API to 10,000 rows per 
call
data = quandl.get_table('WIKI/PRICES', ticker = ['AAPL', 'MSFT', 'WMT'],
                        qopts = { 'columns': ['ticker', 'date', 'adj_close'] },
                        date = { 'gte': '2015-12-31', 'lte': '2016-12-31' },
                        paginate=True)
data.head()
# create a new dataframe with 'date' column as index
new = data.set_index('date')
# use pandas pivot function to sort adj_close by tickers
clean_data = new.pivot(columns='ticker')
# check the head of the output
clean_data.head()
#Below script gets you Data from National Stock Exchange for a stock known 
as Oil India Limited
import quandl
quandl.ApiConfig.api_key = 'z1bxBq27SVanESKoLJwa'
quandl.ApiConfig.api_version = '2015-04-09'
import quandl
data = quandl.get('NSE/OIL')
data.head()
data.columns
data.shape
#Storing data in a flat file
data.to_csv("NSE_OIL.csv")
#A basic plot of the stocks data across the years
data['Close'].plot()

这个数据源提供了 2009 年到 2018 年的股票数据,是解决此案例研究的推荐数据源。

2.3.4 问题 4

解决此问题的方法如下:
1. 使用上述方法从 Quandl 获取公司数据,使用 Python 脚本将数据存储在扁平的 CSV 文件中。
2. 清理包含空值的数据。
3. 按日期列对数据进行排序。
4. 进行探索性数据分析,按年和月查看可视化结果。
5. 计算股票的简单移动平均线,作为衡量股票表现的良好指标。
6. 主要使用三列数据: ['Date', 'Open', 'Close'] ,并创建一个新的特征 ['NextDayOpen'] ,该特征是前一天的开盘价。示例如下:

         Date    Open   Close
5909 1991-02-08   60.00   60.00
5908 1991-03-15   65.00   75.00
5907 1991-03-18   65.00   70.00

         Date    Open   Close  NextDayOpen
5909 1991-02-08   60.00   60.00            0
5908 1991-03-15   65.00   75.00          60
5907 1991-03-18   65.00   70.00          65
5906 1991-03-20   67.50   72.50          65
  1. 基于线性回归创建模型来预测下一个交易日的股票价格。在投入生产时,可以尝试其他回归算法,如决策树等。
2.3.5 问题 5

使用线性回归构建原型模型。因为在案例研究中时间有限,线性回归技术提供了最快的实现和结果获取方式,尽管预测模型的准确性可能不太理想,但在时间紧迫的情况下需要做出权衡。

2.3.6 问题 6

以下是基于 Python 的机器学习解决方案:

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 17 20:30:01 2017
@author: PUNEETMATHUR
I am creating this script to predict next day Opening Price based on
Today's Closing Price for any given stock
"""
import numpy as np
import pandas as pd
import os
#Change your directory to wherever your dataset is stored
os.chdir("E:\\") # Change this to your directory or path where you have 
downloaded the dataset.
#Loading the dataset of the company for which prediction is required
df=pd.read_csv("BalmerLawrieColtd.csv",parse_dates=['Date'])
print(df.head(1))
print(df.columns)
df.shape
#Selecting only relevant columns required for prediction
cols=['Date','Open','Close']
df=df[cols]
print(df.columns)
print(df.head(5))
# Checking data if Cleaning up data is required
df.isnull().any()
#df=df.dropna()
#df=df.replace("NA",0)
df.dtypes
#Sorting up data to plot historically ascending values in graph
df = df.sort_values(by='Date',ascending=True)
#Plotting the price of stock over the years
#What story does it tell?
import matplotlib.pyplot as plt
plt.plot(df['Date'],df['Close'])
#Now plot only for last one year and last 1 month
df['Date'].dt.year==2017
mask=(df['Date'] > '2017-1-1') & (df['Date'] <= '2017-12-31')
print(df.loc[mask])
df2017=df.loc[mask]
print(df2017.head(5))
plt.plot(df2017['Date'],df2017['Close'])
#Plotting last 1 month data on stock
mask=(df['Date'] > '2017-11-17') & (df['Date'] <= '2017-12-26')
print(df.loc[mask])
dfnovdec2017=df.loc[mask]
print(dfnovdec2017.head(5))
plt.plot(dfnovdec2017['Date'],dfnovdec2017['Close'])
#Now calculating the Simple Moving Average of the Stock
#Simple Moving Average One Year
df2017['SMA'] = df2017['Close'].rolling(window=20).mean()
df2017.head(25)
df2017[['SMA','Close']].plot()
#Does the Open and Closing price of the stock follow very well?
df2017[['Open','Close']].plot()
df2017.corr()
#Simple Moving Average One Month
dfnovdec2017['SMA'] = dfnovdec2017['Close'].rolling(window=2).mean()
dfnovdec2017.head(25)
dfnovdec2017[['SMA','Close']].plot()
#Now creating NextDayOpen column for prediction
ln=len(df)
lnop=len(df['Open'])
print(lnop)
ii=0
df['NextDayOpen']=df['Open']
df['NextDayOpen']=0
for i in range(0,ln-1):
    print("Open Price: ",df['Open'][i])
    if i!=0:
        ii=i-1
    df['NextDayOpen'][ii]=df['Open'][i]
    print(df['NextDayOpen'][ii])
print(df['NextDayOpen'].head())
#Now checking if there is any correlation
dfnew=df[['Close','NextDayOpen']]
print(dfnew.head(5))
dfnew.corr()
#Now Creating the Prediction model as correlation is very high
#Importing the libraries
from sklearn import cross_validation
from sklearn.utils import shuffle
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
#Creating the features and target dataframes
price=dfnew['Close']
print(price)
print(dfnew.columns)
features=dfnew[['NextDayOpen']]
#Shuffling the data
price=shuffle(price, random_state=0)
features=shuffle(features,random_state=0)
#Dividing data into Train and Test
X_train, X_test, y_train, y_test= cross_validation.train_test_
split(features,price,test_size=0.2, random_state=0)
#Linear Regression on Sensex data
reg= linear_model.LinearRegression()
X_train.shape
reg.fit(X_train, y_train)
y_pred= reg.predict(X_test)
print("Coefficients: ", reg.coef_)
#Mean squared error
print("mean squared error:  ",mean_squared_error(y_test,y_pred))
#Variance score
print("Variance score: ",   r2_score(y_test, y_pred))
#STANDARD DEVIATION
standarddev=price.std()
#Predict based on Opening BSE Sensex Index and Opening Volume
#In the predict function below enter the first parameter Open for BSE and 
2nd Volume in Crores
sensexClosePredict=reg.predict([[269.05]])
#175 is the standard deviation of the Diff between Open and Close of sensex 
so this range
print("Stock Likely to Open at: ",sensexClosePredict , "(+-11)")
print("Stock Open between: ",sensexClosePredict+standarddev , " & " , 
sensexClosePredict-standarddev)

2.4 数据处理与分析流程

graph LR
    A[从 Quandl 获取数据] --> B[存储为 CSV 文件]
    B --> C[清理空值数据]
    C --> D[按日期排序]
    D --> E[探索性数据分析]
    E --> F[计算简单移动平均线]
    F --> G[创建 NextDayOpen 特征]
    G --> H[线性回归建模]
    H --> I[模型评估与预测]

通过以上步骤,可以构建一个基于线性回归的股票价格预测模型,并对模型进行评估和预测。在实际应用中,可以根据需要调整模型和参数,以提高预测的准确性。

3. 代码详细解释与结果分析

3.1 数据加载与预处理

  • 加载数据 :使用 pandas 库的 read_csv 函数加载存储在 CSV 文件中的股票数据,并将日期列解析为日期类型。
import numpy as np
import pandas as pd
import os
os.chdir("E:\\") 
df=pd.read_csv("BalmerLawrieColtd.csv",parse_dates=['Date'])
  • 选择相关列 :只选择 ['Date', 'Open', 'Close'] 三列用于后续分析。
cols=['Date','Open','Close']
df=df[cols]
  • 数据清理检查 :检查数据中是否存在空值,由于使用了优质数据源,这里数据无需清理。
df.isnull().any()

3.2 数据可视化

  • 历史价格走势 :按日期升序排序数据,并绘制股票价格随时间的变化曲线。
df = df.sort_values(by='Date',ascending=True)
import matplotlib.pyplot as plt
plt.plot(df['Date'],df['Close'])
  • 特定时间段价格走势 :分别绘制过去一年和过去一个月的股票价格走势。
mask=(df['Date'] > '2017-1-1') & (df['Date'] <= '2017-12-31')
df2017=df.loc[mask]
plt.plot(df2017['Date'],df2017['Close'])

mask=(df['Date'] > '2017-11-17') & (df['Date'] <= '2017-12-26')
dfnovdec2017=df.loc[mask]
plt.plot(dfnovdec2017['Date'],dfnovdec2017['Close'])

3.3 简单移动平均线计算

  • 一年简单移动平均线 :计算 20 天的简单移动平均线并绘制曲线。
df2017['SMA'] = df2017['Close'].rolling(window=20).mean()
df2017[['SMA','Close']].plot()
  • 一个月简单移动平均线 :计算 2 天的简单移动平均线并绘制曲线。
dfnovdec2017['SMA'] = dfnovdec2017['Close'].rolling(window=2).mean()
dfnovdec2017[['SMA','Close']].plot()

3.4 相关性分析

  • 开盘价与收盘价相关性 :绘制开盘价和收盘价的曲线,并计算它们之间的相关性。
df2017[['Open','Close']].plot()
df2017.corr()

结果显示,开盘价和收盘价之间的相关性为 0.96,表明两者之间存在很强的线性关系,这为后续的线性回归建模提供了依据。

3.5 创建预测列

  • 使用 for 循环创建 NextDayOpen 列,该列存储前一天的开盘价。
ln=len(df)
lnop=len(df['Open'])
df['NextDayOpen']=df['Open']
df['NextDayOpen']=0
for i in range(0,ln-1):
    if i!=0:
        ii=i-1
    df['NextDayOpen'][ii]=df['Open'][i]

3.6 线性回归建模与预测

  • 数据准备 :选择 ['Close', 'NextDayOpen'] 两列数据,将其分为特征和目标变量,并进行数据洗牌和划分训练集与测试集。
dfnew=df[['Close','NextDayOpen']]
price=dfnew['Close']
features=dfnew[['NextDayOpen']]
price=shuffle(price, random_state=0)
features=shuffle(features,random_state=0)
X_train, X_test, y_train, y_test= cross_validation.train_test_split(features,price,test_size=0.2, random_state=0)
  • 模型训练与预测 :使用线性回归模型进行训练,并对测试集进行预测。
reg= linear_model.LinearRegression()
reg.fit(X_train, y_train)
y_pred= reg.predict(X_test)
  • 模型评估 :计算模型的系数、均方误差和方差得分。
print("Coefficients: ", reg.coef_)
print("mean squared error:  ",mean_squared_error(y_test,y_pred))
print("Variance score: ",   r2_score(y_test, y_pred))
  • 预测结果 :根据输入的开盘价预测股票收盘价,并给出预测范围。
sensexClosePredict=reg.predict([[269.05]])
print("Stock Likely to Open at: ",sensexClosePredict , "(+-11)")
print("Stock Open between: ",sensexClosePredict+standarddev , " & " , sensexClosePredict-standarddev)

3.7 各步骤结果总结

步骤 操作 结果
数据加载与预处理 加载数据、选择相关列、检查空值 得到干净的 ['Date', 'Open', 'Close'] 数据
数据可视化 绘制历史价格、特定时间段价格、简单移动平均线曲线 直观展示股票价格走势和波动情况
相关性分析 计算开盘价与收盘价相关性 相关性为 0.96,表明两者线性关系强
创建预测列 创建 NextDayOpen 为线性回归提供目标变量
线性回归建模与预测 训练模型、评估模型、进行预测 得到模型系数、均方误差、方差得分和预测结果

4. 总结与展望

4.1 总结

通过以上步骤,我们完成了从数据获取、预处理、分析到建模预测的整个流程。利用线性回归模型对股票价格进行预测,在一定程度上能够捕捉到股票价格的变化趋势。通过相关性分析,我们发现开盘价和收盘价之间存在很强的线性关系,这为模型的建立提供了有力支持。同时,简单移动平均线的计算也帮助我们更好地理解股票价格的波动情况。

4.2 展望

  • 模型优化 :虽然线性回归模型在本案例中能够提供一定的预测能力,但在实际应用中,可以尝试使用更复杂的模型,如决策树、随机森林、神经网络等,以提高预测的准确性。
  • 数据丰富 :可以考虑引入更多的特征,如成交量、市盈率、行业指标等,以提供更全面的信息,帮助模型更好地学习和预测。
  • 实时监测与调整 :股票市场是动态变化的,需要实时监测市场数据,并根据市场变化及时调整模型和参数,以保证模型的有效性。

4.3 未来工作流程

graph LR
    A[模型优化] --> B[引入更多特征]
    B --> C[实时监测市场]
    C --> D[调整模型参数]
    D --> E[持续评估与改进]

通过不断地优化模型、丰富数据和实时调整,我们有望提高股票价格预测的准确性,为投资者提供更有价值的决策支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值