python量化交易編程自學(xué):新手學(xué)量化,歡迎一起交流學(xué)習(xí),共同進(jìn)步 這個(gè)股票回溯是513060,今年跌幅很慘的恒生醫(yī)療ETF,跌幅在60%以上,股票數(shù)據(jù)來源于同花順客戶端歷史交易記錄。是按做T的模式設(shè)置的買賣點(diǎn)。每次1000股,靠做T賺取盈利 設(shè)置的股票買賣點(diǎn): 買點(diǎn):漲幅小于-0.5%以上 賣點(diǎn):第二天收盤價(jià)格漲幅大于2%以上 交易日期:2021-3-29至2022-5-23 Python源碼: '''股票買賣策略:買入:股票漲幅小于-0.5%時(shí)買入賣出:查看尾盤價(jià)格,如果有持股部分漲幅超過2%時(shí)則賣出'''import pandas# 股票信息,來自同花順歷史記錄from pandas import DataFramedata = pandas.DataFrame(pandas.read_excel('../1.xlsx'))# print(data)# 用于記錄持倉(cāng)信息stock_data = pandas.DataFrame(columns=['時(shí)間', '漲幅', '購(gòu)買價(jià)格', '購(gòu)買數(shù)量', '購(gòu)買金額'])# 交易信息trade_data = pandas.DataFrame(columns=['購(gòu)買時(shí)間', '購(gòu)買價(jià)格', '購(gòu)買數(shù)量', '購(gòu)買金額', '賣出時(shí)間', '賣出價(jià)格', '賣出數(shù)量', '賣出金額', '做T盈利'])def buy_Stock(date: str = None, amount: float = None, price: float = None, num: int = None) -> DataFrame: '''買入股票''' money = round((price * num + price * num * 0.00025), 2) # 買入ETF金額,萬2.5手續(xù)費(fèi) add_data = pandas.DataFrame({'時(shí)間': date, '漲幅': amount, '購(gòu)買價(jià)格': price, '購(gòu)買數(shù)量': num, '購(gòu)買金額': money}, index=[1]) # 將買入的數(shù)據(jù)添加到末尾 new_data = stock_data.append(add_data, ignore_index=True) return new_datadef sell_Stock(date=None, date1=None, price=None, price1=None, money=None, num=None, num1=None): '''賣出股票 date:買入時(shí)間 date1:賣出時(shí)間 price 購(gòu)買價(jià)格 price1 賣出價(jià)格 money: 購(gòu)買金額 money1 購(gòu)買金額 num買入數(shù)量 num1 賣出數(shù)量 ''' money1 = round((price1 * num1 - price1 * num1 * 0.00025), 2) # 賣出,減去萬2.5的手續(xù)費(fèi) # 做T盈利金額 profit = money1 - money add_data = pandas.DataFrame({'購(gòu)買時(shí)間': date, '購(gòu)買價(jià)格': price, '購(gòu)買數(shù)量': num, '購(gòu)買金額': money, '賣出時(shí)間': date1, '賣出價(jià)格': price1, '賣出數(shù)量': num1, '賣出金額': money1, '做T盈利': profit}, index=[1]) # 將數(shù)據(jù)添加到交易數(shù)據(jù)信息表中 new_data = trade_data.append(add_data, ignore_index=True) # 獲取賣出的數(shù)據(jù) return new_datadef tactics(): ''' 交易策略:股票漲幅小于-0.05時(shí),買入 持股部分漲幅大于0.02時(shí),賣出盈利部分的持股 ''' global stock_data global trade_data # 循環(huán)股票數(shù)據(jù) for row in range(data.index.max()): # 當(dāng)股票漲幅小于-0.05時(shí) if data.loc[row, '漲幅'] < -0.005: # 調(diào)用全局變量是需要用關(guān)鍵字global重新再次聲明一次 # 買入股票,并得到持股數(shù)據(jù) stock_data = buy_Stock(date=data.loc[row, '時(shí)間'], amount=data.loc[row, '漲幅'], price=data.loc[row, '收盤'], num=1000) else: # 循環(huán)查看買入的價(jià)格,如果收盤價(jià)比買入價(jià)格高百分之2以上,則賣出部分持股 # 循環(huán)持股數(shù)據(jù),倒序循環(huán) for i in range(len(stock_data) - 1, -1, -1): # 賣出價(jià)格 = 購(gòu)買價(jià)格+ 購(gòu)買價(jià)格*0.02 round 保留小數(shù)位 sell_pice = stock_data.loc[i, '購(gòu)買價(jià)格'] + stock_data.loc[i, '購(gòu)買價(jià)格'] * 0.02 # 賣出價(jià)格,大于當(dāng)天收盤價(jià)格 if sell_pice < data.loc[row, '收盤']: trade_data = sell_Stock(date=stock_data.loc[i, '時(shí)間'], date1=data.loc[row, '時(shí)間'], price=stock_data.loc[i, '購(gòu)買價(jià)格'], price1=data.loc[row, '收盤'], money=stock_data.loc[i, '購(gòu)買金額'], num=stock_data.loc[i, '購(gòu)買數(shù)量'], num1=stock_data.loc[i, '購(gòu)買數(shù)量']) stock_data = stock_data.drop(index=i) # 刪除數(shù)據(jù)后需要重建索引 stock_data.index = range(len(stock_data))tactics()# 計(jì)算總和,購(gòu)買金額總和money_sum = stock_data['購(gòu)買金額'].sum()#num_sum = stock_data['購(gòu)買數(shù)量'].sum()stock_data = stock_data.append({'購(gòu)買金額': money_sum, '購(gòu)買數(shù)量': num_sum}, ignore_index=True)print(stock_data)trade_data.loc[trade_data.index.max() + 1, '做T盈利'] = trade_data['做T盈利'].sum()print(trade_data)# 將持股信息保存到Excel表格中stock_data.to_excel('持股數(shù)據(jù).xlsx')trade_data.to_excel('交易股票數(shù)據(jù).xlsx') 結(jié)論: 手中持倉(cāng)總額度:40233.04元,持倉(cāng)數(shù)量:50000股 持倉(cāng)市值: 23750元 等于: 2022-5-23收盤價(jià) 0.475乘以持倉(cāng)數(shù)量50000 持倉(cāng)虧損: 16483.04元 = 40233.04元 - 23750元 做T收益:1766.95元 共賣出72次 實(shí)際虧損:14716.09元 =16483.04元-1766.95元 虧損率 -36% 做個(gè)假設(shè),假如不算市值虧損的話,只算投入與做T收益,因?yàn)楣墒杏袧q有跌,跌的遲早會(huì)漲回來的。只是時(shí)間問題,這里只算做T收益的比例。它的收益就是: 1766.95元除以 40233.04元 百分之4.3的收益,一年零一個(gè)多月,這個(gè)收益也不是很高 況且賬面價(jià)值是虧損的,99.99%的散戶可能承受不了這個(gè)數(shù)據(jù) 恒生醫(yī)療ETF單邊下跌,沒有像樣的反彈,能做T次數(shù)太少。 ![]() 持倉(cāng)表的部分交易數(shù)據(jù) ![]() 交易做T的部分交易數(shù)據(jù) |
|