chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:10:28 +08:00
commit c2acfb5f2d
267 changed files with 15542 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
## 说明
之前测试使用的脚本。执行了一段时间,只是用来进行练习使用的。
@@ -0,0 +1,126 @@
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import libs.common as common
import pandas as pd
import numpy as np
import math
import datetime
import heapq
### 对每日指标数据,进行筛选。将符合条件的。二次筛选出来。
def stat_all_lite(tmp_datetime):
# 要操作的数据库表名称。
table_name = "guess_indicators_lite_buy_daily"
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
datetime_int = (tmp_datetime).strftime("%Y%m%d")
print("datetime_str:", datetime_str)
print("datetime_int:", datetime_int)
# try:
# # 删除老数据。guess_indicators_lite_buy_daily 是一张单表,没有日期字段。
# del_sql = " DELETE FROM `stock_data`.`%s` WHERE `date`= '%s' " % (table_name, datetime_int)
# print("del_sql:", del_sql)
# common.insert(del_sql)
# print("del_sql")
# except Exception as e:
# print("error :", e)
sql_1 = """
SELECT `date`, `code`, `name`, `changepercent`, `trade`,`turnoverratio`, `pb` ,`kdjj`,`rsi_6`,`cci`
FROM stock_data.guess_indicators_lite_daily WHERE `date` = %s
and `changepercent` > 2 and `pb` > 0
"""
# and `changepercent` > 2 and `pb` > 0 and `turnoverratio` > 5 去除掉换手率参数。
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int])
data = data.drop_duplicates(subset="code", keep="last")
print("######## len data ########:", len(data))
# del data["name"]
# print(data)
data["trade_float32"] = data["trade"].astype('float32', copy=True)
# 输入 date 用作历史数据查询。
stock_merge = pd.DataFrame({
"date": data["date"], "code": data["code"], "wave_mean": data["trade"],
"wave_crest": data["trade"], "wave_base": data["trade"]}, index=data.index.values)
print(stock_merge.head(1))
stock_merge = stock_merge.apply(apply_merge, axis=1) # , axis=1)
del stock_merge["date"] # 合并前删除 date 字段。
# 合并数据
data_new = pd.merge(data, stock_merge, on=['code'], how='left')
# 使用 trade_float32 参加计算。
data_new = data_new[data_new["trade_float32"] > data_new["wave_base"]] # 交易价格大于波谷价格。
data_new = data_new[data_new["trade_float32"] < data_new["wave_crest"]] # 小于波峰价格
# wave_base wave_crest wave_mean
data_new["wave_base"] = data_new["wave_base"].round(2) # 数据保留2位小数
data_new["wave_crest"] = data_new["wave_crest"].round(2) # 数据保留2位小数
data_new["wave_mean"] = data_new["wave_mean"].round(2) # 数据保留2位小数
data_new["up_rate"] = (data_new["wave_mean"].sub(data_new["trade_float32"])).div(data_new["wave_crest"]).mul(100)
data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数
data_new["buy"] = 1
data_new["sell"] = 0
data_new["today_trade"] = data_new["trade"]
data_new["income"] = 0
# 重命名 date
data_new.columns.values[0] = "buy_date"
del data_new["trade_float32"]
try:
common.insert_db(data_new, table_name, False, "`code`")
print("insert_db")
except Exception as e:
print("error :", e)
# 重命名
del data_new["name"]
print(data_new)
def apply_merge(tmp):
date = tmp["date"]
code = tmp["code"]
date_end = datetime.datetime.strptime(date, "%Y%m%d")
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
print(code, date_start, date_end)
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
# 使用缓存方法。加快计算速度。
stock = common.get_hist_data_cache(code, date_start, date_end)
# 增加空判断,如果是空返回 0 数据。
if stock is None:
return list([code, date, 0, 0, 0])
stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values)
stock = stock.sort_index(0) # 将数据按照日期排序下。
# print(stock.head(10))
arr = pd.Series(stock["close"].values)
# print(df_arr)
wave_mean = arr.mean()
max_point = 3 # 获得最高的几个采样点。
# 计算股票的波峰值。
wave_crest = heapq.nlargest(max_point, enumerate(arr), key=lambda x: x[1])
wave_crest_mean = pd.DataFrame(wave_crest).mean()
# 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值
wave_base = heapq.nsmallest(max_point, enumerate(arr), key=lambda x: x[1])
wave_base_mean = pd.DataFrame(wave_base).mean()
# 输出数据
print("##############", len(stock))
if len(stock) > 180:
# code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。
return list([code, date, wave_base_mean[1], wave_crest_mean[1], wave_mean])
else:
return list([code, date, 0, 0, 0])
# main函数入口
if __name__ == '__main__':
# 二次筛选数据。
tmp_datetime = common.run_with_args(stat_all_lite)
@@ -0,0 +1,137 @@
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import libs.common as common
import pandas as pd
import numpy as np
import math
import datetime
import heapq
import stockstats
# code date today_trade
def apply_merge(tmp):
date = tmp["date"]
code = tmp["code"]
date_end = datetime.datetime.strptime(date, "%Y%m%d")
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
print(code, date_start, date_end)
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
# 使用缓存方法。加快计算速度。
stock = common.get_hist_data_cache(code, date_start, date_end)
# 增加空判断,如果是空返回 0 数据。
if stock is None:
return list([code, date, 0.0])
print("########")
# print(stock.tail(1))
close = stock.tail(1)["close"].values[0]
print("close: ", close)
print("########")
return list([code, date, close])
# buy code date sell sell_cci sell_kdjj sell_rsi_6
def apply_merge_sell(tmp):
date = tmp["date"]
code = tmp["code"]
date_end = datetime.datetime.strptime(date, "%Y%m%d")
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
print(code, date_start, date_end)
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
# 使用缓存方法。加快计算速度。
stock = common.get_hist_data_cache(code, date_start, date_end)
# 增加空判断,如果是空返回 0 数据。
if stock is None:
return list([1, code, date, 0, 0, 0, 0])
print("########")
# J大于100时为超买,小于10时为超卖。
# 强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。
# 1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段,
# 2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束,
stockStat = stockstats.StockDataFrame.retype(stock)
kdjj = int(stockStat["kdjj"].tail(1).values[0])
rsi_6 = int(stockStat["rsi_6"].tail(1).values[0])
cci = int(stockStat["cci"].tail(1).values[0])
print("kdjj:", kdjj, "rsi_6:", rsi_6, "cci:", cci)
# and kdjj > 80 and rsi_6 > 55 and cci > 100 判断卖出时刻。也就是买入时刻的反面。发现有波动就卖了。
# if kdjj <= 10 and rsi_6 <= 50 and cci <= 100: old
if kdjj <= 80 or rsi_6 <= 55 or cci <= 100:
return list([0, code, date, 1, cci, kdjj, rsi_6])
else:
return list([1, code, date, 0, cci, kdjj, rsi_6])
# 增加 收益计算。
def stat_index_calculate(tmp_datetime):
# 要操作的数据库表名称。
table_name = "guess_indicators_lite_sell_daily"
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
datetime_int = (tmp_datetime).strftime("%Y%m%d")
print("datetime_str:", datetime_str)
print("datetime_int:", datetime_int)
sql_1 = """
SELECT `buy_date`, `code`, `name`, `changepercent`, `trade`, `turnoverratio`, `pb`, `kdjj`, `rsi_6`,
`cci`, `wave_base`, `wave_crest`, `wave_mean`, `up_rate`
FROM guess_indicators_lite_buy_daily where `buy_date` <= """ + datetime_int
print(sql_1)
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[])
data = data.drop_duplicates(subset="code", keep="last")
print(data["trade"])
data["trade_float32"] = data["trade"].astype('float32', copy=False)
print(len(data))
data["date"] = datetime_int
stock_merge = pd.DataFrame({
"date": data["date"], "code": data["code"], "today_trade": data["trade"]}, index=data.index.values)
print(stock_merge.head(1))
stock_merge = stock_merge.apply(apply_merge, axis=1) # , axis=1)
del stock_merge["date"] # 合并前删除 date 字段。
# 合并数据
data_new = pd.merge(data, stock_merge, on=['code'], how='left')
data_new["income"] = (data_new["today_trade"] - data_new["trade_float32"]) * 100
data_new["income"] = data_new["income"].round(4) # 保留4位小数。
# 增加售出列。看看是否需要卖出。
stock_sell_merge = pd.DataFrame({
"date": data["date"], "code": data["code"], "sell": 0, "buy": 0, "sell_kdjj": 0, "sell_rsi_6": 0,
"sell_cci": 0},
index=data.index.values)
print(stock_sell_merge.head(1))
merge_sell_data = stock_sell_merge.apply(apply_merge_sell, axis=1) # , axis=1)
# 重命名
del merge_sell_data["date"] # 合并前删除 date 字段。
# 合并数据
data_new = pd.merge(data_new, merge_sell_data, on=['code'], how='left')
# 删除老数据。
try:
del_sql = " DELETE FROM `stock_data`.`" + table_name + "` WHERE `date`= '%s' " % datetime_int
common.insert(del_sql)
print("insert_db")
except Exception as e:
print("error :", e)
del data_new["trade_float32"]
try:
common.insert_db(data_new, table_name, False, "`date`,`code`")
print("insert_db")
except Exception as e:
print("error :", e)
# 重命名
del data_new["name"]
print(data_new)
# main函数入口
if __name__ == '__main__':
# 计算买卖。
tmp_datetime = common.run_with_args(stat_index_calculate)
+119
View File
@@ -0,0 +1,119 @@
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import libs.common as common
import sys
import time
import pandas as pd
import tushare as ts
from sqlalchemy.types import NVARCHAR
from sqlalchemy import inspect
import datetime
import heapq
"""
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
FROM stock_data.ts_today_all where `date` = 20171106 and trade > 0 and trade <= 20
and `code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
"""
def stat_index_all(tmp_datetime):
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
datetime_int = (tmp_datetime).strftime("%Y%m%d")
print("datetime_str:", datetime_str)
print("datetime_int:", datetime_int)
# 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
# #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
sql_1 = """
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
and `code` not like %s and `code` not like %s and `name` not like %s
"""
print(sql_1)
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%'])
print(type(data))
data = data.drop_duplicates(subset="code", keep="last")
print(data["trade"])
data["trade_float32"] = data["trade"].astype('float32', copy=False)
print(len(data))
print("########data[trade]########:")
print(data["trade"])
# 使用 trade 填充数据
stock_guess = pd.DataFrame({
"date": data["date"], "code": data["code"], "wave_mean": data["trade"],
"wave_crest": data["trade"], "wave_base": data["trade"]}, index=data.index.values)
print(stock_guess.head())
stock_guess = stock_guess.apply(apply_guess, axis=1) # , axis=1)
print(stock_guess.head())
# stock_guess.astype('float32', copy=False)
stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。
stock_guess = stock_guess.round(2) # 数据保留2位小数
print(stock_guess["wave_base"])
data_new = pd.merge(data, stock_guess, on=['code'], how='left')
print("#############")
# 使用pandas 函数 https://pandas.pydata.org/pandas-docs/stable/api.html#id4
data_new["up_rate"] = (data_new["trade_float32"].sub(data_new["wave_mean"])).div(data_new["wave_crest"]).mul(100)
data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数
data_new.drop('trade_float32', axis=1, inplace=True) # 删除计算字段。
# 删除老数据。
del_sql = " DELETE FROM `stock_data`.`guess_period_daily` WHERE `date`= '%s' " % datetime_int
common.insert(del_sql)
# print(data_new.head())
# data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"]
common.insert_db(data_new, "guess_period_daily", False, "`date`,`code`")
# 进行左连接.
# tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left')
def apply_guess(tmp):
date = tmp["date"]
code = tmp["code"]
date_end = datetime.datetime.strptime(date, "%Y%m%d")
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
print(code, date_start, date_end)
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
# 使用缓存方法。加快计算速度。
stock = common.get_hist_data_cache(code, date_start, date_end)
# 增加空判断,如果是空返回 0 数据。
if stock is None:
return pd.Series([date, code, 0.0, 0.0, 0.0],
index=['date', 'code', 'wave_mean', 'wave_crest', 'wave_base'])
stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values)
stock = stock.sort_index(0) # 将数据按照日期排序下。
# print(stock.head(10))
arr = pd.Series(stock["close"].values)
# print(df_arr)
wave_mean = arr.mean()
# 计算股票的波峰值。
wave_crest = heapq.nlargest(5, enumerate(arr), key=lambda x: x[1])
wave_crest_mean = pd.DataFrame(wave_crest).mean()
# 输出元祖第一个元素是index,第二元素是比较的数值 计算数据的波谷值
wave_base = heapq.nsmallest(5, enumerate(arr), key=lambda x: x[1])
wave_base_mean = pd.DataFrame(wave_base).mean()
# 输出数据
# print("##############")
# code date wave_base wave_crest wave_mean 顺序必须一致。返回的是行数据,然后填充。
return pd.Series([date, code, wave_base_mean[1], wave_crest_mean[1], wave_mean],
index=['date','code','wave_mean','wave_crest','wave_base'])
# main函数入口
if __name__ == '__main__':
# 使用方法传递。
tmp_datetime = common.run_with_args(stat_index_all)
+130
View File
@@ -0,0 +1,130 @@
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import libs.common as common
import sys
import time
import pandas as pd
import numpy as np
import math
import tushare as ts
from sqlalchemy.types import NVARCHAR
from sqlalchemy import inspect
import datetime
import heapq
"""
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
FROM stock_data.ts_today_all where `date` = 20171106 and trade > 0 and trade <= 20
and `code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
"""
def stat_index_all(tmp_datetime):
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
datetime_int = (tmp_datetime).strftime("%Y%m%d")
print("datetime_str:", datetime_str)
print("datetime_int:", datetime_int)
# 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
# #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
sql_1 = """
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
and `code` not like %s and `code` not like %s and `name` not like %s
"""
print(sql_1)
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%'])
data = data.drop_duplicates(subset="code", keep="last")
print("########data[trade]########:")
# print(data["trade"])
# 使用 trade 填充数据
stock_guess = pd.DataFrame({
"date": data["date"], "code": data["code"], "5d": data["trade"],
"10d": data["trade"], "20d": data["trade"], "60d": data["trade"], "5-10d": data["trade"],
"5-20d": data["trade"], "return": data["trade"], "mov_vol": data["trade"]
}, index=data.index.values)
stock_guess = stock_guess.apply(apply_guess, axis=1) # , axis=1)
# print(stock_guess.head())
# stock_guess.astype('float32', copy=False)
stock_guess.drop('date', axis=1, inplace=True) # 删除日期字段,然后和原始数据合并。
# print(stock_guess["5d"])
data_new = pd.merge(data, stock_guess, on=['code'], how='left')
print("#############")
# 使用pandas 函数 https://pandas.pydata.org/pandas-docs/stable/api.html#id4
data_new["return"] = data_new["return"].mul(100) # 扩大100 倍方便观察
data_new["mov_vol"] = data_new["mov_vol"].mul(100)
data_new = data_new.round(2) # 数据保留2位小数
# 删除老数据。
del_sql = " DELETE FROM `stock_data`.`guess_return_daily` WHERE `date`= '%s' " % datetime_int
common.insert(del_sql)
# data_new["down_rate"] = (data_new["trade"] - data_new["wave_mean"]) / data_new["wave_base"]
common.insert_db(data_new, "guess_return_daily", False, "`date`,`code`")
# 进行左连接.
# tmp = pd.merge(tmp, tmp2, on=['company_id'], how='left')
def apply_guess(tmp):
date = tmp["date"]
code = tmp["code"]
date_end = datetime.datetime.strptime(date, "%Y%m%d")
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
print(code, date_start, date_end)
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
# 使用缓存方法。加快计算速度。
stock = common.get_hist_data_cache(code, date_start, date_end)
# 增加空判断,如果是空返回 0 数据。
if stock is None:
return pd.Series([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, code, date, 0.0, 0.0],
index=['10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return'])
stock = pd.DataFrame({"close": stock["close"]}, index=stock.index.values)
stock = stock.sort_index(0) # 将数据按照日期排序下。
# print(stock.head(10))
# 5周期、10周期、20周期和60周期
# 周线、半月线、月线和季度线
stock["5d"] = stock["close"].rolling(window=5).mean() # 周线
stock["10d"] = stock["close"].rolling(window=10).mean() # 半月线
stock["20d"] = stock["close"].rolling(window=20).mean() # 月线
stock["60d"] = stock["close"].rolling(window=60).mean() # 季度线
# 计算日期差。
stock["5-10d"] = (stock["5d"] - stock["10d"]) * 100 / stock["10d"] # 周-半月线差
stock["5-20d"] = (stock["5d"] - stock["20d"]) * 100 / stock["20d"] # 周-月线差
# 计算股票的收益价格
stock["return"] = np.log(stock["close"] / stock["close"].shift(1))
# print(stock["return"])
# 计算股票的【收益率的移动历史标准差】
mov_day = int(len(stock) / 20)
# print("mov_day:", mov_day, len(stock))
stock["mov_vol"] = stock["return"].rolling(window=mov_day).std() * math.sqrt(mov_day)
# print(stock["mov_vol"].tail())
# print(stock["return"].tail())
# print("stock[10d].tail(1)", stock["10d"].tail(1).values[0])
# 10d 20d 5-10d 5-20d 5d 60d code date mov_vol return
tmp = pd.Series([stock["10d"].tail(1).values[0], stock["20d"].tail(1).values[0], stock["5-10d"].tail(1).values[0],
stock["5-20d"].tail(1).values[0], stock["5d"].tail(1).values[0], stock["60d"].tail(1).values[0],
code, date, stock["mov_vol"].tail(1).values[0], stock["return"].tail(1).values[0]],
index=['10d', '20d', '5-10d', '5-20d', '5d', '60d', 'code', 'date', 'mov_vol', 'return'])
# print(tmp)
return tmp
# main函数入口
if __name__ == '__main__':
# 使用方法传递。
tmp_datetime = common.run_with_args(stat_index_all)
@@ -0,0 +1,146 @@
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import libs.common as common
import pandas as pd
import numpy as np
import math
import datetime
import sklearn as skl
from sklearn import datasets, linear_model
# https://github.com/udacity/machine-learning/issues/202
# sklearn.cross_validation 这个包不推荐使用了。
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 要操作的数据库表名称。
table_name = "guess_sklearn_ma_daily"
# 批处理数据。
def stat_all_batch(tmp_datetime):
datetime_str = (tmp_datetime).strftime("%Y-%m-%d")
datetime_int = (tmp_datetime).strftime("%Y%m%d")
print("datetime_str:", datetime_str)
print("datetime_int:", datetime_int)
try:
# 删除老数据。
del_sql = " DELETE FROM `stock_data`.`%s` WHERE `date`= %s " % (table_name, datetime_int)
print("del_sql:", del_sql)
common.insert(del_sql)
except Exception as e:
print("error :", e)
sql_count = """
SELECT count(1) FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
and `code` not like %s and `name` not like %s
"""
# 修改逻辑,增加中小板块计算。 中小板:002,创业板:300 。and `code` not like %s and `code` not like %s and `name` not like %s
# count = common.select_count(sql_count, params=[datetime_int, '002%', '300%', '%st%'])
count = common.select_count(sql_count, params=[datetime_int, '300%', '%st%'])
print("count :", count)
batch_size = 100
end = int(math.ceil(float(count) / batch_size) * batch_size)
print(end)
# for i in range(0, end, batch_size):
for i in range(0, end, batch_size):
print("loop :", i)
# 查询今日满足股票数据。剔除数据:创业板股票数据,中小板股票数据,所有st股票
# #`code` not like '002%' and `code` not like '300%' and `name` not like '%st%'
sql_1 = """
SELECT `date`, `code`, `name`, `changepercent`, `trade`, `open`, `high`, `low`,
`settlement`, `volume`, `turnoverratio`, `amount`, `per`, `pb`, `mktcap`, `nmc`
FROM stock_data.ts_today_all WHERE `date` = %s and `trade` > 0 and `open` > 0 and trade <= 20
and `code` not like %s and `name` not like %s limit %s , %s
"""
print(sql_1)
# data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '002%', '300%', '%st%', i, batch_size])
data = pd.read_sql(sql=sql_1, con=common.engine(), params=[datetime_int, '300%', '%st%', i, batch_size])
data = data.drop_duplicates(subset="code", keep="last")
print("########data[trade]########:", len(data))
# 使用 trade 填充数据
stock_sklearn = pd.DataFrame({
"date": data["date"], "code": data["code"], "next_close": data["trade"],
"sklearn_score": data["trade"]}, index=data.index.values)
print(stock_sklearn.head())
stock_sklearn_apply = stock_sklearn.apply(apply_sklearn, axis=1) # , axis=1)
# 重命名
del stock_sklearn_apply["date"] # 合并前删除 date 字段。
# 合并数据
data_new = pd.merge(data, stock_sklearn_apply, on=['code'], how='left')
# for index, row in data.iterrows():
# next_stock, score = stat_index_all(row, i)
# print(next_stock, score)
data_new["next_close"] = data_new["next_close"].round(2) # 数据保留4位小数
data_new["sklearn_score"] = data_new["sklearn_score"].round(2) # 数据保留2位小数
data_new["trade_float32"] = data["trade"].astype('float32', copy=False)
data_new["up_rate"] = (data_new["next_close"] - data_new["trade_float32"]) * 100 / data_new["trade_float32"]
data_new["up_rate"] = data_new["up_rate"].round(2) # 数据保留2位小数
del data_new["trade_float32"]
try:
common.insert_db(data_new, table_name, False, "`date`,`code`")
print("insert_db")
except Exception as e:
print("error :", e)
# 重命名
del data_new["name"]
print(data_new)
# code date next_close sklearn_score
def apply_sklearn(data):
# 要操作的数据库表名称。
print("########stat_index_all########:", len(data))
date = data["date"]
code = data["code"]
print(date, code)
date_end = datetime.datetime.strptime(date, "%Y%m%d")
date_start = (date_end + datetime.timedelta(days=-300)).strftime("%Y-%m-%d")
date_end = date_end.strftime("%Y-%m-%d")
print(code, date_start, date_end)
# open high close low volume price_change p_change ma5 ma10 ma20 v_ma5 v_ma10 v_ma20 turnover
stock_X = common.get_hist_data_cache(code, date_start, date_end)
# 增加空判断,如果是空返回 0 数据。
if stock_X is None:
return list([code, date, 0.0, 0.0])
stock_X = stock_X.sort_index(0) # 将数据按照日期排序下。
stock_y = pd.Series(stock_X["close"].values) # 标签
stock_X_next = stock_X.iloc[len(stock_X) - 1]
print("########################### stock_X_next date:", stock_X_next)
# 使用今天的交易价格,13 个指标预测明天的价格。偏移股票数据,今天的数据,目标是明天的价格。
stock_X = stock_X.drop(stock_X.index[len(stock_X) - 1]) # 删除最后一条数据
stock_y = stock_y.drop(stock_y.index[0]) # 删除第一条数据
# print("########################### stock_X date:", stock_X)
# 删除掉close 也就是收盘价格。
del stock_X["close"]
del stock_X_next["close"]
model = linear_model.LinearRegression()
# model = KNeighborsClassifier()
model.fit(stock_X.values, stock_y)
# print("############## test_akshare & target #############")
# print("############## coef_ & intercept_ #############")
# print(model.coef_) # 系数
# print(model.intercept_) # 截断
next_close = model.predict([stock_X_next.values])
if len(next_close) == 1:
next_close = next_close[0]
sklearn_score = model.score(stock_X.values, stock_y)
print("score:", sklearn_score) # 评分
return list([code, date, next_close, sklearn_score * 100])
# main函数入口
if __name__ == '__main__':
# 使用方法传递。
tmp_datetime = common.run_with_args(stat_all_batch)