数据库期末设计 代码 sql server.docx
《数据库期末设计 代码 sql server.docx》由会员分享,可在线阅读,更多相关《数据库期末设计 代码 sql server.docx(26页珍藏版)》请在冰豆网上搜索。
数据库期末设计代码sqlserver
题目一:
以五日均值为例,取每天的收盘值与五日均值相比较。
在第一次出现收盘值大于五日均值时,做买入操作,买入数据为下一日的开盘值。
然后一直持有,直到某天收盘值小于五日均值,做卖出操作,卖出数据为下一日的开盘值。
将卖出数据减去买入数据,即为此次的收益。
从2日均值遍历至365日均值,求出最大胜率及最大盈利点数的均值数据。
use期末设计
go
/*作初始化删除表操作*/
declare@aint
set@a=2
while@a<=365--从2循环到365以便删除产生的365张使用n日均值时的交易情况表
begin
DECLARE@tbVARCHAR(600)
SET@tb='使用'+CONVERT(VARCHAR(60),@a)+'日均值时的交易情况'
ifexists(select*fromINFORMATION_SCHEMA.TABLESwhereTABLE_NAME=@tb)
EXEC('DROPTABLE'+@tb)
set@a=@a+1
end
ifexists(select*fromINFORMATION_SCHEMA.TABLESwhereTABLE_NAME='不同n日均线时的盈利情况比较表')
DROPTABLE不同n日均线时的盈利情况比较表
/*创建结果总表“不同n日均线时的盈利情况比较表”*/
createtable不同n日均线时的盈利情况比较表
(
n日均线intnull,
胜次数intnull,
总次数intnull,
胜概率decimal(10,3)null,
总收益decimal(10,3)null--数据格式为精度为10,小数位数为3的小数
)
/*定义相关变量*/
declare@iint--定义变量i用于循环,指定第几天的数据
declare@jint--定义变量j用于循环,指定第几天的数据
declare@nexint--定义变量@nex,用于指向第i天的下一天
declare@sumdint--定义变量sumd存储book表中数据的总量,即总天数
declare@nint--定义变量n表示求解的是n日均线的情况
declare@follow_nfloat--定义变量follow_n表示某天前第n日当天的收盘
declare@sumfloat--定义变量sum表示某天前n日收盘的总和
declare@oneddecimal(10,3)--定义变量oned表示某天的n日均线值
declare@时间nvarchar(255)--定义变量@时间,用于暂存游标在数据库中获得的当天的时间
declare@收盘decimal(10,3)--定义变量@收盘,用于暂存游标在数据库中获得的当天的收盘值
declare@开盘decimal(10,3)--定义变量@开盘,用于暂存游标在数据库中获得的当天的开盘值
declare@次日开盘decimal(10,3)--定义变量@次日开盘,用于暂存游标在数据库中获得的次日开盘值
declare@statusnvarchar(20)--定义变量@status,用于循环求解过程中保存当前的股票状态
declare@买入数据decimal(10,3)--定义变量@买入数据,用于循环求解过程中保存最新一次买入时的买入数据
declare@卖出数据decimal(10,3)--定义变量@卖出数据,用于循环求解过程中保存最新一次卖出时的卖出数据
declare@本次收益decimal(10,3)--定义变量@本次收益,用于循环求解过程中保存本次卖出时的收益情况
declare@总收益decimal(10,3)--定义变量@总收益,用于循环求解过程累加求解出n日均线时的总收益值
declare@胜次数int--定义变量@胜次数,用于循环求解过程累加求解出n日均线时的胜次数
declare@总次数int--定义变量@总收益,用于循环求解过程累加求解出n日均线时的总收益值
declare@胜概率decimal(10,3)--定义变量@总收益,用于循环求解过程累加求解出n日均线时的总交易次数
/*定义游标*/
declareyoubiao1cursorSCROLLFOR
select时间,开盘,收盘fromStock
declareyoubiao2cursorSCROLLFOR--定义游标youbiao12指向Stock表开盘列,用于求解时获取次日开盘值
select开盘fromStock
/*打开游标*/
openyoubiao1
openyoubiao2
/*开始循环求解步骤*/
set@n=2
while@n<=365--从2日均线开始求解到365日均线
begin--开始第一层循环求解n日均线时的情况,共循环364次
/*创建表:
“使用n日均值时的交易情况”*/
DECLARE@tablenameVARCHAR(60)
SET@tablename='使用'+CONVERT(VARCHAR(60),@n)+'日均值时的交易情况'
print@tablename
DECLARE@TableSqlVARCHAR(512)
SET@TableSql='
CREATETABLE'+@tableName+'(
时间nvarchar(20)NULL,
开盘decimal(10,3)NULL,
收盘decimal(10,3)NULL,
日均线decimal(10,3)NULL,
操作nvarchar(20)NULL,
买入卖出数据decimal(10,3)NULL,
收益decimal(10,3)NULL
)'
EXEC(@TableSql)
/*每一次统计前重置各变量的初始值*/
set@i=1
set@j=1
set@胜次数=0
set@总次数=0
set@总收益=0
set@status='SELL'--策略1,先默认股票为卖出状态
select@sumd=count(*)fromStock--保存数据源数据总量,即总天数
set@follow_n=0
set@sum=0
/*开始遍历数据表,前n-1个数据无n日均线,直接求和*/
while@i<@n
begin
fetchABSOLUTE@ifromyoubiao1into@时间,@开盘,@收盘
set@sum=@sum+@收盘
/*保存数据到“使用n日均值时的交易情况"表中*/
DECLARE@SqlNVARCHAR(max)--定义sql字符串,用于拼接要执行的命令
SET@Sql='insertinto'+@tableName+'(时间,开盘,收盘)values('+''''+@时间+''''+','+CAST(@开盘ASNVARCHAR(10))+','+CAST(@收盘AS
NVARCHAR(10))+')'
print@Sql--输出sql字符串以跟踪操作情况
EXEC(@Sql)--执行sql字符串
set@i=@i+1
end
/*第n天的数据开始到结束,开始边求解日均线边统计买入卖出*/
while@i<=@sumd
begin
fetchABSOLUTE@ifromyoubiao1into@时间,@开盘,@收盘--获取相应天的值
set@sum=@sum-@follow_n+@收盘--求今日前n日收盘和,所以要在上一次总和基础上先减去前第i天当天的收盘@follow_n,在加上今天的收盘值*/
set@oned=CONVERT(decimal(10,3),@sum/@n)--求解出今日均线值,保留相应格式
/*情况1买入*/
if(@收盘>@onedAND@status='SELL')--当收盘大于日均线且股票为卖出状态时,买入操作
begin
set@status='BUY'--置股票状态为买入
set@nex=@i+1--next指向下一日,便于获得下一天开盘值
fetchABSOLUTE@nexfromyoubiao2into@次日开盘
set@买入数据=@次日开盘--买入数据位次日收盘值
/*保存数据到“使用n日均值时的交易情况"表中*/
SET@Sql='insertinto'+@tableName+'(时间,开盘,收盘,日均线,操作,买入卖出数据)values('+''''+@时间+''''+','+CAST(@开盘ASNVARCHAR(10))+',
'+CAST(@收盘ASNVARCHAR(10))+','+CAST(@onedASNVARCHAR(10))+',''BUY'','+CAST(@买入数据ASNVARCHAR(10))+')'
print@Sql
EXEC(@Sql)
end
/*情况2卖出*/
elseif(@收盘<@onedAND@status='BUY')--当收盘小于日均线且股票为买入状态时,卖出操作
begin
set@status='SELL'--置股票状态为卖出
set@nex=@i+1
fetchABSOLUTE@nexfromyoubiao2into@次日开盘
set@卖出数据=@次日开盘--卖出数据位次日收盘值
set@本次收益=@卖出数据-@买入数据--计算本次收益
/*当股票卖出操作时,保存本次操作收益情况到变量*/
if(@本次收益>0)
begin
set@胜次数=@胜次数+1--如果本次收益>0,则胜次数+1
end
set@总次数=@总次数+1--无论输胜总次数都要加1
set@总收益=@总收益+@本次收益--累加总收益
/*保存数据到“使用n日均值时的交易情况"表中*/
SET@Sql='insertinto'+@tableName+'values('+''''+@时间+''''+','+CAST(@开盘ASnvarchar(10))+',
'+CAST(@收盘ASnvarchar(10))+','+CAST(@onedASnvarchar(10))+',''SELL'',
'+CAST(@卖出数据ASNVARCHAR(10))+','+CAST(@本次收益ASNVARCHAR(10))+')'
print@Sql
EXEC(@Sql)
end
/*情况3无交易*/
else
begin
--无交易发生,直接保存数据到“使用n日均值时的交易情况"表中
SET@Sql='insertinto'+@tableName+'(时间,开盘,收盘,日均线)values('+''''+@时间+''''+','+CAST(@开盘ASNVARCHAR(10))+',
'+CAST(@收盘ASNVARCHAR(10))+','+CAST(@onedASNVARCHAR(10))+')'
print@Sql
EXEC(@Sql)
end
fetchABSOLUTE@jfromyoubiao1into@时间,@开盘,@收盘
set@follow_n=@收盘--保存前第n天收盘,便于下次循环时减去,便于统计收盘和
set@i=@i+1--第i天变量递增,统计下一天
set@j=@j+1--变量j指向的是前第n天,便于统计收盘和
--结束第i天的统计交易情况,进入第i+1天的循环
end
/*保存n日均线时的统计情况到总表中*/
set@胜概率=@胜次数*1.0/@总次数
insertinto不同n日均线时的盈利情况比较表values(@n,@胜次数,@总次数,@胜概率,@总收益)
set@n=@n+1--n递增,进入求解n+1日均线的情况
end
--结束外循环2日到365日
/*关闭和释放游标资源*/
CLOSEyoubiao1
DEALLOCATEyoubiao1
CLOSEyoubiao2
DEALLOCATEyoubiao2
/*查询结果:
*/
use期末设计
go
--查询最大胜率的n日均线
selectn日均线AS最大胜率日均线,胜概率from不同n日均线时的盈利情况比较表
where胜概率=(selectmax(胜概率)from不同n日均线时的盈利情况比较表)
--查询最大盈利总点(总收益)的n日均线
selectn日均线AS最大盈利总点日均线,总收益from不同n日均线时的盈利情况比较表
where总收益=(selectmax(总收益)from不同n日均线时的盈利情况比较表)
--按胜率从大到小排列
select*from不同n日均线时的盈利情况比较表
orderby胜概率deSc
--按盈利总点(总收益)从大到小排列
select*from不同n日均线时的盈利情况比较表
orderby总收益deSc
题目二:
假设每次买入卖出的操作,都需要万分之三的费用,求最大胜率及最大盈利点数的均值数据
use期末设计
go
/*作初始化删除表操作*/
declare@aint
set@a=2
while@a<=365--从2循环到365以便删除产生的365张使用n日均值时的交易情况表
begin
DECLARE@tbVARCHAR(600)
SET@tb='使用'+CONVERT(VARCHAR(60),@a)+'日均值时的交易情况'
ifexists(select*fromINFORMATION_SCHEMA.TABLESwhereTABLE_NAME=@tb)
EXEC('DROPTABLE'+@tb)
set@a=@a+1
end
ifexists(select*fromINFORMATION_SCHEMA.TABLESwhereTABLE_NAME='不同n日均线时的盈利情况比较表')
DROPTABLE不同n日均线时的盈利情况比较表
/*创建结果总表“不同n日均线时的盈利情况比较表”*/
createtable不同n日均线时的盈利情况比较表
(
n日均线intnull,
胜次数intnull,
总次数intnull,
胜概率decimal(10,3)null,
总收益decimal(10,3)null--数据格式为精度为10,小数位数为3的小数
)
/*定义相关变量*/
declare@iint--定义变量i用于循环,指定第几天的数据
declare@jint--定义变量j用于循环,指定第几天的数据
declare@nexint--定义变量@nex,用于指向第i天的下一天
declare@sumdint--定义变量sumd存储book表中数据的总量,即总天数
declare@nint--定义变量n表示求解的是n日均线的情况
declare@follow_nfloat--定义变量follow_n表示某天前第n日当天的收盘
declare@sumfloat--定义变量sum表示某天前n日收盘的总和
declare@oneddecimal(10,3)--定义变量oned表示某天的n日均线值
declare@时间nvarchar(255)--定义变量@时间,用于暂存游标在数据库中获得的当天的时间
declare@收盘decimal(10,3)--定义变量@收盘,用于暂存游标在数据库中获得的当天的收盘值
declare@开盘decimal(10,3)--定义变量@开盘,用于暂存游标在数据库中获得的当天的开盘值
declare@次日开盘decimal(10,3)--定义变量@次日开盘,用于暂存游标在数据库中获得的次日开盘值
declare@statusnvarchar(20)--定义变量@status,用于循环求解过程中保存当前的股票状态
declare@买入数据decimal(10,3)--定义变量@买入数据,用于循环求解过程中保存最新一次买入时的买入数据
declare@卖出数据decimal(10,3)--定义变量@卖出数据,用于循环求解过程中保存最新一次卖出时的卖出数据
declare@买入手续费decimal(10,3)--定义变量@买入手续费,用于循环求解过程中保存最新一次买入时的买入手续费
declare@卖出手续费decimal(10,3)--定义变量@卖出手续费,用于循环求解过程中保存最新一次卖出时的卖出手续费
declare@本次收益decimal(10,3)--定义变量@本次收益,用于循环求解过程中保存本次卖出时的收益情况
declare@总收益decimal(10,3)--定义变量@总收益,用于循环求解过程累加求解出n日均线时的总收益值
declare@胜次数int--定义变量@胜次数,用于循环求解过程累加求解出n日均线时的胜次数
declare@总次数int--定义变量@总收益,用于循环求解过程累加求解出n日均线时的总收益值
declare@胜概率decimal(10,3)--定义变量@总收益,用于循环求解过程累加求解出n日均线时的总交易次数
/*定义游标*/
declareyoubiao1cursorSCROLLFOR
select时间,开盘,收盘fromStock
declareyoubiao2cursorSCROLLFOR--定义游标youbiao12指向Stock表开盘列,用于求解时获取次日开盘值
select开盘fromStock
/*打开游标*/
openyoubiao1
openyoubiao2
/*开始循环求解步骤*/
set@n=2
while@n<=365--从2日均线开始求解到365日均线
begin--开始第一层循环求解n日均线时的情况,共循环364次
/*创建表:
“使用n日均值时的交易情况”*/
DECLARE@tablenameVARCHAR(60)
SET@tablename='使用'+CONVERT(VARCHAR(60),@n)+'日均值时的交易情况'
print@tablename
DECLARE@TableSqlVARCHAR(512)
SET@TableSql='
CREATETABLE'+@tableName+'(
时间nvarchar(20)NULL,
开盘decimal(10,3)NULL,
收盘decimal(10,3)NULL,
日均线decimal(10,3)NULL,
操作nvarchar(20)NULL,
买入卖出数据decimal(10,3)NULL,
[手续费5%]decimal(10,3)NULL,
收益decimal(10,3)NULL
)'
EXEC(@TableSql)
/*每一次统计前重置各变量的初始值*/
set@i=1
set@j=1
set@胜次数=0
set@总次数=0
set@总收益=0
set@status='SELL'--策略1,先默认股票为卖出状态
select@sumd=count(*)fromStock--保存数据源数据总量,即总天数
set@follow_n=0
set@sum=0
/*开始遍历数据表,前n-1个数据无n日均线,直接求和*/
while@i<@n
begin
fetchABSOLUTE@ifromyoubiao1into@时间,@开盘,@收盘
set@sum=@sum+@收盘
/*保存数据到“使用n日均值时的交易情况"表中*/
DECLARE@SqlNVARCHAR(max)--定义sql字符串,用于拼接要执行的命令
SET@Sql='insertinto'+@tableName+'(时间,开盘,收盘)values('+''''+@时间+''''+','+CAST(@开盘ASNVARCHAR(10))+','+CAST(@收盘ASNVARCHAR(10))+')'
print@Sql--输出sql字符串以跟踪操作情况
EXEC(@Sql)--执行sql字符串
set@i=@i+1
end
/*第n天的数据开始到结束,开始边求解日均线边统计买入卖出*/
while@i<=@sumd
begin
fetchABSOLUTE@ifromyoubiao1into@时间,@开盘,@收盘--获取相应天的值
set@sum=@sum-@follow_n+@收盘--求今日前n日收盘和,所以要在上一次总和基础上先减去前第i天当天的收盘@follow_n,在加上今天的收盘值*/
set@oned=CONVERT(decimal(10,3),@sum/@n)--求解出今日均线值,保留相应格式
/*情况1买入*/
if(@收盘>@onedAND@status='SELL')--当收盘大于日均线且股票为卖出状态时,买入操作
begin
set@status='BUY'--置股票状态为买入
set@nex=@i+1--next指向下一日,便于获得下一天开盘值
fetchABSOLUTE@nexfromyoubiao2into@次日开盘
set@买入数据=@次日开盘--买入数据位次日收盘值
set@买入手续费=@买入数据*0.00003--万分之五手续费
/*保存数据到“使用n日均值时的交易情况"表中*/
SET@Sql='insertinto'+@tableName+'(时间,开盘,收盘,日均线,操作,买入卖出数据,[手续费5%%])values('+''''+@时间+''''+','+CAST(@开盘ASNVARCHAR(10))+',
'+CAST(@收盘ASNVARCHAR(10))+','+CAST(@onedASNVARCH