量化学习(四)北向策略学习

下载股票代码

香港交易所: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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值