Files
jupyter/股票管理.ipynb
T
2021-10-09 15:12:24 +08:00

500 lines
15 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 股票管理"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"## 股票信息导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import baostock as bs\n",
"import pandas as pd\n",
"\n",
"#### 登陆系统 ####\n",
"lg = bs.login()\n",
"# 显示登陆返回信息\n",
"print('login respond error_code:'+lg.error_code)\n",
"print('login respond error_msg:'+lg.error_msg)\n",
"\n",
"#### 获取证券信息 ####\n",
"rs = bs.query_all_stock(day=\"2020-10-20\")\n",
"print('query_all_stock respond error_code:'+rs.error_code)\n",
"print('query_all_stock respond error_msg:'+rs.error_msg)\n",
"\n",
"#### 打印结果集 ####\n",
"data_list = []\n",
"while (rs.error_code == '0') & rs.next():\n",
" # 获取一条记录,将记录合并在一起\n",
" data_list.append(rs.get_row_data())\n",
"#results = pd.DataFrame(data_list, columns=rs.fields)\n",
"\n",
"#### 结果集输出到csv文件 #### \n",
"#result.to_csv(\"all_stock.csv\", encoding=\"utf-8\", index=False)\n",
"for result in data_list:\n",
" print(result)\n",
"\n",
"#### 登出系统 ####\n",
"bs.logout()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import baostock as bs\n",
"import pandas as pd\n",
"import pymysql\n",
"\n",
"# 登陆系统\n",
"lg = bs.login()\n",
"# 显示登陆返回信息\n",
"print('login respond error_code:'+lg.error_code)\n",
"print('login respond error_msg:'+lg.error_msg)\n",
"\n",
"# 获取证券基本资料\n",
"rs = bs.query_stock_basic(code=\"\")\n",
"# rs = bs.query_stock_basic(code_name=\"浦发银行\") # 支持模糊查询\n",
"print('query_stock_basic respond error_code:'+rs.error_code)\n",
"print('query_stock_basic respond error_msg:'+rs.error_msg)\n",
"\n",
"# 打印结果集\n",
"data_list = []\n",
"while (rs.error_code == '0') & rs.next():\n",
" # 获取一条记录,将记录合并在一起\n",
" data_list.append(rs.get_row_data())\n",
"#result = pd.DataFrame(data_list, columns=rs.fields)\n",
"# 结果集输出到csv文件\n",
"#result.to_csv(\"D:/stock_basic.csv\", encoding=\"gbk\", index=False)\n",
"\n",
"db = pymysql.connect(\"localhost\",\"root\",\"songyi\",\"stock\" )\n",
"cursor = db.cursor()\n",
"\n",
"sql = \"insert into stock_info (code,name,ipoDate,outDate,type,status) values(%s,%s,%s,%s,%s,%s)\"\n",
"try:\n",
" cursor.executemany(sql,tuple(data_list))\n",
" db.commit()\n",
" print(\"ok!\")\n",
"except:\n",
" # 如果发生错误则回滚\n",
" print(\"error!\")\n",
" db.rollback() \n",
"db.close()\n",
"# 登出系统\n",
"bs.logout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 每日持有标的信息导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import csv\n",
"import pymysql\n",
"\n",
"def read_data(filename):\n",
" detail = {}\n",
" with open(filename) as f:\n",
" reader = csv.reader(f)\n",
" #header_row =next(reader)\n",
" for row in reader:\n",
" detail.setdefault(row[0],[])\n",
" detail[row[0]].append(row[1])\n",
" return detail\n",
"m_xx = []\n",
"m_stock = {}\n",
"db = pymysql.connect(\"localhost\",\"root\",\"songyi\",\"stock\" )\n",
"cursor = db.cursor()\n",
"sql = 'select code,name from stock_info where type=\"1\"'\n",
"cursor.execute(sql)\n",
"results = cursor.fetchall()\n",
"for result in results:\n",
" m_stock[result[0]] = result[1]\n",
"#print(m_stock)\n",
"filename = '每日标的信息.csv'\n",
"detail = read_data(filename)\n",
"for k,v in detail.items():\n",
" m_rq = '2020-' + k[0:2] + '-' + k[2:]\n",
" i = 1\n",
" for m_dm in v:\n",
" if m_dm[0:1] == '6':\n",
" m_dm = 'sh.' + m_dm\n",
" else:\n",
" m_dm = 'sz.' + m_dm\n",
" print('\\t'+m_dm + '\\t'+m_stock[m_dm])\n",
" m_xx.append((m_rq,m_dm,i))\n",
" i += 1\n",
"choice = input('以上为本日数据,是否导入?(y/n)')\n",
"if choice.upper() == \"Y\":\n",
" sql = \"insert into daily_item (rq,code,ord) values(%s,%s,%s)\"\n",
" try:\n",
" cursor.executemany(sql,m_xx)\n",
" db.commit()\n",
" print(\"ok!\")\n",
" except:\n",
" # 如果发生错误则回滚\n",
" print(\"error!\")\n",
" db.rollback() \n",
"db.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 每日调仓信息导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import csv\n",
"import pymysql\n",
"\n",
"def read_data(filename):\n",
" detail = {}\n",
" \n",
" with open(filename) as f:\n",
" reader = csv.reader(f)\n",
"# header_row =next(reader)\n",
" for row in reader:\n",
" detail1 = {}\n",
" detail.setdefault(row[3],[])\n",
" detail1 = {'dm':row[0],'zj':row[1],'ly':row[2],'cb':row[4]}\n",
" detail[row[3]].append(detail1)\n",
" return detail\n",
"m_xx = []\n",
"m_add = []\n",
"m_sub = []\n",
"db = pymysql.connect(\"localhost\",\"root\",\"songyi\",\"stock\" )\n",
"cursor = db.cursor()\n",
"filename = '调仓明细.csv'\n",
"detail = read_data(filename)\n",
"#print(detail)\n",
"for rq in sorted(detail.keys()):\n",
" m_rq = '2020-' + rq[0:2] + '-' + rq[2:]\n",
" for xx_move in detail[rq]:\n",
" m_dm = xx_move['dm']\n",
" if m_dm[0:1] == '6':\n",
" m_dm = 'sh.' + m_dm\n",
" else:\n",
" m_dm = 'sz.' + m_dm\n",
" m_xx.append((m_rq,m_dm,int(xx_move['zj']),xx_move['ly']))\n",
" if xx_move['zj'] == '1':\n",
" m_add.append((m_dm,xx_move['ly'],float(xx_move['cb'])))\n",
" else:\n",
" m_sub.append((m_dm))\n",
"#print(m_xx)\n",
"sql = \"insert into change_item (rq,code,pos,reason) values(%s,%s,%s,%s)\"\n",
"try:\n",
" cursor.executemany(sql,m_xx)\n",
" if len(m_add) > 0:\n",
" sql_add = \"insert into stock_item (code,reason,cost) values(%s,%s,%s)\"\n",
" cursor.executemany(sql_add,m_add)\n",
" if len(m_sub) > 0:\n",
" sql_sub = \"update stock_item set status=0 where code=%s\"\n",
" cursor.executemany(sql_sub,m_sub) \n",
" db.commit()\n",
" print(\"导入成功!\")\n",
"except:\n",
" # 如果发生错误则回滚\n",
" print(\"error!\")\n",
" db.rollback() \n",
"\n",
"db.close()"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"## 持仓股票信息导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pymysql\n",
"db = pymysql.connect(\"localhost\",\"root\",\"songyi\",\"stock\" )\n",
"cursor = db.cursor()\n",
"sql = 'SELECT a.unit,a.CODE,b.cost FROM daily_item AS a,daily_cost as b WHERE a.rq=(select max(rq) FROM daily_item) AND a.code=b.code'\n",
"cursor.execute(sql)\n",
"results = cursor.fetchall()\n",
"sql = \"insert into stock_item(item,code,cost) values(%s,%s,%s)\"\n",
"try:\n",
" cursor.executemany(sql,list(results))\n",
" #db.commit()\n",
" print(\"ok!\")\n",
"except:\n",
" # 如果发生错误则回滚\n",
" print(\"error!\")\n",
" db.rollback() \n",
"sql = 'SELECT a.reason,a.code from change_item AS a WHERE a.pos=1'\n",
"cursor.execute(sql)\n",
"results = cursor.fetchall()\n",
"sql = \"update stock_item set reason=%s where code=%s \"\n",
"try:\n",
" cursor.executemany(sql,list(results))\n",
" #db.commit()\n",
" print(\"ok!\")\n",
"except:\n",
" # 如果发生错误则回滚\n",
" print(\"error!\")\n",
" db.rollback() \n",
"db.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 外汇实时数据采集"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import time\n",
"from bs4 import BeautifulSoup\n",
"import pymongo\n",
"import re\n",
"\n",
"#pattern = re.compile('(?<=\\\").*(?=\\\")')\n",
"pattern = re.compile(r'\\\"(.*)\\\"')\n",
"#myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"#mydb = myclient[\"gaokao\"]\n",
"#mycol = mydb[\"news\"]\n",
"url = 'http://hq.sinajs.cn/list=USDCAD'\n",
"strhtml = requests.get(url)\n",
"#strhtml.encoding = 'utf8'\n",
"soup = BeautifulSoup(strhtml.text,'lxml')\n",
"data = strhtml.text\n",
"#data1 = data.split(\"\\r\")\n",
"#data = soup.select('schoolList')\n",
"#for item1 in data:\n",
"# print(item1.get_text())\n",
"if pattern.findall(data):\n",
" for data1 in pattern.findall(data):\n",
" data2 = data1.split(',')\n",
" print(data2)\n",
" print('当前买入价:',data2[1])\n",
" print('当前卖出价:',data2[2])\n",
" print('昨收价:',data2[3])\n",
" print('今开价:',data2[5])\n",
" print('最高价:',data2[6])\n",
" print('最低价:',data2[7])\n",
" print(float(data2[7]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from email.mime.text import MIMEText\n",
"from email.header import Header\n",
"import smtplib\n",
"import requests\n",
"import time\n",
"import re\n",
"\n",
"pattern = re.compile(r'\\\"(.*)\\\"')\n",
"url = 'http://hq.sinajs.cn/list=USDCAD'\n",
"strhtml = requests.get(url)\n",
"data = strhtml.text\n",
"if pattern.findall(data):\n",
" for data1 in pattern.findall(data):\n",
" data2 = data1.split(',')\n",
"#print(data2)\n",
"with open('price.txt','r') as fl:\n",
" for line in fi:\n",
" p_high = line.split(',')[0]\n",
" p_low = line.split(',')[1]\n",
"\n",
"message ='当前美元加元买入价:{},卖出价:{}'.format(data2[1],data2[2])\n",
"msg = MIMEText(message,'plain','utf-8')\n",
"msg['Subject'] = Header(\"外汇价格已经到达预期价位!\",'utf-8')\n",
"msg['From'] = Header('512song@sina.com')\n",
"msg['To'] = Header('491525765@qq.com','utf-8')\n",
"\n",
"from_addr = '512song@sina.com' #发件邮箱\n",
"password = '409fe5d8471da663' #邮箱密码\n",
"to_addr = 'songyi@yeah.net' #收件邮箱\n",
"smtp_server = 'smtp.sina.com' #SMTP服务器,以新浪为例\n",
"try:\n",
" server = smtplib.SMTP(smtp_server,25) #第二个参数为默认端口为25,有些邮件有特殊端口\n",
" print('开始登录')\n",
" server.set_debuglevel(1) \n",
" server.login(from_addr,password) #登录邮箱\n",
" print('登录成功')\n",
" print(\"邮件开始发送\")\n",
" server.sendmail(from_addr,to_addr,msg.as_string()) #将msg转化成string发出\n",
" server.quit()\n",
" print(\"邮件发送成功\")\n",
"except smtplib.SMTPException as e:\n",
" print(\"邮件发送失败\",e)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from email.mime.text import MIMEText\n",
"from email.header import Header\n",
"import smtplib\n",
"import requests\n",
"import time\n",
"import re\n",
"\n",
"pattern = re.compile(r'\\\"(.*)\\\"')\n",
"url = 'http://hq.sinajs.cn/list=USDCAD'\n",
"strhtml = requests.get(url)\n",
"data = strhtml.text\n",
"if pattern.findall(data):\n",
" for data1 in pattern.findall(data):\n",
" data2 = data1.split(',')\n",
"print(data2)\n",
"\n",
"message ='当前美元加元最高价:{},最低价:{}'.formtat()\n",
"msg = MIMEText(message,'plain','utf-8')\n",
"\n",
"msg['Subject'] = Header(\"测试smtp邮件\",'utf-8')\n",
"msg['From'] = Header('512song@sina.com')\n",
"msg['To'] = Header('491525765@qq.com','utf-8')\n",
"\n",
"from_addr = '512song@sina.com' #发件邮箱\n",
"password = '409fe5d8471da663' #邮箱密码\n",
"to_addr = '491525765@qq.com' #收件邮箱\n",
"\n",
"smtp_server = 'smtp.sina.com' #SMTP服务器,以新浪为例\n",
"try:\n",
" server = smtplib.SMTP(smtp_server,25) #第二个参数为默认端口为25,有些邮件有特殊端口\n",
" print('开始登录')\n",
" server.set_debuglevel(1) \n",
" server.login(from_addr,password) #登录邮箱\n",
" print('登录成功')\n",
" print(\"邮件开始发送\")\n",
" server.sendmail(from_addr,to_addr,msg.as_string()) #将msg转化成string发出\n",
" server.quit()\n",
" print(\"邮件发送成功\")\n",
"except smtplib.SMTPException as e:\n",
" print(\"邮件发送失败\",e)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"# pygal图表"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pygal\n",
"bar_chart = pygal.Bar(height=300)\n",
"bar_chart.add('Fibonacci', [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])\n",
"bar_chart.add('Padovan', [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12])\n",
"svg = bar_chart.render()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from IPython.display import SVG\n",
"SVG(svg)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"toc-autonumbering": true,
"toc-showcode": true,
"toc-showmarkdowntxt": true
},
"nbformat": 4,
"nbformat_minor": 4
}