下载股票代码
香港交易所:https://www.hkex.com.hk/Mutual-Market/Stock-Connect/Eligible-Stocks/View-All-Eligible-Securities?sc_lang=zh-HK
录入数据表
代码实现
思路:当北上资金持股市值(5日)>北上资金持股市值变化(10日)时,买入该股,根据当日涨跌幅来估算策略收益率。
#首先导入各种需要的库
import akshare as ak #用akshare获取北上资金数据
import pandas as pd
import numpy as np
import sqlalchemy
### 设置工作路径
def create_mysql_engine():
"""
创建数据库引擎对象
:return: 新创建的数据库引擎对象
"""
# 引擎参数信息
# 引擎参数信息
host = '192.168.9.110'
user = 'root'
passwd = 'A_quant88'
port = '3306'
db = 'quant'
# 创建数据库引擎对象
mysql_engine = sqlalchemy.create_engine(
'mysql+pymysql://{0}:{1}@{2}:{3}'.format(user, passwd, host, port),
poolclass=sqlalchemy.pool.NullPool
)
# 如果不存在数据库db_quant则创建
mysql_engine.execute("CREATE DATABASE IF NOT EXISTS {0} ".format(db))
# 创建连接数据库db_quant的引擎对象
db_engine = sqlalchemy.create_engine(
'mysql+pymysql://{0}:{1}@{2}:{3}/{4}?charset=utf8'.format(user, passwd, host, port, db),
poolclass=sqlalchemy.pool.NullPool
)
# 返回引擎对象
return db_engine
def get_stock_codes():
# 创建数据库引擎对象
engine = create_mysql_engine()
# 数据库中股票代码的表名
table_name = 'shgt'
# 待执行的sql语句
sql_cmd = "SELECT {} FROM {} WHERE 代码 like '0%'".format('代码', table_name)
# 读取sql,返回股票列表
return pd.read_sql(sql=sql_cmd, con=engine)['代码'].tolist()
def create_data(stock_codes):
"""
下载指定日期内,指定股票的日线数据
:param stock_codes: 待下载数据的股票代码
:return: None
"""
# 创建数据库引擎对象
engine = create_mysql_engine()
# 下载股票循环
for index,code in enumerate(stock_codes):
# print('({}/{})正在创建{}+++'.format(index + 1, len(stock_codes), code))
stock_df = ak.stock_hsgt_individual_em(stock=code)
if stock_df.empty:
print('--------------empty------------------' + code)
continue
# 将短期(5日)持股市值变化-长期(10日)持股市值变化赋给data["s-l"]
data = pd.DataFrame(stock_df)
data['s-l'] = data['持股市值变化-5日'] - data['持股市值变化-10日']
# data['chi']= data.loc[1,'持股数量']-data.loc[2,'持股数量']
# 短期超过长期赋值1
data['signal'] = np.where(data['s-l'] > 0, 1, 0)
# 长期超过短期赋值-1
data['signal'] = np.where(data['s-l'] < 0, -1, data['signal'])
# 统计金叉死叉个数
data['signal'].value_counts()
# 策略涨跌幅
data['stategy'] = data['当日涨跌幅'] * data['signal'].shift(1).fillna(0)
# 计算平均收益率
rtn = []
for i in range(0, data.shape[0]):
if data.iloc[i, 10] == 1: # 如果s-l信号(第i行第10列数据)赋值为1,即金叉时买入
rtn.append(data.iloc[i, 2]) # 加上当日涨跌幅,data的第i行第2列
result = np.cumsum(rtn) # 累加涨跌幅得收益率
np.mean(result) # 求得平均收益率
print("%s的策略平均收益率为:" % (code), np.mean(result)) # 打印平均收益率
# 创建数据库引擎对象
engine = create_mysql_engine()
# 数据库中股票代码的表名
table_name = 'bx'
test_dict = {'code': code, 'ave': np.mean(result)}
ret = pd.DataFrame(test_dict,index=[0])
# 写入数据库
ret.to_sql(name=table_name, con=engine, if_exists='append', index=False)
if __name__ == '__main__':
stock_codes = get_stock_codes()
# print(stock_codes)
create_data(stock_codes)
注:如果想画图调试
from matplotlib import pyplot as plt
data[['持股市值变化-5日','持股市值变化-10日']].plot(grid=True,figsize=(18,15))
plt.show()