{ "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 }