Guest User

Untitled

a guest
May 27th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. ### Momentum, Monthly long-only strategy, based on 3-month window
  2.  
  3. import pandas as pd
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import os
  7. from math import floor
  8.  
  9.  
  10. # Collect name of stocks on China A-Share
  11. def collect_stock_name():
  12. stock_code_list=[]
  13. for root, dirs, files in os.walk('D:/stock_data'):
  14. if files:
  15. for f in files:
  16. if 'csv' in f:
  17. stock_code_list.append(f.split('.csv')[0])
  18. return stock_code_list
  19.  
  20.  
  21. # Collect and merge data of all stocks
  22. def collect_all_data(setting_column_list):
  23.  
  24. all_data = pd.DataFrame()
  25. stock_code_list = collect_stock_name()
  26.  
  27. for code in stock_code_list:
  28. stock_data = pd.read_csv('D:/stock_data/'+code+'.csv')
  29. stock_data = stock_data[setting_column_list]
  30. stock_data['date'] = pd.to_datetime(stock_data['date'])
  31. stock_data = stock_data.set_index('date')
  32. stock_data = stock_data.resample('M',how='last')
  33. stock_data = stock_data.reset_index()
  34.  
  35. all_data = pd.concat([all_data,stock_data],axis=0)
  36. all_data.columns = (setting_column_list)
  37.  
  38. return all_data
  39.  
  40.  
  41.  
  42. # If one stock is limited up in a specific day, then 'limit_up' is "1"
  43. def limit_up(data):
  44. data.loc[data['open']>data['close'].shift(1)*1.907,'limit_up'] = 1
  45. data = data['limit_up'].fillna(0)
  46. return data
  47.  
  48.  
  49. # Get momentum portfolio
  50. def momentum_and_contrarian(index_data,stock_data,start_date, end_date, window=3):
  51. all_stock = stock_data
  52. index_data=index_data.sort_index()
  53. index_data=index_data[start_date:end_date]
  54. by_month = index_data[['close']].resample('M', how='last')
  55. by_month= by_month.reset_index()
  56. momentum_portfolio_all=pd.DataFrame()
  57. contrarian_portfolio_all=pd.DataFrame()
  58.  
  59. for i in range (window, len(by_month)-1):
  60. start_month=by_month['date'].iloc[i-window]
  61. end_month=by_month['date'].iloc[i]
  62. stock_temp=all_stock[(all_stock['date']>start_month)&(all_stock['date']<=end_month)]
  63. index_temp=index_data[start_month:end_month]
  64.  
  65. grouped=stock_temp.groupby('code')['change'].agg({'return':lambda x: (x+1).prod()-1})
  66. grouped.sort_values(by='return')
  67. num=floor(len(grouped)*0.1)
  68. momentum_code_list=grouped.index[-num:]
  69.  
  70. # construting momentum portfolio
  71. momentum=all_stock[all_stock['code'].isin(momentum_code_list)]
  72. momentum=all_stock[all_stock['date']>end_month]
  73. momentum=all_stock[all_stock['date']<=by_month['date'].iloc[i+1]]
  74.  
  75.  
  76. return momentum
  77.  
  78.  
  79.  
  80. # Load stock data
  81. setting_column_list = ['date','code','close']
  82. index_data = pd.read_csv('D:\index_data\index.csv')
  83.  
  84. all_stock_data['date']=pd.to_datetime(all_stock_data['date'])
  85. all_stock_data['change']=all_stock_data['close']/all_stock_data['close'].shift(1)-1
  86. all_stock_data=all_stock_data.fillna(0)
  87.  
  88. # Load index data
  89. index_data = pd.read_csv('D:\index_data\index.csv')
  90. index_data['date']=pd.to_datetime(index_data['date'])
  91. index_data=index_data.set_index('date')
  92.  
  93. # Get momentum portfolio
  94. start_date = pd.to_datetime('20020101')
  95. end_date = pd.to_datetime('20171231')
  96.  
  97. momentum_portfolio = momentum_and_contrarian(index_data,all_stock_data,start_date, end_date)
  98. momentum_output = momentum_portfolio.groupby('date')['change'].mean()[1:]
  99. momentum_output = momentum_output[start_date:end_date]
  100. momentum_output_capital= (momentum_output+1).cumprod()
  101. momentum_output_capital = momentum_output_capital - momentum_output_capital[0]
  102. momentum_output.to_csv('D:/momentum_return.csv')
Add Comment
Please, Sign In to add comment