根据钉钉群提供的“stock_name.csv”文件,利用Python软件随机选取20只股票,并且剔除ST股票,通过图书馆的CSMAR数据库或者其他数据库来源,调取2020年1月1日至2023年5月10日股票日收盘价数据,确保这20只股票都有完整的数据,否则重新随机选择20只股票
时间: 2023-07-16 18:12:09 浏览: 140
好的,我可以帮你实现这个任务。首先,我们需要读取"stock_name.csv"文件,并从中随机选择20只股票,代码如下:
```python
import pandas as pd
import random
# 读取股票名称文件
df = pd.read_csv('stock_name.csv', dtype=str)
# 随机选择20只股票
stocks = random.sample(list(df['name']), 20)
```
接下来,我们需要从数据库中获取这20只股票的日收盘价数据。这里以CSMAR数据库为例,代码如下:
```python
import pymysql
import datetime
# 连接数据库
conn = pymysql.connect(
host='localhost',
user='username',
password='password',
database='database_name'
)
# 获取股票代码
codes = []
for stock in stocks:
cursor = conn.cursor()
cursor.execute(f"SELECT S_INFO_WINDCODE FROM ASHAREDESCRIPTION WHERE S_INFO_NAME = '{stock}'")
code = cursor.fetchone()[0]
codes.append(code)
# 获取股票日收盘价数据
start_date = datetime.date(2020, 1, 1)
end_date = datetime.date(2023, 5, 10)
data = pd.DataFrame()
for code in codes:
cursor = conn.cursor()
cursor.execute(f"SELECT TRADE_DT, S_DQ_CLOSE FROM ASHAREEODPRICES WHERE S_INFO_WINDCODE = '{code}' AND TRADE_DT >= {start_date} AND TRADE_DT <= {end_date} AND S_INFO_NAME NOT LIKE '%%ST%%'")
df = pd.DataFrame(list(cursor.fetchall()), columns=['date', code])
if len(df) < (end_date - start_date).days + 1:
# 如果数据不完整,则重新选择20只股票
print(f'{code}数据不完整')
break
data = pd.concat([data, df[code]], axis=1)
conn.close()
```
这里我们做了如下操作:
1. 连接数据库,这里需要替换host、user、password和database_name为你的数据库主机、用户名、密码和数据库名。
2. 获取每只股票的Wind代码。
3. 查询每只股票在指定时间范围内的日收盘价数据,并且剔除ST股票。
4. 将每只股票的收盘价数据合并到data DataFrame中。
5. 如果某只股票的数据不完整,则输出提示信息并且退出循环。
最后,如果所有股票的数据都完整,则可以对data DataFrame进行进一步处理,例如计算收益率、绘制K线图等。
阅读全文